Direct 모드와 Indirect 모드
Direct 모드 Indirect 모드
LOAD r1, 0x10 실행시 LOAD r1, [0x10] 실행시
r0 |
r0 | ||
r1 | ←10 0x10번지 | r1 | 0x30 ↓ 0x10번지 |
r2 | r2 | ↖ ↓ |
|
r3 |
r3 | ↖ 10 0x30번지 |
|
r4 ir |
r4 ir | ||
r5 sp | r5 sp | ||
r6 lr | r6 lr | ||
r7 pc |
r7 pc |
Direct 모드는 말그데로 메모리에 있는 값을 레지스트로 가져와라 이고
Indirect 모드는 메모리에 있는 값을 다시 메모리로 참조에서 값을 가져오는것이다. 0x10[0x30] → 0x30[10] → r1
※ LOAD r1, [0x10] 여기서 []는 Indirect 모드 라는 표시로 아무거나 써도 상관은없다.
Direct 모드의 문제점
| <- LOAD -> | <destination> | <- source -> | ||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
int a = 10; //0x0010 번지할당
int b = 20; //0x0100 번지 할당
int c = 0; //0x0020 번지 할당
c = a + b;
LOAD r1, 0x0010 (구성가능)
LOAD r2, 0x0100 (구성불가)
8비트로 표현가능한 수는 0~255이다.
LOAD 명령어를 살펴보면 source 부분은 8비트 밖에 되지않는다.
0x0010같은 경우는 8비트로 표현이 가능하지만 0x0100은 딱봐다 8비트로는 표현이가능하지않는다.
그럼 명령어로 구성 할 수없는 메모리 주소는 어떻게 사용할 것이가??
문제해결
int a = 10; //0x0010 번지할당
int b = 20; //0x0100 번지 할당
int c = 0; //0x0020 번지 할당
c = a + b ;
명령어로 표현해보면 메모리 주소값문제로 Direct 모드로 표현 할 수없다는 것을 알고있다.
그래서 Indirect 로 풀어보면
LOAD r1 , 0x0010 MUL r0, 4, 4 MUL r2, 4, 4 STORE r3, 0x0030 LOAD r2, [0x0030] ADD r3, r1, r2 | 일단 r1에 a값을 넣는것은 그냥 LOAD명령어를 넣으면 된다 하지만 b값은 메모리주소 0x0100 에 할당되어있어서 명령어로 표현이 불가능하다 그래서 MUL 명령어를 이용해보자. r0에 4 곱하기 4 연산값을 넣고 r2에도 반복하자. 그리고 r3에 r0와 r2의 값을 곱한값을 넣으면 16*16 즉 256 , 16진수로 0100 이다. r3에보면 0x100이 들어가 있는상태이다. 이제 r3에 있는 값을 0x0030 번지에 값을 넣고 Indirect로 0x0030을 불러와서 r2에 넣으면 r2에 원하던 값을 넣을 수 있게 된다 . |
레지스터 메모리
r0 16 |
|
r1 10 |
10 0x0010(a) |
r2 16 |
0 0x0020(c) |
r3 265(0x0100) |
|
r4 ir | 0x0100 0x0030 |
r5 sp | 20 0x0100 |
r6 lr | |
r7 pc |
그림으로 만들어 보면 이런 모양일 것이다.
'강좌 정리 > 뇌를자극하는윈도우즈시스템프로그래밍' 카테고리의 다른 글
05장. 프로세스의 생성과 소멸 ②프로그래밍을 통한 프로세스의 생성 (0) | 2012.07.04 |
---|---|
05장. 프로세스의 생성과 소멸 ① 프로세스와 스케줄러의 이해 (0) | 2012.07.03 |
04.장 컴퓨터 구조에 대한 두번째 이야기 ②LOAD & STORE 명령어 디자인 (0) | 2012.07.02 |
04.장 컴퓨터 구조에 대한 두번째 이야기 ① 컴퓨터 구조의 접근방법 (0) | 2012.06.29 |
03장. 64비트 기반 프로그래밍 ② 프로그램 구현 관점에서의 WIN32 vs WIN64, 오류의 확인 (0) | 2012.06.28 |