[Computer Architecture] Ch.2 CPU의 구조와 기능(3)

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비트인 경우의 명령어 형식을 정의하고, 주소지정 가능한 기억장치 용량을 결정하라

>명령어 형식

1-주소 명령어의 예

> 주소지정 가능한 기억장치 용량: 2^11 = 2048바이트

 

7. 2-주소 명령어의 예

- 2-주소 명령어 형식을 사용하는 16-비트 CPU에서 연산 코드가 5비트이고, 레지스터의 수는 8개이다.

(a) 두 오퍼랜드들이 모두 레지스터 번호인 경우와, (b) 한 오퍼랜드는 기억장치 주소인 경우의 명령어 형식을 정의하라.

2-주소 명령어의 예

 

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

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

- 장점: 데이터 인출을 위하여 한 번의 기억장치 액세스만 필요

- 단점: 연산 코드를 제외하고 남은 비트들만 주소 비트로 사용될 수 있기 때문에 직접 지정할 수 있는 기억장소의 수 제한

직접 주소지정 방식의 그림
예제 2-6, 직접 주소지정 방식의 문제
예제 2-6 직접 주소지정 방식의 풀이

 

5. 간접 주소지정 방식(indirect addressing mode)

- 오퍼랜드 필드에 기억장치 주소가 저장되어 있지만, 그 주소가 가리키는 기억 장소에 데이터의 유효 주소를 저장해두는 방식

EA = (A)

간접 주소지정 방식의 그림
간접 주소지정 방식의 명령어 필드

- 장점: 최대 기억장치 용량이 단어의 길이에 의하여 결정 ~> 주소지정 가능한 기억장치 용량 확장

> 단어 길이가 n비트라면, 최대 2^n개의 기억장소에 대한 주소 지정 가능

- 단점: 실행 사이클 동안에 두 번의 기억장치 액세스 필요

> 첫 번째 액세스: 주소 인출

> 두 번째 액세스: 그 주소가 지정하는 기억 장소로부터 실제 데이터 인출

- 명령어 형식에 간접비트(I) 필요

> 만약 I= 0이면, 직접 주소지정 방식

> 만약 I = 1이면, 간접 주소지정 방식 ~> 간접 사이클 실행

(그림)

- 다단계(multi-level) 간접 주소지정 방식

> EA = ( (..(A)..) )

예제 2-7 간접 주소지정 방식의 문제
예제 2-7, 간접 주소지정 방식의 풀이

 

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

레지스터 간접 주소지정 방식의 그림

시험 출제 가능

예제 2-9, 레지스터 주소방식과 레지스터 간접 주소방식의 문제

예제 2-9, 레지스터 주소방식과 레지스터 간접 주소방식의 풀이

 

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의 보수 범위)

예제 2-10, 상대 주소지정 방식의 문제
예제 2-10, 상대 주소지정 방식의 풀이

 

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개)

PDP-10 프로세서의 그림

 

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 !!