2024. 4. 21. 18:20ㆍ카테고리 없음
목차
< 2.4 명령어 세트 > 78-120
< 2.4 명령어 세트(instruction set) >
- 어떤 CPU를 위하여 정의되어 있는 명령어들의 집합
- 명령어 세트 설계를 위해 결정되어야 할 사항들
> 연산 종류(operation repertoire)
: CPU가 수행할 연산들의 수와 종류 및 복잡도
> 데이터 형태(data type)
: 연산을 수행할 데이터들의 형태, 데이터의 길이(비트 수), 수의 표현 방식 등
> 명령어 형식(instruction format)
: 명령어의 길이, 오퍼랜드 필드의 수와 길이 등
> 주소지정 방식(addressing mode)
: 오퍼랜드의 주소를 지정하는 방식
< 2.4.1 연산의 종류 >
1. 연산의 종류
- 데이터 전송
> 레지스터와 레지스터 간, 레지스터와 기억장치 간, 혹은 기억장치와 기억장치 간에 데이터를 이동하는 동작
- 산술 연산
> 덧셈, 뺄셈, 곱셈 및 나눗셈과 같은 기본적인 산술 연산들
- 논리 연산
> 데이터의 각 비트들 간에 대한 AND, OR, NOT 및 XOR 연산
- 입출력(I/O)
> CPU와 외부 장치들 간의 데이터 이동을 위한 동작들
- 프로그램 제어
> 명령어 실행 순서를 변경하는 연산들
> 분기(branch), 서브루틴 호출(subroutine call)
~> 핵심: 현재 내용을 Stack에 저장하여, 역순으로 내보낸다.
2. 서브루틴 호출을 위한 명령어들
- CALL 명령어
> 현재의 PC 내용을 스택에 저장하고 서브루틴의 시작 주소로 분기하는 명령어
- RET 명령어
> CPU가 원래 실행하던 프로그램으로 복귀(return)시키는 명령어
3. 서브루틴이 포함된 프로그램이 수행되는 순서

4. CALL / RET 명령어의 마이크로 연산
- CALL X 명령어에 대한 마이크로 연산
| t0: MBR <- PC t1: MAR <- SP, PC <- X t2: M[MAR] <- MBR, SP <- SP - 1 |
> 현재의 PC 내용(서브루틴 수행 완료 후에 복귀할 주소)를 SP가 지정하는 스택의 최상위(TOS, Top Of Stack)에 저장
> 만약 주소지정 단위가 바이트이고 저장될 주소는 16비트라면, SP <- SP - 2로 변경
- RET 명령어의 마이크로 연산
| t0: SP <- SP + 1 t1: MAR <- SP t2: PC <- M[MAR] |
5. 그림의 프로그램 수행 과정에서 스택의 변화

< 2.4.2 명령어 형식 >
1. 명령어의 구성요소들
- 연산 코드(Operation Code)
> 수행될 연산을 지정(ex. LOAD, ADD 등)
- 오퍼랜드(Operand)
> 연산을 수행하는 데 필요한 데이터 혹은 데이터의 주소
> 각 연산은 한 개 혹은 두 개의 입력 오퍼랜드들과 한 개의 결과 오퍼랜드를 포함
> 데이터는 CPU 레지스터, 주기억장치, 혹은 I/O 장치에 위치
- 다음 명령어 주소(Next Instruction Address)
> 현재의 명령어 실행이 완료된 후에 다음 명령어를 인출한 위치 지정
> 분기 혹은 호출 명령어와 같이 실행 순서를 변경하는 경우에 필요
* 대부분은 없다
2. 명령어 형식
- 명령어 형식(instruction format)
> 명령어 내 필드들의 수와 배치 방식 및 각 필드의 비트 수
- 필드(field)
> 명령어의 각 구성 요소들에 소요되는 비트들의 그룹
- 명령어의 길이 = 단어(word) 길이
- [예] 세 개의 필드들로 구성된 16-비트 명령어

