컴퓨터 구조
명령어 (Instruction)
chan4
2023. 4. 23. 23:31
해당 블로그의 내용은 학교에서 배운 내용을 개인적으로 정리한 내용이므로, 잘못된 부분이 있을 수도 있습니다.
명령어 세트 (Instruction set)
- 어떤 CPU를 위하여 정의되어 있는 명령어들의 집합
- 명령어 세트 설계를 위해 결정되어야 할 사항들
- 연산 종류(operation repertoire): CPU가 수행할 연산들의 수와 종류 및 복잡도
- 데이터 형태(data type): 연산을 수행할 데이터들의 형태, 데이터의 길이(bit), 수의 표현 방식 등
- 명령어 형식(instruction format): 명령어의 길이, 오퍼랜드 필드 수와 길이 등
- 주소지정 방식(addressing mode): 오퍼랜드의 주소를 지정하는 방
연산의 종류
- 데이터 전송
- 레지스터-레지스터 / 레지스터-기억장치 / 기억장치-기억장치 간의 데이터를 이동하는 동작
- 산술 연산
- 덧셈, 뺄셈, 곱셈 및 나눗셈과 같은 기본적인 산술 연산들
- 논리 연산
- 데이터의 각 비트들 간에 대한 AND, OR, NOT 및 exclustive-OR 연산
- 입출력(I/O)
- CPU와 외부 장치들 간의 데이터 이동을 위한 동작들
- 프로그램 제어
- 명령어 실행 순서를 변경하는 연산들
- 분기(branch), 서브루틴 호출(subroutine call)
서브루틴 호출을 위한 명령어들
- CALL 명령어
- 현재의 PC 내용을 스택(stack)에 저장하고, 서브루틴의 시작 주소로 분기하는 명령어
- RET 명령어
- CPU가 원래 실행하던 프로그램으로 복귀(return) 시키는 명령어
CALL (X) 명령어
MBR <- PC; // 1 clock
MAR <- SP; // 2 clock
PC <- X;
M[MAR] <- MBR; // 3 clock
SP <- SP - 1;
- 만약 주소지정 단위가 바이트(byte)이고, 저장될 주소가 16비트(=2byte)라면, SP = SP - 2 로 변경
RET 명령어
SP <- SP + 1; // 1 clock
MAR <- SP; // 2 clock
PC <- M[MAR]; // 3 clock
명령어 형식
- 연산 코드(Operation code)
- 연간의 개수를 결정
- 오퍼랜드(Operand)
- 오퍼랜드의 종류에 따라 범위가 달라짐
- 데이터(data): 표현 가능한 수의 범위 결정
- 기억장치 주소(address): CPU가 오퍼랜드 인출을 위하여 직접 주소를 지정할 수 있는 기억장치 용량 결정
- 레지스터 번호(index): 데이터 저장에 사용될 수 있는 레지스터의 개수 결정
- 오퍼랜드의 종류에 따라 범위가 달라짐
- 다음 명령어 주소(Next instruction Address)
- 명령어 형식(instruction format)
- 명령어 내 필드들의 수와 배치 방식 및 각 필드의 비트 수
- 필드(field)
- 명령어의 각 구성 요소들에 소요되는 비트들의 그룹
- 명령어의 길이
- 단어(word) 길이
오퍼랜드 수에 따른 명령어 분류
- 1-주소 명령어(one-address instruction)
- ADD X
- 2-주소 명령어(two-address instruction)
- ADD R1, R2
- MOV R1, R2
- ADD R1, X
- 3-주소 명령어(three-address instruction)
- ADD R1, R2, R3
주소지정 방식 (Addressing mode)
- 명령어 실행에 필요한 오퍼랜드(데이터) 주소를 결정하는 방식
- 다양한 주소지정 방식을 사용하는 이유
- 제한된 수의 명령어 비트들을 이용하여, 프로그래머가 여러 가지 방법으로 오퍼랜드의 주소를 결정하도록 해줌
- 더 큰 용량의 기억 장치를 사용할 수 있게 하기 위해
- 기호
- EA(Effective Address): 데이터가 저장된 기억장치의 실제 주소
- A: 명령어 내의 주소 필드 내용 (오퍼랜드 필드의 내용이 기억장치 주소일 경우)
- R: 명령어 내의 레지스터 번호 (오퍼랜드 필드의 내용이 레지스터 번호인 경우)
- (A): 기억장치 A 번지의 내용
- (R): 레지스터 R의 내용
직접 주소지정 방식 (Direct)
- 오퍼랜드 필드의 내용이 유효 주소(EA)가 되는 방식
- $ EA = A $
- 장점
- 한 번의 기억장치 접근으로 데이터 인출 가능
- 단점
- 남은 비트들만 주소 비트로 사용될 수 있기 때문에 직접 지정할 수 있는 기억장소의 수가 제한
간접 주소지정 방식 (Indirect)
- 오퍼랜드 필드에 기억장치 주소가 저장되어 있음
- 해당 주소가 가리키는 기억 장소에 데이터의 유효 주소를 저장해두는 방식
- $ EA = (A) $
- 명령어 형식에 간접비트($I$) 필요
- $I = 0$ , 직접 주소지정 방식
- $I = 1$, 간접 주소지정 방식
- 다단계 간접 주소지정 방식
- ex. $ EA =(((A))) $
- 장점
- 최대 기억장치 용량이 단어의 길이에 의하여 결정
- 주소지정 가능한 기억장치 용량 확장
- 단어 길이가 $n$ 비트라면, 최대 $2^{n}$ 개의 기억 장소 주소지정이 가능
- 최대 기억장치 용량이 단어의 길이에 의하여 결정
- 단점
- 실행 사이클 동안에 두 번의 기억장치 엑세스가 필요
묵시적 주소지정 방식 (Implied)
- 명령어 실행에 필요한 데이터의 위치가 묵시적으로 지정되는 방식
- EX)
- SHL 명령어: 누산기의 내용을 좌측으로 쉬프트(shift)
- PUSH R1 명령어: 레지스터 R1의 내용을 스택에 저장
- 장점
- 명령어 길이가 짧다
- 단점
- 종류가 제한된다.
즉시 주소지정 방식 (Immediate)
- 데이터가 명령어에 포함되어 있는 방식
- 오퍼랜드 필드의 내용이 연산에 사용할 실제 데이터
- 프로그램에서 레지스터나 변수의 초기 값을 어떤 상수값(constant value)으로 설정하는데 사용
- 장점
- 데이터를 인출하기 위해 기억장치에 접근할 필요가 없음
- 단점
- 상수값의 크기가 오퍼랜드 필드의 비트 수에 의해 제한됨
레지스터 주소지정 방식 (Register)
- 연산에 사용될 데이터가 내부 레지스터에 저장되어 있을 경우, 명령어의 오퍼랜드가 해당 레지스터를 가리키는 방식
- $EA = R $
- 주소지정에 사용될 수 있는 레지스터들의 수 = $2^{k}$
- k = 오퍼랜드 필드의 비트 수
- 장점
- 오퍼랜드 필드의 비트 수가 적어도 된다
- 데이터 인출을 위한 기억장치 접근이 필요 없다
- 단점
- 데이터가 저장될 수 있는 공간이 CPU 내부 레지스터들로 제한
레지스터 간접 주소지정 방식 (Register-indirect)
- 오퍼랜드 필드(레지스터 번호)가 가리키는 레지스터의 내용을 유효 주소로 사용하여 실제 데이터를 인출하는 방식
- $ EA = (R) $
변위 주소지정 방식 (Displacement)
- 직접 주소지정과 레지스터 간접 주소지정 방식의 조합
- $ EA = A + (R) $
상대 주소지정 방식 (Relative addressing mode)
- 프로그램 카운터(PC)를 레지스터로 사용
- 주로 분기 명령어에서 사용
- $ EA = A + (PC) $
- 단, A 는 2의 보수
- A > 0 : 앞 방향으로 분기
- A < 0 : 뒷 방향으로 분기
- 장점
- 전체 기억장치 주소가 명령어에 포함되어야 하는 일반적인 분기 명령어보다 적은 수의 비트만 있으면 됨
- 단점
- 분기 범위가 오퍼랜드 필드의 길이에 의해 제한된다.
인덱스 주소지정 방식 (Indexed addressing mode)
- 인덱스 레지스터의 오퍼랜드와 변위 A를 더하여 유효 주소를 결정
- $EA = (IX) + A $
- 인덱스 레지스터(IX): 인덱스(index) 값을 저장한는 특수 레지스터
- 주요 용도는 배열 데이터 접근
- 자동 인덱싱(auto-indexing)
- 명령어가 실행될 때마다 인덱스 레지스터의 내용이 자동적으로 증가/감소한다
- 아래의 두 연산이 연속적으로 수행됨
- $ EA = (IX) + A $
- $ IX = IX + 1 $
베이스-레지스터 주소지정 방식 (Base-register addressing mode)
- 베이스 레지스터의 내용과 변위 A를 더하여 유효 주소 결정
- $ EA = (BR) + A $
- 주요 용도는 프로그램의 위치(변경) 지정에 사용
- 다중프로그래밍 환경에서 프로그램 코드 및 데이터를 다른 위치로 이동시켜야 할 때,
다른 주소 필드 내용을 바꿀 필요 없이 BR의 내용만 변경하면 된다
- 다중프로그래밍 환경에서 프로그램 코드 및 데이터를 다른 위치로 이동시켜야 할 때,
실제 상용 프로세서들의 명령어 형식
- PDP-10 프로세서
- 고정 길이의 명령어 형식 사용
- word = 36bit
- 명령어 길이 = 36bit
- 연산 코드 길이 = 9bit
- PDP-11 프로세서
- 다양한 길이의 명령어 형식들 사용
- 연산 코드 = 4~16bit
- 주소 개수 = 0, 1, 2 개