ToyCOM은 생능출판사에서 개발한 간단한 중앙처리장치이다.
- ToyCOM은 8비트의 데이터를 처리한다. 이를 위하여 8개의 8비트 범용 레지스터(R0~R7)를 가지고 있으며, 8비트의 데이트를 처리할 수 있는 연산기와 8비트의 상태 레지스터를 갖고 있다.
- 기억장치는 바이트 단위로 구성되어 있고 용량은 64KB이다. 따라서 주소 레지스터인 프로그램 카운터(PC)와 스택 포인터(SP)는 16비트이다.
- 기억장치를 액세스하기 위하여 16비트의 주소 레지스터(MAR)와 8비트의 버퍼 레지스터(MBR)을 운영한다.
- 명령어의 길이는 모두 16비트이다. 따라서 명령어 레지스터(IR)는 16비트이다.
프로그래머가 어셈블리 언어로 프로그램을 작성할 때 알고 있어야 할 수준으로 컴퓨터 구조를 표현한 것을 프로그래머 모델이라고 한다.
0000h~7FFFh : 프로그램 영역이고 명령어와 데이터를 저장한다. 시스템 리셋 신호에 의하여 프로그램 카운터(PC)의 값은 0으로 초기화된다. 즉, 리셋 후 0번지의 명령어부터 시작한다.
8000h~BFFFh : 입출력 장치를 연결하기 위한 공간이다. 입출력 장치를 기억창치 맵 방식으로 연결한다. 입출력 장치를 구동하기 위하여 기억장치 적재와 저장 명령어를 사용한다. 별도의 입력(input)과 출력(output) 명령어를 제공할 필요가 없다.
C000h~FFFFh : 시스템 스택 영역이다. 시스템 리셋 신호에 의하여 스택 포인터(SP)의 값은 0000h로 초기화된다. PUSH명령어에 의하여 스택 포인터(SP)의 값이 감소한다.
내부 버스(internal bus) : 중앙처리 장치 내부에서 레지스터간 데이터를 전송한다. 레지스터들 중 일부는 16비트이고, 나머지는 8비트이므로, 내부 버스의 폭은 16비트이다. 이것을 8비트씩 나누어 상위 8비트(15:8)는 HBus(High Bus), 하위 8비트(7:0)는 LBus(Low Bus)라고 이름을 붙인다. 내부 버스는 한 순간에 한 개의 데이터 전송만 허용한다. 즉 레지스터 간에 데이터를 전송할 때, 데이터를 전송하는 레지스터가 내부 버스에 데이터를 출력하고, 데이터를 수신하는 레지스터는 내부버스에 실린 데이터를 적재한다.
연산 버스(ALU bus) : 연산기는 Hbus와 LBus에 실린 데이터를 연산한다. 연산 버스는 연산기의 출력을 전달하는 버스이다. 연산 결과는 범용 레지스터(R7:R0) 중 하나로 적재될 수 있으며, 연산 상태는 상태 레지스터(SR)의 플래그에 저장된다.
외부 버스(external bus) : 중앙처리장치와 외부를 연결한다. 기억장치를 연결하는 주소버스, 데이터 버스, 그리고 제어 버스로 구분되어 있다. 주소레지스터(MAR)는 16버스인 주소 버스를 구동하고, 버퍼레지스터(MBR)는 8비트인 데이터 버스에 연결되어 있다.
16비트 프로그램 카운터(PC) : 다음에 실행할 명령어의 주소를 저장한다. 기억장치 주소를 저장하고 있어야 하기 때문에 길이는 16비트이다. 8비트씩 액세스할 수 있도록 PCH(PC High byte)와 PCL(PC Low byte) 두 개의 8비트 레지스터로 나뉘어져 있다. 프로그램 카운터의 초깃값은 0000h이다
16비트 스택 포인터(SP) : 스택의 탑(top)을 가리킨다. 기억장치 주소를 저장하고 있어야 하기 때문에, 길이는 16비트이다. 스택 포인터의 리셋 후 초깃값은 0000h이다.
16비트 명령어 레지스터(IR) : ToyCOM의 모든 명령어는 크기가 16비트이다. 따라서 명령어 레지스터의 크기도 16비트이다. 이것도 8비트씩 액세스할 수 있도록 IRH(IR High byte)와 IRL(IR Low byte) 두 개의 8비트 레지스터로 나뉘어져 있다.
8개의 범용 레지스터(R7:R0) : 데이터 처리 명령어가 처리할 데이터를 저장한다. 이 중에서, 두 바이트에 정렬된 레지스터 쌍은 16비트 주소를 저장하기 위하여 사용될 수 있다. 즉, R1:R0, R3:R2, R5:R4, R7:R6는 16비트 주소를 저장하는 용도로 사용될 수 있다. 레지스터 간접 주소지정방식으로 기억장치를 액세스하거나 16비트 레지스터와 범용 레지스터 간에 데이터를 전송할 때, 레지스터 쌍을 이용한다.
16비트 기억장치 주소 레지스터(MAR) : 프로그래머가 직접 사용할 수 없다. 중앙처리장치가 기억장치를 액세스할 때 기억장치의 주소를 저장한다.
8비트 기억장치 버퍼 레지스터(MBR) : 프로그래머가 직접 사용할 수 없다. 중앙처리장치가 기억장치를 액세스할 때 임시로 데이터를 저장한다. MBR은 HBus 또는 LBus로 연결될 수 있다.
8비트 상태 레지스터(SR) : 연산기의 연산 결과를 반영하여 상태 레지스터 안에 배치된 플래그의 값이 결정된다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
IE |
IR |
X |
X |
V |
C |
S |
Z |
- IE(인터럽트 가능 플래그) : 중앙처리장치가 인터럽트를 요청을 허용할지 결정한다.
- IR(인터럽트 요청 플래그) : 중앙처리장치 외부 혹은 내부에서 인터럽트 요청이 발생하였음을 표시한다.
- X : 사용하지않는다.
- V(오버플로우) : 연산기에서 산술 연산을 수행할 때 발생하는 오버플로우를 저장한다.
- C(자리올림수) : 연산기에서 산술 연산을 수행할 때 발생하는 자리올림수를 저장한다.
- S(부호 플래그) : 연산기의 연산 결과값의 부호 비트로 결정된다.
- Z(제로 플래그) : 연산기의 연산 결과가 0일 때 1이다
ToyCOM의 주소지정적챙
- 데이터 처리 명령어는 레지스터의 데이터 만으로 동작한다.
- 데이터 전달 명령어인 적재와 저장 명령어만 기억장치의 데이터를 액세스한다.
- 기억장치를 액세스할 때는 레지스터 간접 주소지정방식을 사용한다.
- 프로그램 제어 명령어는 상대 주소지정방식으로 분기 목적지를 표현한다.
ToyCOM의 명령어 형식
15 | 14 | 13 | 12 | 11 | 10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 | 0 |
|
opode | Rd | immediate | 형식1 | |||||||||||||
opcode | Rd | Rs1 | sop1 | sop2 | 형식2 | |||||||||||
opcode | Rd | Rs1 | Rs2 | sop2 | 형식3 | |||||||||||
opcode | offset | 형식4 |
- 동작코드(opcode) : 명령어 혹은 명령어 그룹을 구분하는 코드이다.
- 즉치(immediate) : 즉치 주소지정방식에서 명령어에 포함되어 있는 상수이다.
- 부동작 코드(sop1, sop2) : 동일한 그룹의 명령어를 세분화하는 코드이다.
- 목적지 레지스터(Rd) : 명령어의 목적지 레지스터의 번호이다.
- 소스 레지스터(Rs1, Rs2) : 명령어의 소스 레지스터의 번호이다.
- 변위(offset) : 상대 주소지정방식의 변위를 나타낸다.
- 형식1 : 즉치 데이터 전달 명령어
- 형식2 : 데이터 전달 명령어, 단항 데이터 처리 명령어
- 형식3 : 이항 데이터 처리 명령어
- 형식4 : 프로그램 제어 명령어
ToyCOM의 명령어 종류
명령어 종류 |
형식 |
주소지정방식 |
명령어 니모닉 코드 |
수 |
데이터전달 |
형식1 |
즉치 |
LDI |
1 |
형식2 |
레지스터 간접 |
LD, ST |
2 |
|
레지스터 |
MV |
1 |
||
스택 |
PUSH, POP |
2 |
||
데이터처리 |
형식2 |
레지스터 |
INC, DEC, NEG, NOT, SHL, SHR, ASL, ASR |
8 |
형식3 |
레지스터 |
ADD, ADC, SUB, SBC, AND, OR, XOR |
7 |
|
비교/플래그설정 |
형식3 |
레지스터 |
CMP |
1 |
없음 |
CLC, STC, CLI, STI |
4 |
||
프로그램 제어 |
형식4 |
상대 |
BR, BRNZ, BRZ, BRNS, BRS, BRNC, BRC, BRNV, BRV, BBE, BAE, BL, BLE, BG, BGE, CALL |
16 |
없음 | RET, RETI | 2 | ||
시스템 관리 | 형식4 | 없음 | NOP, HALT | 2 |
합계 | 46 |
ToyCOM의 주소지정방식
- 즉치 주소지정방식 : 즉치 데이터가 포함되어 있는 적재 명령어(LDI)가 사용한다.
- 레지스터 간접 주소 지정방식 : 기억장치에 유효 데이터가 있는 적재와 저장 명령어가 사용한다. 이 때 레지스터 쌍에 기억장치 주소를 지정한다.
- 레지스터 주소지정방식 : 레지스터간 데이터 이동, 단항 및 이항 연산 명령어, 그리고 비교 명령어가 사용한다.
- 상대 주소지정방식 : 무조건 분기, 조건 분기, 서브루틴 호출 명령어가 사용한다. 분기 목적지 주소와 프로그램 카운터의 값과의 거리를 변위(offset) 필드로 표현한다.
ToyCOM의 명령어 코드
1. 데이터 전달 명령어
명령어 |
비트패턴 |
동작 |
||||
15 - 11 |
10 - 8 |
7 - 5 |
4 - 2 | 1 - 0 |
||
LDI Rd, #value |
00001 |
Rd |
#value |
Rd <- #value |
||
LD Rd, (Rs+1:Rs) |
00010 |
Rd |
Rs |
000 | 00 |
Rd <- Mem(Rs+1:Rs) |
ST (Rs+1:Rs), Rs |
00010 |
Rd |
Rs |
000 | 01 |
Mem(Rd+1:Rd) <- Rs |
MV Rd, Rs |
00010 |
Rd |
Rs |
001 | 00 |
Rd <- Rs |
PUSH Rs |
00011 |
X |
Rs |
000 | 00 |
SP < SP - 1 / Mem(SP) <- Rs |
POP Rd |
00011 |
Rd |
X |
000 | 01 |
Rd <- Mem(SP) / SP <- SP + 1 |
- #value : 즉치 데이터를 나타낸다
- Rd: 목적지 레지스터이고, 범용 레지스터인 R0~R7중 하나이다.
- Rs: 소스 레지스터이고, 범용 레지스터인 R0~R7중 하나이다.
- Rx+1:Rx : Rx+1과 Rx(x = 0, 2, 4, 6) 연결되어 16비트로 사용되는 것을 의미한다.
- Mem(Rx+1:Rx) : 레지스터 간접 주소지정박식으로 기억장치를 액세스함을 나타낸다.
- X : 해당 필드가 사용되지 않음을 나타낸다 일반적으로 0으로 채운다.
2. 데이터 처리 명령어
명령어 | 비트패턴 | 동작 | ||||
15 - 11 | 10 - 8 | 7 - 5 | 4 - 2 | 1 - 0 | ||
INC Rd | 00100 | Rd | X | 000 | 00 | Rd <- Rd + 1 |
DEC Rd | 00100 | Rd | X | 000 | 01 | Rd <- Rd - 1 |
NEG Rd | 00100 | Rd | X | 000 | 10 | Rd <- -Rd |
NOT Rd | 00100 | Rd | X | 000 | 11 | Rd <- Rd' |
SHL Rd | 00100 | Rd | X | 001 | 00 | Rd <- logical shift left Rd |
SHR Rd | 00100 | Rd | X | 001 | 01 | Rd <- logical shift right Rd |
ASL Rd | 00100 | Rd | X | 001 | 10 | Rd <- arithmetic shift left Rd |
ASR Rd | 00100 | Rd | X | 001 | 11 | Rd <- arthmetic shift right Rd |
ADD Rd, Rs1, Rs2 | 00101 | Rd | Rs1 | Rs2 | 00 | Rd <- Rs1 + Rs2 |
ADC Rd, Rs1, Rs2 | 00101 | Rd | Rs1 | Rs2 | 01 | Rd <- Rs1 + Rs2 + SR.C |
SUB Rd, Rs1, Rs2 | 00101 | Rd | Rs1 | Rs2 | 10 | Rd <- Rs1 - Rs2 |
SBC Rd, Rs1, Rs2 | 00101 | Rd | Rs1 | Rs2 | 11 | Rd <- Rs1 - Rs2 - SR.C |
AND Rd, Rs1, Rs2 | 00110 | Rd | Rs1 | Rs2 | 00 | Rd <- Rs1 & Rs2 |
OR Rd, Rs1, Rs2 | 00110 | Rd | Rs1 | Rs2 | 01 | Rd <- Rs1 | Rs2 |
XOR Rd, Rs1, Rs2 | 00110 | Rd | Rs1 | Rs2 | 10 | Rd <- Rs1 ^+ Rs2 |
3. 비교 및 플래그 설정 명령어
명령어 | 비트패턴 | 동작 | ||||
15 - 11 | 10 - 8 | 7 - 5 | 4 - 2 | 1 - 0 | ||
CMP Rs1, Rs2 | 00111 | X | Rs1 | Rs2 | X | Rs1 - Rs2 |
CLC | 01000 | X | X | X | 00 | SR.C <- 0 |
STC | 01000 | X | X | X | 01 | SR.C <- 1 |
CLI | 01000 | X | X | X | 10 | SR.IE <- 0 |
STI | 01000 | X | X | X | 11 | SR.IE <- 1 |
4. 분기 명령어
명령어 | 비트패턴 | 동작 | ||||
15 - 11 | 10 - 0 | |||||
BR target | 10000 | offset | PC <- PC + offset | |||
BRNZ target | 10001 | offset | Z=0: PC <- PC + offset | |||
BRZ target | 10010 | offset | Z=1: PC <- PC + offset | |||
BRNS target | 10011 | offset | S=0: PC <- PC + offset | |||
BRS target | 10100 | offset | S=1: PC <- PC + offset | |||
BRNC target | 10101 | offset | C=0: PC <- PC + offset | |||
BRC target | 10110 | offset | C=1: PC <- PC + offset | |||
BRNV target | 10111 | offset | V=0: PC <- PC + offset | |||
BRV target | 11000 | offset | V=1: PC <- PC + offset | |||
BRE target | 10010 | offset | Z=1: PC <- PC + offset | |||
BRA target | 11001 | offset | C|Z': PC <- PC + offset | |||
BRAE target | 10110 | offset | C=1: PC <- PC + offset | |||
BRBE target | 11010 | offset | C'|Z: PC <- PC + offset | |||
BRB target | 10101 | offset | C=0: PC <- PC + offset | |||
BRGT target | 11011 | offset | (Z | (SV))': PC <- PC + offset | |||
BRGE target | 11100 | offset | (SV)': PC <- PC + offset | |||
BRLE target | 11101 | offset | Z | (SV): PC <- PC + offset | |||
BRLT target | 11110 | offset | SV: PC <- PC + offset |
5. 서브루틴 호출 및 인터럽트 명령어
명령어 | 비트패턴 | 동작 | |||
15 - 11 | 10 - 8 | 7 - 2 | 1 - 0 | ||
CALL target | 11111 | offset | PUSH PC, PC <- PC + offset | ||
RET | 01001 | X | X | 00 | POP PC |
RETI | 01001 | X | X | 01 | POP PC, POP SR |
6. 시스템 관리 명령어
명령어 | 비트패턴 | 동작 | ||
15 - 11 | 10 - 2 | 1 - 0 | ||
NOP | 00000 | X | 00 | No operation |
HALT | 00000 | X | 01 | System halt |
마이크로오퍼레이션을 설계하기 전에 명령어 사이클이 정의되어 있어야하는데, ToyCOM은 네 단계의 명령어 사이클을 갖는다.
인출 단계 : 프로그램 카운터가 기리키는 2바이트 명령어를 기억장치에서 인출하여 명령어 레지스터로 저장한다. 프로그램 카운터의 값은 2 증가한다
실행 단계 : 각 명령어 고유의 동작을 실행한다. 실행 단계가 끝난 후, 제어장치는 시스템 정지 조건과 상태 레지스터의 인터럽트 요청(SR, IR) 플래그를 검사하여 다음 단계를 결정한다.
정지 단계 : HALT 명령어를 실행하면, 제어장치는 정지 단계로 들어간다. 이 단계에서는 시스템이 정지되며, 다시 컴퓨터를 실행하려면 시스템을 리셋해야 한다.
인터럽트 단계 : 인터럽트 요청(SR, IR = 1)이 있는 경우, 상태 레지스터와 프로그램 카운터를 스택에 저장한 후, 프로그램 카운터에 인터럽트 서비스 루틴(ISR)의 시작 주소를 적재한다.
제어장치가 인터럽트 단계에서 수행해야 하는 일은 3가지이다.
- 먼저 인터럽트를 요청한 장치에 대한 인터럽트 번호를 확인한다.
- 상태 레지스터와 프로그램 카운터를 스택에 저장한다.
- 마지막으로 해당 인터럽트 요청에 대한 인터럽트 서비스 루틴의 시작 주소를 프로그램 카운터에 적재한다.
ToyCOM은 0번부터 2번까지 세 개의 인터럽트 소스를 갖는다.
시스템 리셋(0번 인터럽트) : 외부에서 전원이 인가되거나 시스템 리셋 신호에 의하여 리셋 인터럽트가 발생한다. 리셋 신호에 의하여 PC=0, SP=0으로 초기화된다. 기억장치 0번지에 "BR START(START번지로 무조건 분기)" 명령어가 저장되어 있다.
시스템 정지(1번 인터럽트) : ToyCOM의 내부에서 발생하며, 정의되어 있지 않은 명령어 코드 혹은 나누기 0과 같이 ToyCOM이 명령어를 실행할 수 없을 때, 1번 인터럽트가 발생한다. 1번 인터럽트가 발생하는 프로그램 카운터의 값이 0002h로 설정되고 시스템을 정지시키는 HALT 명령어를 실행한다. 시스템 초기화 과정에서 기억장치 2번지에 HALT명령어를 적재하여야 한다.
외부 인터럽트(2번 인터럽트) : 외부 장치가 인터럽트를 요청한 경우에 해당한다. 프로그램 카운터는 0004h로 설정되며, 시스템 0
명령어 인출과정은 ToyCOM의 프로그래머 모델에서는 한번의 클럭 사이클 안에 실행될 수 없고, 이유 세가지가 있다.
- 기억장치를 읽기 위하여 프로그램 카운터의 값이 기억장치 주소 레지스터로 적재 되어야 한다.
- 기억장치는 8비트 단위로 액세스 되고, 기억장치를 읽은 값은 기억장피 버퍼 레지스터로 적재된다.
- 기억장치 버퍼 레지스터는 8비트이고 명령어 레지스터는 16비트이므로, 기억장치를 두 번 액세스하여야 한다.
따라서 명령어 인출 단계는 여러 개의 클럭 사이클을 사용하도록 동작이 세분화 되어야 하는데, 이것을 명령어보다 더 작은 동작이라는 의미에서 마이크로오퍼레이션(micro-operation)이라고 한다
인출 단계의 마이크로오퍼레이션
명령어 사이클 |
동작 |
마이크로오퍼레이션 |
인출 단계 |
IR <- Mem[PC] PC <- PC +2 |
MAR <- PC MBR <- Mem(MAR), PC <- PC + 1 IRL <- MBR MAR <- PC MBR <- Mem(MAR), PC <- PC + 1 IRH <- MBR |
실행 단계의 마이크로 오퍼레이션
1. 데이터 전달 명령어의 마이크로오퍼레이션
명령어 |
동작 |
마이크로오퍼레이션 |
LDI Rd. #value |
Rd <- #value |
Rd <- IRL |
LD Rd, (Rs+1:Rs) |
Rd <- Mem(Rs+1:Rs) |
MAR <- Rs+1:Rs MBR <- Mem(MAR) Rd <- MBR |
ST (Rd+1:Rd), Rs |
Mem(Rd+1:Rd) <- RS |
MAR <- Rd+1:Rd |
MV Rd, Rs |
Rd <- Rs |
Rd <- Rs |
PUSH Rs |
SP <- SP - 1 Mem(SP) <- Rs |
SP <- SP - 1 MAR <- SP MBR <- Rs Mem(MAR) <- MBR |
POP Rd |
Rd <- Mem(SP) SP <- SP + 1 |
MAR <- SP MBR <- Mem(MAR) Rd <- MBR, SP <- SP + 1 |
2. 데이터 처리 명령어의 마이크로오퍼레이션(아래를 제외한 나머지는 동작과 마이크로 오퍼레이션이 같음)
명령어 |
동작 |
마이크로오퍼레이션 |
SHL Rd |
Rd <- logical shift left Rd |
Rd <- SHL Rd |
SHR Rd |
Rd <- logical shift right Rd |
Rd <- SHR Rd |
ASL Rd |
Rd <- arithmetic shift left Rd |
Rd <- ARL Rd |
ASR Rd |
Rd <- arithmetic shift right Rd |
Rd <- ASR Rd |
3. 분기 명령어의 마이크로오퍼레이션(동작에서 offset을 IRH[10:8]:IRL로 변경해주면 마이크로오퍼레이션과 같음)
4. 호출, 복귀 및 시스템 관리 명령어의 마이크로오퍼레이션
명령어 |
동작 |
마이크로오퍼레이션 |
CALL target |
PUSH PC PC <- PC + offset |
SP <- SP - 1 MAR <- SP MBR <- PCH Mem(MAR) <- MBR SP <- SP -1 MAR <- SP MBR <- PCL Mem(MAR) <- MBR PC <- PC + IRH[10:8]:IRL |
RET |
POP PC |
MAR <- SP MBR <- Mem(MAR) PCL <- MBR, SP <- SP + 1 MAR <- SP MBR <- Mem(MAR) PCH <- MBR, SP <- SP + 1 |
RETI |
POP PC POP SR |
MAR <- SP MBR <- Mem(MAR) PCL <- MBR, SP <- SP + 1 MAR <- SP MBR <- Mem(MAR) PCH <- MBR, SP <- SP + 1 MAR <- SP MBR <- Mem(MAR) SR <- MBR, SP <- SP + 1 |
NOP |
없음 |
없음 |
HALT |
없음 |
없음 |
5. 인터럽트 단계의 마이크로오퍼레이션
명령어 사이클 |
동작 |
마이크로오퍼레이션 |
인터럽트 단계 |
PUSH SR PUSH PC PC <- 2 x n |
SP <- SP - 1 MAR <- SP MBR <- SR Mem(MAR) <- MBR SP <- SP - 1 MAR <- SP MBR <- PCH Mem(MAR) <- MBR MAR <- SP MBR <- PCH Mem(MAR) <- MBR, PC <- 2 x n |
생능출판사
ToyCom다운로드링크
출처
제목: 한눈에 보이는 컴퓨터 구조
저자: 전중남
출판사: 생능출판
'컴퓨터구조론' 카테고리의 다른 글
[컴퓨터구조론] 중앙처리장치 설계(2) - 연습문제 (0) | 2018.12.12 |
---|