3. 명령어 형식의 결정에서 고려할 사항들
- 연산 코드 필드 길이: 연산의 개수를 결정
> [예] 4비트 ~> 2의 4승 = 16가지의 연산 정의 가능
> 만약 연산 코드 필드가 5비트로 늘어나면, 2의5승=32가지 연산들 정의 가능
~> 다른 필드의 길이가 감소
- 오퍼랜드 필드의 길이: 오퍼랜드의 범위 결정
> 오퍼랜드의 종류에 따라 범위가 달라짐
~> 데이터: 표현 가능한 수의 범위 결정
~> 기억장치 주소: CPU가 오퍼랜드 인출을 위하여 직접 주소를 지정할 수 있는 기억장치 용량 결정
~> 레지스터 번호: 데이터 저장에 사용될 수 있는 레지스터의 개수 결정
4. 오퍼랜드 필드 범위의 예
- 오퍼랜드1은 레지스터 번호를 지정하고, 오퍼랜드2는 기억장치 주소를 지정하는 경우
> 오퍼랜드1: 4비트 ~> 16개의 레지스터 사용 가능
> 오퍼랜드2: 8비트 ~> 기억장치의 주소 범위: 0~255번지
- 두 개의 오퍼랜드들을 하나로 통합하여 사용하는 경우
> 오퍼랜드가 2의 보수로 표현되는 데이터라면,
~> 표현 범위: -( 2^12 ) ~ +( 2^12 - 1 )
> 오퍼랜드가 기억장치 주소라면,
~> 2^12 = 4096개의 기억장치 주소들 지정 가능
5. 오퍼랜드의 수에 따른 명령어 분류
- 1-주소 명령어(one-address instruction)
> 오퍼랜드를 한 개만 포함하는 명령어. (다른 한 오퍼랜드는 묵시적으로 AC가 됨)
> [예] ADD X ; AC <- AC + M[X]
- 2-주소 명령어(two-address instruction)
> 오퍼랜드 두 개를 포함하는 명령어
> [예]
ADD R1, R2 ; R1 <- R1 + R2
MOV R1, R2 ; R1 <- R2
ADD R1, X ; R1 <- R1 + M[X]
- 3-주소 명령어(three-address instruction)
> 오퍼랜드 세 개를 포함하는 명령어.(직관적이다)
> [예]
ADD R1, R2, R3 ; R1 <- R2 + R3
6. 1-주소 명령어의 예
- 길이가 16비트인 1-주소 명령어에서 연산 코드가 5비트인 경우의 명령어 형식을 정의하고, 주소지정 가능한 기억장치 용량을 결정하라
>명령어 형식

> 주소지정 가능한 기억장치 용량: 2^11 = 2048바이트
7. 2-주소 명령어의 예
- 2-주소 명령어 형식을 사용하는 16-비트 CPU에서 연산 코드가 5비트이고, 레지스터의 수는 8개이다.
(a) 두 오퍼랜드들이 모두 레지스터 번호인 경우와, (b) 한 오퍼랜드는 기억장치 주소인 경우의 명령어 형식을 정의하라.


8. 3-주소 명령어 형식의 예

