일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 코딩테스트
- React Native
- 광고테스트
- 애니메이션
- unity3D
- Hackerrank
- dotween
- 게임개발
- 유니티
- C#
- csvhelper
- scrollrect
- Admob
- 컴퓨터구조
- ui
- 랜덤
- UGUI
- unity
- 모션
- canvasgroup
- climbingtheleaderboard
- enum
- 유니티기초
- cs
- 전면광고
- 프로그래머스
- LINQ
- http
- 애드몹
- 열거형
- Today
- Total
Ruya Games
명령어의 구조 본문
명령어는 말그대로 컴퓨터에게 명령을 내릴때 사용되며, 연산코드와 오퍼랜드로 구성되어있습니다. 오퍼랜드(operand)는 피연산자라는 의미이고, 말그대로 피연산자의 역할을 합니다. 연산코드는 이름처럼 연산자의 역할을 하구요. 따라서 명령어는 연산자와 피연산자로 구성되어있다고 할 수 있습니다.
아래의 어셈블리어의 한줄에 담긴 내용이 하나의 명령어입니다.
mov eax,0
어셈블리어는 앞에 연산 코드를 적고 뒤에 오퍼랜드를 적는 형태입니다.
mov는 복사, 그리고 eax와 0은 오퍼랜드로, 이 어셈블리어 코드는 결과적으로는 eax 레지스터에 0값을 저장하라는 의미가 됩니다.
아래 그림처럼 구성이 되고, 연산 코드가 저장되는 영역은 연산 코드 필드, 오퍼랜드가 저장되는 영역은 오퍼랜드 필드라고 부릅니다.
오퍼랜드 필드에는 피연산자들이 들어옵니다. 숫자와 문자가 들어올 수도 있지만 피연산자들이 저장되어있는 위치를 알 수 있는 메모리 주소나 레지스터 이름을 저장하는것이 일반적입니다.
그리고 오퍼랜드가 필요하지 않은 연산자도 있을 수 있고, 많이 필요한 연산자도 있기 때문에, 오퍼랜드의 개수에 따라 각각의 명령어를
- 오퍼랜드가 하나도 없는 명령어 : 0-주소 명령어
- 오퍼랜드가 하나인 명령어 : 1-주소 명령어
- 오퍼랜드가 두개인 명령어 : 2-주소 명령어
- 오퍼랜드가 세개인 명령어 : 3-주소 명령어
이렇게 부릅니다.
명령어를 어셈블리어와 연관지어서 단순히 생각해보면 연산 코드의 종류가 굉장히 많을것이라고 예상할 수 있습니다. 이렇게 다양한 연산 코드 유형은 네가지로 일단 나눌 수 있습니다.
- 데이터 전송
- MOVE
- STORE
- PUSH
- POP
- 산술/논리 연산
- ADD/SUBTRACT/MULTIPLY/DIVIDE
- INCREMENT/DECREMENT
- AND/OR/NOT
- COMPARE
- 제어 흐름 변경
- JUMP
- CONDITIONAL JUMP
- HALT
- CALL
- RETURN
- 입출력 제어
- READ
- WRITE
- START IO
- TEST IO
이정도가 있습니다.
오퍼랜드에 연산에서 사용할 데이터를 담기보단 주소를 담는 경우가 많습니다. 그 이유는 명령어에 할당된 비트수는 정해져 있을테니, 명령어라는 구조 내에서 오퍼랜드 필드는 제한될 수 밖에 없기 때문입니다.
즉시 주소 지정 방식(immediate addressing mode)은 연산에 사용할 데이터를 오퍼랜드 필드에 바로 넣어버리는 방식입니다. 데이터의 크기에 제약이 생기지만, 주소를 담았을때의 메모리나 레지스터를 찾아가는 과정이 없기때문에 속도는 더 빠릅니다.
직접 주소 지정 방식(direct addressing mode)은 오퍼랜드 필드에 데이터의 유효 주소(연산의 대상이 되는 데이터가 저장된 위치)를 직접 입력하는 방식입니다. 즉시 주소 지정방식보다 표현의 범위는 넓어졌지만, 이 방식 역시 주소의 길이에 제약이 생기긴 합니다.
간접 주소 지정 방식(indirect addressing mode)은 유효 주소의 주소를 오퍼랜드 필드에 명시합니다. 이렇게되면 직접 주소 지정 방식보다 더 많은 범위의 유효 주소를 사용할 수 있게 됩니다. 그렇지만 메모리 접근이 2번이 필요하게 되므로(명령어에 적혀있는 유효 주소의 주소(100)값을 보고 메모리 탐색 -> 메모리의 100위치에 저장되어있는 유효 주소(105)값을 보고 105위치로 메모리 탐색) 직접 주소 지정 방식보다 속도가 느립니다.
레지스터 주소 지정 방식(register addressing mode)은 직접 주소 지정 방식과 원리는 비슷합니다. 다만 메모리 주소를 오퍼랜드 필드에 입력하는게 아닌 레지스터 주소를 입력합니다. cpu는 메모리에 접근하는것보다 레지스터에 접근하는게 더 빠르기 때문에 속도는 더 빠르지만 레지스터 크기에 따라 제한을 가집니다.
레지스터 간접 주소 지정 방식(register indirect addressing mode)은 레지스터 주소 지정 방식과 간접 주소 지정 방식을 혼용한 느낌입니다. 간접 주소 지정 방식에서는 유효주소가 적혀있는 메모리 주소를 오퍼랜드 필드에 입력하지만, 이 방식은 유효주소가 적혀있는 레지스터 주소를 입력합니다. 이렇게되면 두번의 메모리 접근중 한번을 레지스터로 대체하기 때문에 간접 주소 지정 방식보다 속도가 더 빨라지게 됩니다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
레지스터 (0) | 2024.06.01 |
---|