본문 바로가기

컴퓨터구조론

[컴퓨터구조론] 중앙처리정치 설계(1) - 설명

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

 IE

IR 

- 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 

형식2 

레지스터 간접 

LD, ST 

레지스터 

MV 

스택 

PUSH, POP

데이터처리 

형식2 

레지스터 

INC, DEC, NEG, NOT, SHL, SHR, ASL, ASR 

형식3 

레지스터 

ADD, ADC, SUB, SBC, AND, OR, XOR 

비교/플래그설정 

형식3 

레지스터 

CMP 

없음 

CLC, STC, CLI, STI 

프로그램 제어 

형식4 

상대 

BR, BRNZ, BRZ, BRNS, BRS, BRNC, BRC, BRNV, BRV, BBE, BAE, BL, BLE, BG, BGE, CALL 

16

없음 

RET, RETI 

시스템 관리 

형식4 

없음 

NOP, HALT 

 합계 

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 

Rs 

000 

00 

SP < SP - 1 / Mem(SP) <- Rs 

POP Rd 

00011 

Rd 

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 

Rs1 

Rs2 

 X 

 Rs1 - Rs2 

 CLC 

01000 

 00 

 SR.C <- 0 

 STC 

01000 

 01 

 SR.C <- 1 

 CLI 

01000 

 10 

 SR.IE <- 0 

 STI 

01000 

 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 

00 

 POP PC 

 RETI

01001 

01 

 POP PC, POP SR 


6. 시스템 관리 명령어

명령어 

비트패턴 

동작 

 15 - 11

10 - 2

1 - 0 

 NOP

00000 

X

00 

No operation 

 HALT 

00000 

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 


생능출판사

https://www.booksr.co.kr/


ToyCom다운로드링크

https://www.booksr.co.kr/upload_data/datafile/datafile2/ToyCOM%20%EC%8B%9C%EB%AE%AC%EB%A0%88%EC%9D%B4%ED%84%B0%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8(1).zip


출처

제목: 한눈에 보이는 컴퓨터 구조

저자: 전중남

출판사: 생능출판