9. 명령어 형식이 프로그래밍에 미치는 영향(예)
[예] X = (A + B) x (C - D) 계산을 위한 어셈블리 프로그램 작성
- 아래와 같은 니모닉을 가진 명령어들 사용
ADD 덧셈
SUB 뺄셈
MUL 곱셈
DIV 나눗셈
MOV 데이터 이동
LOAD 기억장치로부터 데이터 적재
STOR 기억장치로 데이터 저장
10. 1-주소 명령어를 사용한 프로그램
~~~ X = (A + B) x (C - D) ~~~
LOAD A ; AC <- M[A]
ADD B ; AC <- AC + M[B]
STOR T ; M[T] <- AC
LOAD C ; AC <- M[C]
SUB D ; AC <- AC - M[D]
MUL T ; AC <- AC x M[T]
STOR X ; M[X] <- AC
* 단, M[A]는 기억장치 A번지의 내용, T는 기억장치 내 임시 저장장소의 주소
> 프로그램의 길이 = 7
11. 2-주소 명령어를 사용한 프로그램
~~~ X = (A + B) x (C - D) ~~~
MOV R1, A ; R1 <- M[A]
ADD R1, B ; R1 <- R1 + M[B]
MOV R2, C ; R2 <- M[C]
SUB R2, D ; R2 <- R2 - M[D]
MUL R1, R2 ; R1 <- R1 x R2
MOV X, R1 ; M[X] <- R1
> 프로그램의 길이 = 6
12. 3-주소 명령어를 사용한 프로그램
~~~ X = (A + B) x (C - D) ~~~
ADD R1, A, B ; R1 <- M[A] + M[B]
SUB R2, C, D ; R2 <- M[C] - M[D]
MUL X, R1, R2 ; M[X] <- R1 x R2
> 프로그램의 길이 = 3
> 단점
~> 명령어의 길이가 증가한다
~> 명령어 해독 과정이 복잡해지고, 실행 시간이 길어진다.
< 2.4.3 주소지정 방식(addressing mode) >
1. 주소지정 방식
- 명령어 실행에 필요한 오퍼랜드의 주소를 결정하는 방식
- 다양한 주소지정 방식을 사용하는 이유:
> 제한된 수의 명령어 비트들을 이용하여, 프로그래머가 여러 가지 방법으로 오퍼랜드의 주소를 결정하도록 해주며, 더 큰 용량의 기억장치를 사용할 수 있도록 하기 위함
- 명령어 내 오퍼랜드 필드의 내용
> 기억장치 주소: 데이터가 저장된 기억장치의 위치를 지정
> 레지스터 번호: 데이터가 저장된 레지스터를 지정
> 데이터: 명령어의 오퍼랜드 필드에 데이터가 포함
2. 기호
- EA
> 유효 주소(Effective Address), 데이터가 저장된 기억장치의 실제 주소
- A
> 명령어 내의 주소 필드 내용(오퍼랜드 필드의 내용이 기억장치 주소인 경우)
- R
> 명령어 내의 레지스터 번호(오퍼랜드 필드의 내용이 레지스터 번호인 경우)
- (A)
> 기억장치 A번지의 내용
- (R)
> 레지스터 R의 내용
3. 주소지정 방식의 종류
- 직접 주소지정 방식(direct addressing mode)
- 간접 주소지정 방식(indirect addressing mode)
- 묵시적 주소지정 방식(implied addressing mode)
- 즉시 주소지정 방식(immediate addressing mode)
- 레지스터 주소지정 방식(register addressing mode)
- 레지스터 간접 주소지정 방식(register-indirect addressing mode)
- 변위 주소지정 방식(displacement addressing mode)
> 상대 주소지정 방식(relative addressing mode)
> 인덱스 주소지정 방식(indexed addressing mode)
> 베이스-레지스터 주소지정 방식(base-register addressing mode)
4. 직접 주소지정 방식(direct addressing mode)
- 오퍼랜드 필드의 내용이 유효 주소(EA)가 되는 방식
EA = A
- 장점: 데이터 인출을 위하여 한 번의 기억장치 액세스만 필요
- 단점: 연산 코드를 제외하고 남은 비트들만 주소 비트로 사용될 수 있기 때문에 직접 지정할 수 있는 기억장소의 수 제한



5. 간접 주소지정 방식(indirect addressing mode)
- 오퍼랜드 필드에 기억장치 주소가 저장되어 있지만, 그 주소가 가리키는 기억 장소에 데이터의 유효 주소를 저장해두는 방식
EA = (A)


- 장점: 최대 기억장치 용량이 단어의 길이에 의하여 결정 ~> 주소지정 가능한 기억장치 용량 확장
> 단어 길이가 n비트라면, 최대 2^n개의 기억장소에 대한 주소 지정 가능
- 단점: 실행 사이클 동안에 두 번의 기억장치 액세스 필요
> 첫 번째 액세스: 주소 인출
> 두 번째 액세스: 그 주소가 지정하는 기억 장소로부터 실제 데이터 인출
- 명령어 형식에 간접비트(I) 필요
> 만약 I= 0이면, 직접 주소지정 방식
> 만약 I = 1이면, 간접 주소지정 방식 ~> 간접 사이클 실행
(그림)
- 다단계(multi-level) 간접 주소지정 방식
> EA = ( (..(A)..) )


