Central Processing Unit - Instruction Format / Addressing modes / Subroutine Call and Return / Reduced Instruction Set Computer (RISC)
Instruction Format
범용 Register 구조 및 Stack 구조에서는 명령어의 Format 이 어떻게 달라지는가?
Single Accumulator Organization
- ADD X : AC <- AC + X
General Register Organization
- 범용 Register 구조에서는 Source 와 Destination 을 전부 정의 해주어야 한다.
- ADD R1, R2, R3; R1 <- R2 + R3
- ADD R1, R2; R1 <- R1 + R2
Instruction Format for Stack Organization
- Stack 이라는 구조의 특성이 반영되어 있으므로 ADD 와 같은 명령어는 피연산자가 정의되어 있지 않아도 된다.
- PUSH X
- ADD
즉, 컴퓨터의 구조에 따라서 명령어 Format 의 요소가 정의되는 방식이 다를 수 있다.
- Three address instruction
- Two address instruction
- One address instruction
- Zero address instruction
Three address instructions 예시
X = (A + B) * (C + D)
- X = (A 와 B 의 주소를 더한 값) * (C 와 D 의 주소를 더한 값)
Three address instructions
- ADD R1, A, B ;
- R1 <- M[A] + M[B]
- ADD R2, C, D ;
- R2 <- M[C] + M[D]
- MUL X, R1, R2 ;
- M[X] <- R1 * R2
결과적으로 프로그램의 길이는 짧아지고, 프로그램을 구성하고 있는 각 명령어의 길이는 길어진다.
Two address instructions 예시
가장 일반적인 형태.
X = (A + B) * (C + D)
- X = (A 와 B 의 주소를 더한 값) * (C 와 D 의 주소를 더한 값)
- MOV R1, A
- R1 <- M[A]
- ADD R1, B
- R1 <- R1 + M[B]
- MOV R2, C
- R2 <- M[C]
- ADD R2, D
- R2 <- R2 + M[D]
- MUL R1, R2
- R1 <- R1 * R2
- MOV X, R1
- M[X] <- R1
결과적으로, 각 명령어들의 길이는 짧아지지만 프로그램의 길이는 길어진다.
One address instructions 예시
Implied accumulator register
- 명령어를 통해 명시적으로 표현하지 않지만 내재적으로 AC 에서 연산이 이루어지는 것을 가정하는 구조.
- 명령어 형식은 짧아지고, 프로그램의 길이는 길어진다.
- LOAD A
- AC <- M[A]
- ADD B
- AC <- AC + M[B]
- STORE T
- M[T] <- AC
- LOAD C
- AC <- M[C]
- ADD D
- AC <- AC + M[D]
- MUL T
- AC <- AC * M[T]
- STORE X
- M[X] <- AC
Zero address instruction 예시
Stack organized computer
- Stack 구조를 가진 Computer 인 경우.
- PUSH A
- TOS <- A
- PUSH B
- TOS <- B
- ADD
- TOS <- (A + B)
- PUSH C
- TOS <- C
- PUSH D
- TOS <- D
- ADD
- TOS <- (C + D)
- MUL
- TOS <- (C + D) * (A + B)
- POP X
- M[X] <- TOS
- X 주소에 최종 결과를 write
Addressing modes
다양한 Addressing modes 를 사용함으로서 프로그램을 효율적으로 작성할 수 있게 된다.
- Implied mode
- 실제 주소 지정없이 사용되는 mode.
- 예: ADD X
- AC <- AC + Y
- 피연산자 하나는 Accumulator 이고, Destination 역시 Accumulator 임을 내재하고 있음.
- Immediate mode
- Address field 자체가 연산의 대상이 되는 경우.
- Register mode, Register indirect mode
- Register 에 있는 값이 유효 주소가 될 때.
- Register 에 있는 값이 메모리 주소가 되어 해당 메모리 주소에 있는 값이 유효 주소가 될 때. (Indirect)
- register Indirect : 해당 Register 의 값이 EA(유효주소) 가 되어 M[해당 Register 값] 에 저장된 값이 AC 에 저장된다.
- Auto-increment / decrement mode
- Register mode 와 같으나 값이 1씩 증/ 감 하는 mode.
- Auto-increment
- Register mode 의 명령어가 수행 후 Register 에 저장된 유효주소 값이 1 증가한다.
- Auto-decrement
- Register mode 의 명령어 수행 전에 Register 에 저장된 값이 1 감소하고, 해당 값이 EA(유효주소)가 된다.
- Direct / Indirect mode
- 피연산자의 Address field 값이 직접주소가 되거나 간접주소가 되는 경우.
- Relative address mode, Indexed addressing mode, Base register address mode
- Relative address mode : 프로그램 카운터와 더하여 Address 를 지정하는 방식
- Indexed addressing mode : index address 라는 특정 address 와 더하여 address 를 지정하는 방식
Program Control Instructions
Program Control Instructions
- PC(Program Counter) 값을 변화시키는 명령어.
- Branch, Skip, Call, Return …
- 참조되는 조건 bit 를 이용하여 Program control 이 이루어짐.
- C, S, Z, V
조건 Bit
- C : Carry
- End carry 가 1인 경우 C는 1로 Set.
- S : Sign
- 산술 논리 연산의 대상이 되는 Register 의 최상위 Bit를 나타냄.
- 1이면 S는 1로 Set.
- Z : Zero
- 산술 논리 연산의 결과가 0인 경우
- 예(AC) : AC 의 모든 Bit 가 0인 경우 Z는 1로 Set.
- V : Overflow
- 최상위 2개 bit 가 서로 다르면 (Exclusive-OR) overflow 발생 가능.
- 최상위 2개 Bit XOR 시 1인 경우 V는 1로 Set.
위 조건식을 회로로서 구현하면 다음과 같다. (Status Register)
Conditional Branch Instructions
Subroutine Call and Return
Subroutine Call and Return
- 자주 사용하는 명령어에 대해서 해당 명령어로 Jump 하여 명령 수행 후 앞서 진행했던 명령어의 다음 명령어로 돌아가는 것.
- Main Program 에서 자주 사용.
- Category
- Call Subroutine
- Jump to Subroutine
- Branch to Subroutine
- Branch and Save Address
- Logic
- 한 명령어가 끝난 후 PC 값을 Jump할 Subroutine 의 시작 주소로 바꾼다.
- PC 값은 1이 증가하여 다음 명령어(Subroutine 수행 후 돌아갈 주소) 를 가지고 있으므로 해당 값(Return address)을 임시로 다른 곳에 저장해두어야 함.
- Subroutine 이 끝난 후 임시 저장소에 저장되어 있는 Return address 를 PC 에 전송하여 Jump 했던 지점으로 돌아간다.
[STACK] Subroutine Call and Return
Subroutine 을 Call 하는 방법 중 가장 효율적인 방법은 Memory Stack 에 Return Address 를 저장하는 방법이다.
- Memory Stack 은 순환적인 Subroutine 에 효율적.
- [PUSH] Subroutine Call
- SP <- SP + 1
- M[SP] <- PC
- PC <- EA
- [POP] Return from subroutine
- PC <- M[SP]
- SP <- SP - 1
예시
%esp : Stack Pointer (SP) %eip : Program Counter (PC)
- [Subroutine CALL]
- 804854e 번지의 명령어는 e8 3d 06 00 00
- 해당 명령어는 8048b90 번지(Subroutine)를 call 하는 명령어.
- 현재 PC 값은 804854e (현재 실행 할 명령어의 주소값)
- 다음 명령어는 8048553 번지이고, 이는 Return Address 가 된다.
- 따라서 Stack 에 Return address 인 8048553 번지를 Push.
- Stack Pointer 는 하나 증가 (현 예에서는 감소)
- PC 에 Subroutine 시작 주소인 8048b90 값을 넣어 Call.
- [Subroutine 수행 후 Return]
- Subroutine 수행 종료 후 Return 명령 실행.
- 현재 PC 값은 Return 명령어의 주소인 8048591.
- Stack Pointer (%esp) 와 Stack 의 구조는 Subroutine 시작 시점과 동일.
- Stack Pointer 가 가리키고 있는 주소가 Return Address 이므로 POP.
- SP 가 가리키고 있는 Stack 의 104 번지 값인 8048553 이 POP 되어 PC(%eip) 에 저장되고 SP(%esp) 는 하나 증가. (현 예에서는 감소 = 108)
Program Interrupt
Program Interrupt 와 Subroutine Call 의 차이점
- Subroutine Call 은 Program 수행 중 Program 내부에서 특정 Subroutine 으로 점프하여 수행 후 Return.
- Interrupt 는 Subroutine Call 이 Program 의 외부에서 Trigger 됨.
- I/O Device 에 의해 Program 외부에서 Subroutine Call 이 발생함.
Program State Word, PSW
- 마찬가지로 Subroutine 수행 후 돌아올 곳이 존재해야 하므로 State Word 가 존재.
- CPU 의 모든 조건 Bit (C-carry, S-sign, Z-zero, V-overflow) 상태의 집합.
Types of Interrupts
- External Interrupt
- I/O, Timing, Circuit Monitoring Power Supply 등의 장치에 의해 발생
- Internal Interrupt (traps)
- Invalid opeartions, Register overflow, Division by zero 등에 의해 발생
- Software Interrupt
- Supervisor Call 에 의해 발생
Reduced Instruction Set Computer (RISC)
RISC 구조의 컴퓨터는 CISC 구조와 대비하여 설명된다.
CISC vs RISC
- CISC(Complex Instruction Set Computer)
- 말 그대로 복잡한 구조의 명령어를 가진 컴퓨터.
- 명령어의 종류가 많음.
- 다양한 Addressing mode 를 지원.
- 명령어의 길이 조정이 가능.
- Memory 에서 직접 Data 의 처리가 가능함.
- 하나의 명령어에서 메모리 접근 및 적절한 처리가 가능.
- 한 명령어에 많은 Microoperation 이 포함되어 많은 작업을 처리할 수 있다.
- RISC (Reduced Instruction Set Computer)
- 단순한 구조의 명령어를 가진 컴퓨터.
- 상대적으로 ~
- 적은 종류의 명령어.
- 적은 종류의 Addressing mode 를 지원.
- 명령어의 길이는 고정.
- 하나의 명령어는 한 Clock 에 수행됨.
- 처리의 속도를 빠르게 하는 명령어 Set 을 가짐.
- Load 및 Store 명령어에 한해 메모리 접근가능.
- Register 내부에서 모든 처리를 진행.
- 상대적으로 많은 수의 Register 를 가지고 있음.
- 중첩된 Register Window 를 가짐.
[RISC] - Overlapped Register Windows
중첩된 Register Window
- 한 Procedure 수행 중 다른 Procedure 를 수행하고자 할 때 (Subroutine call) 각각의 Procedure 가 사용할 수 있는 Register 들의 영역이 할당됨.
- 이때, 여러 Procedure 가 공통으로 사용할 수 있는 영역이 존재. (Global 영역)
- (a) Procedure 를 진행 할 때에는 R_8 ~ R_31 까지의 Register 에 접근할 수 있다.
- Register (In)
- 이전 Procedure 와 현재 Procedure (a) 가 공유 할 수 있는 Register.
- Register (Locals)
- 현재 Procedure 인 (a) 만 접근할 수 있는 Register.
- Register (Out)
- 현재 Procedure 인 (a) 가 다음 Procedure (b) 을 Call 할 때 b 와 공유할 수 있는 Register.
- CWP (Current Window Pointer)
- 해당 포인터로 Procedure 마다 사용 가능한 Register 의 범위를 지정.
[RISC] - Overlapped Register Window 예시
Global register (공용 Register)
- R0 ~ R9
Procedure A 에게 할당된 Register
- In: R10 ~ R15
- Local: R16 ~ R25
- Out: R26 ~ R31
Window Size
- 하나의 Procedure 가 접근할 수 있는 Register 의 개수.
- Window Size = L(Local) + 2C(Common, In/Out) + G(Global)
- 10(G) + 10(L) + 2 * 6(Common) = 32
Register File
- 전체 Register 의 개수.
- Register File = (L + C)W + G
- 윈도우(W) 의 개수만큼 Local 과 Common 이 존재함 + G(Global)
- 10(G) + 4(W) * (10(L) + 6(Common)) = 74
[RISC] - Berkeley RISC 1
RISC System 의 초기 모델.
- 총 32 Bit CPU 를 가짐.
- 13 번째 Bit 값에 따라 Register / Register Immediate mode 구분
- 31 개의 명령어
- W: 8, G: 10, L: 10, C: 6
- 8개의 Window
- 10개의 Global Register, Local Register
- 6개의 Common Register
- Register File: 138
- (10(L) + 6(C)) * 8(W) + 10(G)
- Window Size = 32
- 한 Procedure 에서 접근할 수 있는 Window 의 수 = 32 개
- 따라서 각 Register 는 5 bit 가 할당됨.
Register mode 인 경우 (Bit(13) = 0)
- Opcode: 8 Bits (31 ~ 24)
- Rd, Rs (destination, source): 5 Bits (23 ~ 19, 18 ~ 14)
- S2: 5 Bits (4 ~ 0)
- S2 로서 또다른 Register 를 지정할 수 있다.
Register immediate mode 인 경우 (Bit(13) = 1)
- S2: 13bit (0 ~ 12)
- S2 에 저장된 값을 Immediate 값으로서 사용하게 됨.
PC relative mode
- Opcode: 8 Bit (31 ~ 24)
- COND: 5 Bit (23 ~ 19)
- Opcode 와 COND 는 조건으로서 사용됨.
- Y: 19 Bit (18 ~ 0)
- 상대적인 주소값을 정의
[Berkeley RISC 1] - 31 개의 명령어 및 예시
ADD
- ADD R22, R21, R23 : R23 <- R22 + R21
- 앞의 두 Register 가 Source, 마지막 Regiater 가 Destination 이 된다.
- ADD R22, #150, R23 : R23 <- R22 + 150
- 위와 같이 연산에 #150 이라는 Immediate 값을 사용할 수 있다.
LDL
- LDL (R22) #150, R5 : R5 <- M[R22 + 150]
- R22 에 있는 Register 값(주소)에 150 을 더한 주소에 있는 값을 R5에 저장.
- 상대 주소의 개념을 사용함으로서 더 많은 Bit 의 번지를 접근할 수 있게 된다.
지식 공유 및 기록을 위한 컴퓨터 구조 개인 학습 포스트입니다. 피드백은 항상 환영합니다! 긴 글 읽어주셔서 감사합니다.
Task Lists
- Instruction Format
- Three address instructions 예시
- Two address instructions 예시
- One address instructions 예시
- Zero address instruction 예시
- Addressing modes
- Program Control Instructions
- 조건 Bit
- Conditional Branch Instructions
- Subroutine Call and Return
- [STACK] Subroutine Call and Return
- Program Interrupt
- Reduced Instruction Set Computer (RISC)
- [RISC] - Overlapped Register Windows
- [RISC] - Overlapped Register Window 예시
- [RISC] - Berkeley RISC 1
- [Berkeley RISC 1] - 31 개의 명령어 및 예시
Comments