가상으로 컴퓨터를 디자인
프로그래머 관점
- 컴퓨터 구조를 잘 아는 프로그래머도 컴퓨터 디자인에 참여
- 컴퓨터 디자인은 레지스터와 명령어 디자인
레지스터 디자인의 핵심
- 레지스터는 몇 비트로 구성할 것인가?
n비트 시스템이 있을 때 레지스터도 n비트여야 한다.
명령어의 길이가 n비트 이기 때문에 하나의 명령어를 레지스터에 저장하기 위해 레지스터는 n비트여야 한다.
- 몇 개 정도로 레지스터를 구성할 것인가?
레지스터에 수는 많으면 많을수록 좋다.
- 레지스터 각각을 무슨 용도로 사용할 것인가?
RAM or H/D 는 일반적인 저장 장치인 반면 레지스터는 용도가 정해저 있는 저장 장치
레지스터의 용도를 정하면 명령어가 단순해지고, 속도가 빨라진다.
r1부터 r3까지는 범용 레지스터, r4부터 r7까지는 특별한 레지스터로 정함.
레지스터
ir : instruction register (인스트럭션 레지스터)
sp : stack pointer (스택 포인터)
lr : link register (링크 레지스터)
pc : program counter (프로그램 카운터)
몇 비트로 구성 : 16비트
레지스터 갯수 : 8개
명령어 구조 및 명령어 디자인
하나의 명령어를 실행하는 과정.
클럭수가 많으면 열이 많이 발생함.
(Reduced instruction set computer)
RISC(리스크) CPU <- 고성능
F(패치) -> D(디코드) -> E(익스큐션)
하나의 명령어당 한 클럭식 쓴다. 명령어 1번 당 총 3 클럭
즉 명령어 5개를 쓸 때 5 * 3 = 15 클럭이 필요하다.
F
|
D |
E |
|
|
|
|
|
F |
D |
E |
|
|
|
|
|
F |
D |
E |
|
|
|
|
|
F |
D |
E |
|
|
|
|
|
F |
D |
E |
n 명령어를 실행할 때 n + 2 클럭이 필요하다.
성능을 위해 리스크는 제약사항이 많다.
(Complex Instruction Set Computer)
CISC(시스크) CPU <- 저성능
복잡한 명령어로 구성된다.
LOAD & STORE 명령어 디자인
메모리에서 값을 연산하기 위해 CPU로 불러오는 명령어를 LOAD로 정의
연산 결과를 메모리에 다시 돌려보내는 연산을 STORE로 정의
명령어의 제한
사칙연산의 피 연산자는 숫자 or 레지스터
연산 결과는 레지스터에 저장
즉 레지스터를 통해서 모든 연산을 진행하겠다.
LOAD r1, 0x20 = 0x20에 있는 값을 r1에 불러와라.
STORE r1 0x20 = r1에 있는 값을 0x20에 넣어라.
1
2
3
4
5
6
7
8
9
|
int a = 10; // 0x10번지 할당
int b = 20; // 0x20번지 할당
int c = 0; // 0x30번지 할당
c = a + b;
LOAD r1, 0x10
LOAD r2, 0x20
ADD r3, r1, r2
STORE r3, 0x30
|
cs |
Direct 모드와 Indirect 모드
- Direct 모드
Direct 모드의 문제점
1
2
3
4
5
6
7
|
int a = 10; // 0x0010번지 할당
int b = 20; // 0x0100번지 할당
int c = 0; // 0x0020번지 할당
c = a + b;
LOAD r1, 0x0010
LOAD r2, 0x0100
|
cs |
- Indirect모드
메모리에 값을 참조해서 그 주소를 다시 한번 이동한 후 값을 가져온다.
메모리를 참조하고 그 값을 한번 더 참조함.(한 다리 거침)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int a = 10; // 0x0010번지 할당
int b = 20; // 0x0100번지 할당
int c = 0; // 0x0030번지 할당
c = a + b;
LOAD r1, 0x0010
LOAD r1, 0x0010
MUL r0, 4, 4
MUL r2, 4, 4
MUL r3, r0, r2
STORE r3, 0x0030
LOAD r2, [0x0030]
ADD r3, r1, r2
STORE r3, 0x0030
|
cs |
MUL 곱하기 4 * 4를 r0에 저장
MUL 곱하기 4 * 4를 r2에 저장
MUL 곱하기 r3에 r0 * r2를 하면 16진수로 100번지가 됨.
표현하지 못하는 건 이런 식으로 만들어야 함.
STORE r3, 0x0030에 r3에 값을 0x0030번지에 넣어라
LOAD r2, [0x0030] = 인다이렉트 모드 0x0030에 담겨진 주소를 찾아가 r2에 넣겠다.
0x0030주소에는 0x0100이 들어있음.
ADD r3, r1, r2 = r3에 r1 + r2를 해서 넣어라.
STORE r3, 0x0030 = 0x0030(c)에 r3에 값을 넣어라
최종적으로 c에 30이 들어감.
'Programming > System Programming' 카테고리의 다른 글
프로세스의 이해 / 프로세스의 생성 (0) | 2016.04.04 |
---|---|
Win 32 vs Win 64 (32bit vs 64bit) (0) | 2016.04.03 |
Windows에서의 유니코드(UNICODE) (3) | 2016.04.01 |
프로그램의 실행과정 / 하드웨어 구성의 재접근 (0) | 2016.03.31 |
시스템 프로그래밍이란? (2) | 2016.03.30 |