6. 묵시적 주소지정 방식(implied addressing mode)
- 명령어 실행에 필요한 데이터의 위치가 묵시적으로 지정되는 방식
[ 예 ]
> 'SHL' 명령어: 누산기의 내용을 좌측으로 시프트(shift)
> 'PUSH R1' 명령어: 레지스터 R1의 내용을 스택에 저장
* SP가 가리키는 기억 장소에 R1의 내용을 저장한다는 것이 묵시적으로 정해져 있음
- 장점: 명령어 길이가 짧다
- 단점: 종류가 제한된다(생략 가능 명령어가 제한적, why? 보고 이해할 수 있어야 하므로)
7. 즉시 주소지정 방식(immediate addressing mode)
.....직접과 혼동 주의. 데이터가 직접적으로 있다 YES, NOT 주소.
- 데이터가 명령어에 포함되어 있는 방식. 즉, 오퍼랜드 필드의 내용이 연산에 사용할 실제 데이터
- 용도: 프로그램에서 레지스터나 변수의 초기 값을 어떤 상수값(constant value)으로 세트하는데 사용
- 장점: 데이터를 인출하기 위하여 기억장치를 액세스할 필요가 없음
- 단점: 상수값의 크기가 오퍼랜드 필드의 비트 수에 의해 제한됨

8. 레지스터 주소지정 방식
- 연산에 사용될 데이터가 내부 레지스터에 저장되어 있는 경우로서, 명령어의 오퍼랜드가 해당 레지스터를 가리키는 방식
EA = R
- 레지스터 길이 = 단어 길이(이거 맞나 녹음본 다시 들어보기)
- 주소지정에 사용될 수 있는 레지스터들의 수 = 2^k개
* 단, k는 R 필드의 비트 수

- 장점
> 오퍼랜드 필드의 비트 수가 적어도 된다
> 데이터 인출을 위하여 기억장치 액세스가 필요 없다
- 단점
> 데이터가 저장될 수 있는 공간이 CPU 내부 레지스터들로 제한
9. 레지스터 간접 주소지정 방식
- 오퍼랜드 필드(레지스터 번호)가 가리키는 레지스터의 내용을 유효 주소로 사용하여 실제 데이터를 인출하는 방식
EA = (R)
- 장점: 주소지정할 수 있는 기억장치 영역이 확장
> 레지스터의 길이: 16비트 ~> 주소지정 영역: 2^16 = 64Kword
> 레지스터의 길이: 32비트 ~> 주소지정 영역: 2^32 = 4 Gword

시험 출제 가능


10. 변위 주소지정 방식(displacement addressing mode)
- 직접 주소지정과 레지스터 간접 주소지정 방식의 조합
EA = A + (R)
- 사용되는 레지스터에 따라 다양한 변위 주소지정 방식 가능
> PC: 상대 주소지정 방식(relative addressing mode)
> 인덱스 레지스터: 인덱스 주소지정 방식(indexed addressing mode)
> 베이스 레지스터: 베이스-레지스터 주소지정 방식(base-register addressing mode)
11. 상대 주소지정 방식(relative addressing mode)
- 프로그램 카운터(PC)를 레지스터로 사용하여 EA를 계산
EA = A + (PC) 단, A는 2의 보수
- 주로 분기 명령어에서 사용
> A > 0: 앞 방향으로 분기
> A < 0: 뒷 방향으로 분기

- 장점
> 전체 기억장치 주소가 명령어에 포함되어야 하는 일반적인 분기 명령어보다 적은 수의 비트만 필요
- 단점
> 분기 범위가 오퍼랜드 필드의 길이에 의해 제한(오퍼랜드 비트들로 표현 가능한 2의 보수 범위)


12. 인덱스 주소지정 방식(index addressing mode)
- 인덱스 레지스터의 내용과 변위 A를 더하여 유효 주소를 결정

EA = (IX) + A
> 인덱스 레지스터(ix): 인덱스(index) 값을 저장하는 특수-목적 레지스터
- 주요 용도: 배열 데이터 액세스
- 자동 인덱싱(auto-indexing)
> 명령어가 실행될 때마다 인덱스 레지스터의 내용이 자동적으로 증가 혹은 감소
> 이 방식이 사용된 명령어가 실행되면 아래의 두 연산이 연속적으로 수행됨
EA = (IX) + A
IX <- IX + 1


