1.37k likes | 1.98k Views
CPU 의 기초 이론. 일반적인 CPU 의 기본 구성. dolicom@naver.com http://blog.naver.com/dolicom. CPU 의 기본 이론. CPU 구조. CPU 의 기본적 구성 요소. 일반적인 CPU 의 구성 요소 레지스터 ALU & flag 명령 패치 및 명령 실행 모듈 CPU 가 실행되기 위한 가장 기초적 요소 메모리 ROM/FLASH RAM (SRAM,DRAM). 초기 CPU 레지스터의 구조 (8 비트 ). 초기 CPU 의 레지스터
E N D
CPU의 기초 이론 일반적인 CPU의 기본 구성 dolicom@naver.com http://blog.naver.com/dolicom
CPU의 기본 이론 CPU 구조
CPU의 기본적 구성 요소 • 일반적인 CPU의 구성 요소 • 레지스터 • ALU & flag • 명령 패치 및 명령 실행 모듈 • CPU가 실행되기 위한 가장 기초적 요소 • 메모리 • ROM/FLASH • RAM (SRAM,DRAM)
초기 CPU 레지스터의 구조(8비트) • 초기 CPU의 레지스터 • A (Accumulator ) : 데이터 처리의 기본 레지스터 • B : A와 연동하는 보조 레지스터 • ALU는 명령의 종류에 따라 1,2개의 요소가 필요 한데 A,B가 기본 요소이다. • 2개 필요 : ADD ; A+B -> A • 1개 필요 : RR A ; 오른쪽 로테이션 • 일반적 레지스터가 여러 개 추가-일반 레지스터. • 8086,Z80 : B, C, D, E, H, L • 2개의 레지스터가 결합하여 동작하기도 한다. • BC, DE, HL -> 16비트 조작 명령도 있음
진화한 구조 레지스터 • 일반 레지스터의 차이가 없다. • Accumulator가 처리하는 것을 모든 일반 레지스터가 실행 • 각 레지스터간의 특별한 의미가 없이 동등 • R0, R1, R2, … Rn • ALU와 선택적으로 연결되어 계산 • ADD R2,R3 ; R2+R3 -> R2 • ARM, 68000
8비트 CPU의 특수 레지스터 종류 • Index 레지스터 • 주로 메모리 주소를 나타내어 데이터를 읽거나 쓸 때 주소값으로 사용 • 6800 : IX, 8051 : DPTR • 8086,Z80 : 일반레지스터 HL을 메모리 인텍스로 사용 • PC (Program Counter), IP(x86) • 현재 기계어 명령이 실행되는 있는 메모리의 위치를 나타낸다. • PC값은 자동으로 처리되기 때문에 임의적으로 값을 바꾸는 명령은 없다. • SP (Stack Pointer) • 메모리를 사용한 특수 stack 처리를 위한 메모리의 위치를 지정하는 포인터 값을 갖는다.
Reset 후 초기 PC 값 • 주소 기계어 어셈블러 • ORG 0000H • 0000 74 00 MOV A,01H • 0002 25 02 ADD A,02H • 0004 F5 A0MOV 0A0,A • 0006 02 00 57JMP MAIN • 0009 02 . . . . . . PC=0000 74 0000 0001 01 0002 25 0003 02 A B data bus . . . . . . FLAG ALU
패치(Fetch )을 할 때 PC 사용 • 처음 00번지 기계어를 읽는다. • 명령어 74는 다음 데이터를 A레지스터로 옮기라는 명령으로 규정 -> 해석 주소 기계어 어셈블러 ORG 0000H 0000 74 01 MOV A,01H 0030 25 02 ADD A,02H 0033 F5 A0 MOV 0A0,A PC=0000 0000 74 0001 01 0002 25 0003 02 명령어 버퍼 명령어 해석 74 A B data bus . . . . . . FLAG ALU
Fetch후 자동으로 PC 값 1 증가 주소 기계어 어셈블러 ORG 0000H 0000 74 00 MOV A,01H 0002 25 02 ADD A,02H 0004 F5 A0 MOV 0A0,A 0000 74 PC=0001 01 0001 • 다음 1 번지의 데이터 00을 읽어 A레지스터에 넣는다. • 명령 한 개가 종료 됨. 0002 25 02 0003 명령어 버퍼 명령어 해석 74 A 01 B data bus . . . . . . FLAG ALU
자동으로 PC 1증가하여 다음 명령처리 주소 기계어 어셈블러 0000 74 00 MOV A,01H 0002 25 02 ADD A,02H 0004 F5 A0 MOV 0A0H,A 0000 74 • 처음 02번지 기계어를 읽는다. • 명령어 25는 다음 데이터를 A레지스터와 더하라는 명령으로 규정 -> 해석 • A+02H -> A 준비 0001 01 명령어 버퍼 PC=0002 0002 25 명령어 해석 25 0003 02 A = 01 B data bus . . . . . . FLAG ALU
명령어 실행-Machine Cycle • 한 명령이 실행되기 까지의 전체 시간 • Fetch-기계어 명령 읽기 • Decode- 기계어 기능 해석 • Execute- 실행 • Store- 메모리에 저장 MOV A,02H ADD A,02H
MOVA,01H MC1 Fetch-명령어읽기 • MOVA,01H = 7401 • 메모리로 부터 명령어 74을읽는 과정이다. 8051 코어 제어신호 ROM CPU출력 ROM출력 16 0000 74 Address bus 0000 PC=0000 0001 01 8 data bus 0002 74 25 명령어 버퍼 0003 02 읽기제어신호 . . . CS, OE A . . . B EPROM Read Timing . . . FLAG ALU
MOVA,01H MC2 Decode – 명령어 해석 • MOVA,01H = 7401 • 읽어들인 명령어 74을 해석 한다. 제어신호 Decode:74가 MOV 명령해석 Decode ROM 0000 74 16 Address bus PC=0001 0001 01 8 data bus 0002 25 명령어 버퍼 74 0003 02 읽기제어신호 . . . A . . . B . . . FLAG ALU
MOVA,01H MC3 Execute –명령어실행 • MOVA,01H = 7401 • 다음 데이터을 읽어 A에 넣기 실행 제어신호 ROM CPU출력 ROM출력 16 0000 74 Address bus 0001 PC=0001 0001 01 8 data bus 0002 01 25 0003 02 읽기제어신호 . . . CS, OE A 01 . . . B EPROM Read Timing . . . FLAG ALU
ADDA,02H MC1 Fetch-명령어읽기 • ADDA,02H = 2502 • 메모리로 부터 명령어 25을읽는 과정이다. 제어신호 ROM CPU출력 ROM출력 16 0000 74 Address bus 0002 PC=0002 0001 01 8 data bus 0002 25 25 명령어 버퍼 0003 02 읽기제어신호 . . . CS, OE A = 01 . . . B EPROM Read Timing . . . FLAG ALU
ADDA,02H MC2 Decode – 명령어 해석 • ADDA,02H = 2502 • 읽어들인 명령어 25을 해석 한다. Decode:25가 ADD 명령해석 Decode ROM 0000 74 16 Address bus PC=0003 0001 01 8 data bus 0002 25 명령어 버퍼 25 0003 02 읽기제어신호 . . . A . . . B . . . FLAG ALU
ADDA,02H MC3 Execute –데이터실행 • ADDA,02H = 25 02 • 다음 데이터을 02를 읽는다. 제어신호 ROM CPU출력 ROM출력 16 0000 74 Address bus 0003 PC=0003 0001 01 8 data bus 0002 02 25 Operand 버퍼02 0003 02 읽기제어신호 . . . CS, OE A 01 . . . B EPROM Read Timing . . . FLAG ALU
ADDA,02H MC4 Execute –더하기 실행 • ADDA,02H = 25 02 • ALU을 이용하여 A+operand 실행 제어 : ADD Decode ROM 0000 74 16 Address bus PC=0004 0001 01 8 data bus 0002 25 Operand02 0003 02 읽기제어신호 . . . A = 01 -> 03 . . . B . . . FLAG 01 02 ALU: ADD 선택 Z=0,C=0, N=0, V=0, P=0 ALU 03
MOV0A0H,A MC1 Fetch-명령어읽기 • MOV0A0H,A = F5A0 • 메모리로 부터 명령어 F5을읽는다. ROM 74 0000 제어신호 CPU출력 0001 01 ROM출력 0002 16 25 Address bus 0004 PC=0004 0003 02 8 data bus F5 0004 F5 명령어 버퍼 A0 0005 읽기제어신호 CS, OE A=03 . . . . . . B EPROM Read Timing . . . FLAG ALU
MOV0A0H,A MC2 Decode – 명령어 해석 • MOV0A0H,A = F5A0 • 읽어들인 명령어 74을 해석 한다. ROM Decode:F5가 MOV 명령해석 74 0000 Decode 0001 01 0002 25 16 Address bus PC=0005 0003 02 8 data bus 0004 F5 명령어 버퍼 F5 A0 0005 읽기제어신호 A=03 . . . . . . B . . . FLAG ALU
MOV0A0H,A MC3 Execute –명령어실행 • MOV0A0H,A = F5 A0 • 저장할주소값 읽기 CPU출력 ROM출력 ROM 74 0000 제어신호 0001 01 0002 16 25 Address bus 0005 PC=0005 0003 02 8 data bus A0 0004 F5 OperandA0 A0 0005 읽기제어신호 CS, OE A = 03 . . . . . . B EPROM Read Timing . . . FLAG ALU
MOV0A0H,A MC4 Store –데이터저장 • MOV0A0H,A = F5 A0 • 읽힌주소값(A0)을 이용 RAM 쓰기 8051의 RAM은 내부에있는 것이므로 8비트 주소값을 갖는다. 그러나 통상 8비트 CPU는 주소는 16비트이다. CPU출력 내부RAM CPU 출력 74 30 제어신호 9E 01 00 9F 8/16 25 A0 A0 Address bus 03 PC=0006 02 02 A1 8 data bus 03 F5 OperandA0 FF A2 A0 54 읽기제어신호 A3 CS, WE A = 03 . . . . . . . . . B RAM Write Timing . . . FLAG ALU
MOVX @DPTR, A 현재 DPTR=5011 MC3 Store –데이터저장 • MOV@DPTR,A • 읽힌주소값(A0)을 이용 RAM 쓰기 CPU출력 CPU 출력 외부RAM 74 30 제어신호 500F 01 00 5010 16 25 5011 5011 Address bus 03 PC=0006 02 02 5012 8 data bus 03 F5 DPTR = 5011 FF 5013 A0 54 읽기제어신호 5014 CS, WE A = 03 . . . . . . . . . B RAM Write Timing . . . FLAG ALU
PC 값이 자동으로 진행하지 않는 경우 • PC는 CPU가 실행하면서 현재 실행 시점에서 자동으로 증가하면 다음 명령을 실행 • 필요에 따라 다음 명령이 아닌 곳으로 실행을 옮길 필요가 있는데 이것은 기계어 명령에 따라 이루어 진다. • Jump 명령 • CALL / RET 명령 • 8비트 CPU의 PC 는 16비트 레지스터 이므로 최대 64K 바이트 내에서 기계어 코드가 실행 된다.
CPU의 기본 이론 플래그 (FLAG)
플래그(FLAG)의 개념과 종류 • ALU 산술연산, 논리연산, 쉬프트 등의 결과로 발생되는 상태를 나타내고 CPU에 저장하여, 이 상태를 사용하는 명령에 의해 명령 고려 시 참조된다. • 수학적 2진법 계산에서 주로 언급되는 이론 • 수학적 계산을 할 때, 디지털 회로에서 정해진 비트로 설정하고 계산한다. • CPU 마다 취급되는 종류는 약간씩 다르나 기본적인 것은 모두 가지고 있다.
플래그의 종류 • C (Carry) : 어떤 연산결과 맨 앞의 비트 계산 결과 발생되는 자리 올림 값. • 더하기 할 때는 carry • 빼기 할 때는 borrow • Z (Zero) : 계산 결과가 모두 0일 때 • Carry비트는 제외 • V (Overflow) : 계산 결과 레지스터가 취급할 수 값의 범위를 넘었을 때 발생 • S (Sign) : 맨 앞의 비트(MSB)가 1일 때 음수를 나타낸다. • P (Parity) : 계산 결과 값에서 1의 개수가 홀수 개 인지 짝수개 인지를 나타낸다. • AC(Auxiliary Carry) : 8비트 CPU에서 3번째 비트를 연산한 결과의 Carry/Borrow 값
8비트 계산의 C와 AC char inum; inum = -3; inum += 2; 0000 0011 : 3 1111 1100 : 3의 1의 보수 1111 1101 : 3의 2의 보수 = 1의 보수 + 1 => -3 0 1111 1101 : (-3) 0 0000 0010 : + 2 ----------- ADD 0 1111 1111 : (-3) + 2 => -1 맨 앞의 비트에서 더할 때 carry가 발생하지 않아 C = 0 (clear) 되고 AC=0 0
Carry 예 2 char inum; inum = -3; inum += -2; 0 1111 1101 : -3 0 1111 1110 : -2 ---------- + ADD 1 1111 1011 : (-3) + (-2) => -5 맨 앞의 비트에서 더할 때 carry가 발생하여 C=1 (set) 되고 AC=1 1
로테이션 명령에서 carry와 함께 • RRC A : RRC (Rotate Right with Carry) 0 → 1111 1101 → C C=1 • RLC A : RLC (Rotate Left with Carry) C ← 1111 1101 ← 0 C=0 A레지스터 A레지스터
Zero 예(8비트) char inum; inum = -3; inum -= 3; 0 1111 1101 : -3 0 0000 0011 : 3 ----------- SUB 00000 0000 : (-3) - 3 => 0 연산결과 0이 나와 Z=1(set), C=0(clear)
S (Sign), N(Negative) char inum; inum = -3; MOV A,#0FDH inum += 2; ADD A,#02 0 1111 1101 : -3 0 0000 0010 : 2 ----------- ADD 011111111 : (-3) +2 => -1 연산결과 -1이고 S=1(set), Z=0(clear), C=0(clear)
V (Overflow) • -127 -1 = 80H – 01H => 127 : V=1, C=0, S=0 0 1000 0000 : 80H = -128 0 0000 0001 : 01H = 1 ---------- : SUBB 00111 1111 : -128 - 1 = +127 -128 - 1 = -129와 같이 결과가 나와야 하지만 8비트의 제한 때문에 127이 나와 한계를 넘는 경우를 overflow 라고 한다. V=1(set)로 됨 char icn; icn = -127; icn -= 1; CLR C MOV A,#80H SUBB A,#01
V (Overflow) • 126 +3 = -127 : V=1, C=0, S=1 0 0111 1110 : 126 0 0000 0011 : 3 ---------- : ADD 01000 0001 : 126 + 3 = -127 126 + 3 = 129와 같이 결과가 나와야 하지만 8비트의 제한 때문에 -127이 나와 127보다 큰 수가 될 수 없고 한계를 넘는 경우를 overflow 라고 한다. V=1(set)로 됨 char icn; icn = 126; icn += 3; CLR C MOV A,#126 SUBB A,#03
P (Even Parity ) char inum; inum = -3; MOV A,#0FDH inum += 2; ADD A,#02 01111 1101 : -3 00000 0010 : 2 ----------- ADD 01111 1111 : (-3) +2 => -1 연산결과 값은 -1이고, 1의 개수가 8개로 짝수이다. 이 때 P=1로 set 됨. P=1(set), S=1(set), Z=0(clear), C=0(clear)
CPU의 기본 이론 스택 (Stack)
스택(Stack)의 개념 • 스택은 데이터를 저장하거나 꺼내 사용할 때, 저장하는 방식을 말한다. • 마지막에 넣은 데이터를 우선 꺼내지는 구조이다. 데이터 꺼내기 POP 데이터 넣기 PUSH
스택 구조를 지원하기 SP레지스터 사용 • 메모리에 데이터를 넣고 빼기 위해 주소값을 저정하기 위한 포인터가 필요한데 이것이 SP 레지스터 이다. • SP는 특정 명령이 실행되며 자동으로 증가하거나 감소 한다. POP PUSH SP 레지스터 메모리
8비트 CPU의 스택의 억세스 순서 • 스택에 넣을 때는 PUSH 명령을 사용 한다. MOV A,#10 PUSH A PUSH A 실행 과정 MOV SP,#00FFH PUSH 주소 주소 주소 00FC 00FC 00FC 00FD SP 00FD 00FD 00FE 00FE 00FE SP 00FE SP 10 00FF 00FF XX 00FF 10 00FF 00FF 메모리 • SP가 가리키는 • 주소에 10을 넣는다. 2. SP가 1이 자동감소
스택의 억세스 순서 step2 • 기계어 데이터를 꺼내려면 POP 명령을 사용 POP A 실행 과정 POP A A 읽기 10 주소 주소 00FC 00FC SP 00FD 00FD 00FE 00FE 00FE SP 10 00FF 00FF 10 00FF 00FF 3. 읽혀진 값을 A에 저장 1. SP가 1이 자동증가 2. SP가 가리키는 주소에서 값을 읽는다
8051 스택의 억세스 순서 • 기계어 데이터를 넣으려면 PUSH 명령을 사용 MOV A,#10 PUSH A PUSH A 실행 과정 MOV SP,#5FH 주소 주소 주소 SP 5F SP 5F 5F SP 5F 10 60 60 60 60 60 61 61 61 62 62 62 A 10 내부메모리 1. SP가 1이 자동증가 2. SP가 가리키는 주소에 A=10을 넣는다.
8051스택의 억세스 순서 step2 • 기계어 데이터를 꺼내려면 POP 명령을 사용 POP A 실행 과정 POP A 읽기 주소 주소 SP 주소 5F 5F SP SP 5F 5F 60 60 60 10 60 10 60 10 61 61 61 62 62 62 A 레지스터 10 2. SP을 1 감소 한다. • SP에서 읽어 • A에 저장 한다.
CPU의 기본 이론 CPU 레지스터 예
8051의 레지스터 8비트 A ALU와 연동 DPTR DPH DPL B 16비트 R0 스택 포인터 R1 SP 8비트 – 내부 RAM 만 사용 R2 R3 PC PC 16비트 범용 R4 R5 8비트 FLAG PSW R6 CY AC F0 RS1 RS0 OV -- P R7
8086 레지스터 • A : Accumulator • General registers: • B,C, BC (data pointer) • D,E, DE (data pointer) • H,L, HL (reference memory address) • PC (Program counter,16비트) • SP (Stack pointer,16비트)-stack • 2씩 증가/감소. • FLAG • S : Sign • Z : Zero • AC : Auxiliary carry - carry 3비트의 결과->4비트에 영향 • P : Parity – even parity (1의 숫자가 짝수개 일때, 1) • C : Carry –더하기(carry), 빼기/비교(borrow)
Z-80 플래그 • Carry • Zero • Minus • Parity/overflow • Half-carry