13. 베이스-레지스터 주소지정 방식
- 베이스 레지스터의 내용과 변위 A를 더하여 유효 주소를 결정
EA = (BR) + A
- 주요 용도: 프로그램의 위치 지정(혹은 변경)에 사용
[예] 다중프로그래밍(multiprogramming) 환경에서 프로그램 코드 및 데이터를 다른 위치로 이동시켜야 할 때, 분기 명령어나 데이터 액세스 명령어들의 주소 필드 내용을 바꿀 필요 없이, BR 레지스터의 내용만 변경하면 된다.
< 2.4.4 실제 상용 프로세서들의 명령어 형식 >
1. CISC(Complex Instruction Set Computer) 프로세서
- 명령어들의 수가 많음(회로 복잡)
- 명령어 길이가 일정하지 않음(명령어 종류에 따라 달라짐)
- 주소지정 방식이 매우 다양함 ~> 명령어 실행 시간이 길다
- [예] PDP 계열 프로세서, Intel 펜티엄 계열 프로세서
> 3주소 명령어 多
> 임베디드 기능들 내장 computer <-> 범용 computer
> 명령어 체계 간단 -> 복잡한 주소 단순화 가능
2. RISC(Reduced Instruction Set Computer) 프로세서
- 명령어들의 수를 최소화
- 명령어 길이를 일정하게 고정
- 주소지정 방식의 종류를 단순화
- [예] ATmega microcontroller, ARM 계약 프로세서
> 1주소 명령어 多
3. PDP-10 프로세서: 고정 길이의 명령어 형식 사용(CISC)
- 단어의 길이 = 36비트, 명령어의 길이 = 36비트
- 연산 코드 = 9비트 ~> 최대 512 종류의 연산 허용 (실제 365개)

4. PDP-11 프로세서: 다양한 길이의 명령어 형식들 사용(CISC)
- 연산코드 = 4~16비트(가변적)
- 주소 개수: 0,1,2개
- 주소지정 방식이 Op code에 따라 변한다
5. 펜티엄 계열 프로세서의 명령어 형식(CISC)
- 선형 주소(LA, Linear Address): 프로세서가 발생하는 주소 = EA + 세그먼트의 시작 주소
* 각 세그먼트의 시작 주소는 해당 (Segment Register)에 저장

- 즉시 방식(immediate mode): 데이터가 명령어에 포함되는 방식
> 데이터의 길이 = 바이트, 단어(word) 혹은 2중단어(double word)
- 레지스터 방식(register mode): 유효 주소(EA)가 레지스터에 들어 있는 방식
- 변위 방식(displacement mode): 명령어에 포함된 변위(주소)가 유효주소로 사용되는 방식으로서, 직접 주소지정 방식에 해당
- 베이스 방식(base mode): 레지스터 간접 주소지정에 해당
- 상대 방식(relative mode): 변위값과 PC의 값을 더하여 다음 명령어의 주소로 사용하는 방식
> PC는 지금 실행하는 명령어+1을 해야한다.
6. 펜티엄 계열 명령어 형식의 필드들
- 연산코드(op code): 연산의 종류 지정. 길이 = 1 or 2 바이트
- MOD/RM: 주소지정 방식 지정
- SIB: MOD/RM 필드와 결합하여 주소지정 방식을 완성
- 변위(displacement): 부호화된 정수(변위)
- 즉시(immediate): 즉시 데이터

7. ATmega microcontroller의 명령어 형식(RISC)
- ATmega128 microcontroller의 CPU 코어
> 8-비트 CPU
> 대부분 명령어들의 길이: 16비트
> 기억장치 액세스 명령어들(LOAD, STORE): 32비트
> 내부 레지스터: 32개
> 특징
~> 연산코드의 비트 수가 명령어에 따라 달라짐
~> 오퍼랜드의 위치가 유동적
8. ARM(Advanced RISC Machine) 계역 프로세서
- 32-비트 RISC 프로세서
- 개방형 아케텍처(Open Architecture)
- 모바일 시스템용 프로세서로 널리 사용
- 명령어 필드들
> 분기조건 필드, 연산 필드, 오퍼랜드 필드 등
> 조건 플래그: N, Z, C, V
> 레지스터 필드: Rn, Rd, Rs
> P, U, W 비트: 주소지정 방식 결정
> B비트: 연산처리 단위 결정(바이트(B=1) 혹은 단어(B=0))
(그림 생략)
*Thumb 명령어
: 컴파일 과정에서 원래의 32-비트 명령어들을 분석하여 새로운 패턴의 16-비트 명령어 형식으로 축소
~> 프로그램 기억장치 용량 감소(각종 임베디드 시스템에서 널리 사용)
YOU the BEST !!


