- LOAD destination(register) , source(memory address)
- STORE source(register), destination(memory address)
이렇게 명령어를 디자인한다고 하자. LOAD 명령어는 메모리주소에서 레지스터로 값을 불러온다.
반대로 STORE 명령어는 레지스터를 메모리주소에 값을 저장한다.
예제
int a,b 를 선언하고, c 에 둘을 더한 값들을 저장하는 예제이다.
LOAD 명령어로 각각의 레지스터에 값을 저장하고, 레지스터에 더하기연산값을 저장한뒤,
STORE 명령어로 c 의 주소 (0x30) 에 결과를 저장한다.
물론 INTEL ASSEMBLY 에서는
mov rax, [rbp-0x30] ;
mov rbx, [rbp-0x20] ;
add rax,rbx ;
mov [rbp-0x10], rax;
이런식으로 표현할 수 있습니다. 직접적으로 값을 가져오는게 아니라,
스택주소값을 담고있는 레지스터인 rbp 에 지역변수의 offset 만큼 빼서 [] -> indirect 모드로 값을 가져옵니다.
ex :
rbp = 0x7fff,
지역변수 offset = 0x30,
rbp-0x30 = 0x7fcf ,
[rbp-0x30] = 0x7fcf -> 10
rbp = 0x7fff,
지역변수 offset = 0x30,
rbp-0x30 = 0x7fcf ,
[rbp-0x30] = 0x7fcf -> 10
이런식으로 c 언어에서 포인터역할과 같은역할을 합니다.
mov rax, rbp-0x30 (rax = 0x7fcf)
mov rax, [rbp-0x30] (rax = 10)
0x7fcf : 0x000000000000000A
이해를 돕기위한 예제입니다. 물론 위의 명령어는 잘못된명령어입니다.
rbp-0x30 은 값(0x7fcf)을 저장하고, [rbp-0x30] 은 값에있는 값(10)을 저장합니다.
INDIRECT MODE, DIRECT MODE
위에서 INDIRECT 에 대한 설명을 했습니다.
DIRECT 모드와 INDIRECT 모드는 C 언어의 포인터와 같은개념입니다.
중괄호 [] 로 INDIRECT 어드레싱을 한다고 표시하기도 합니다. (위의 INTEL ASSEMBLY 처럼)
DIRECT 모드는 LOAD r0, 0x10 처럼 0x10 에 있는값을 직접 가져오는것이고,
INDIRECT 모드는 LOAD r0, [0x10] 처럼 0x10 에 있는주소에있는값을 가져오는것이다.
예제로 이해해보자.
0x10 : 0x0
0x20 : 0xB
0x30 : 0x0
.
.
.
0x100 : 0xA
메모리구조가 위와 같다고 생각해봅시다.
int a=0xA; (0x100 -> 0xA)
int b=0xB; (0x20 -> 0xB)
int c=a+b; (0x30 -> 0x0)
위 예제 와 같다고 생각해봅시다. 우리가 디자인한 LOAD 명령어는 2byte 이고, destination 은 1byte 크기입니다.
1byte 의 최대값은 0x80 이여서, LOAD r0, 0x100 으로 a 값을 DIRECT 로 가져올 수 없습니다.
하지만 레지스터는 2byte 표현이 가능하니, 레지스터를 통해 값을 INDIRECT 모드로 가져와야합니다.
MUL r0,4,4; (0x10 (16))
MUL r1,4,4; (0x10 (16))
MUL r2,r0,r2; (0x100 (256))
STORE r2, 0x10; (0x10 = 0x100)
LOAD r0, [0x10]; (0x10 -> 0x100 -> 0xA)
LOAD r1, 0x20;
ADD r2, r0, r1;
STORE r2, 0x30
코드가 더 길어졌습니다. 먼저 곱하기연산을 통해 r2 에 0x10*0x10 = 0x100 을 저장합니다.
r2 (0x100)를 0x10 주소에 저장하고,
r0 에 LOAD r0, [0x10] 으로, 아까 말했다싶이, 0x10 에 있는 주소(0x100) 에있는 값(0xA) 를 가져옵니다.
LOAD r0, [r2] 처럼 값을 가져올수도있지만, destination 에는 메모리주소만 오기로 제한했습니다.
그리고 방금과같이 r1 에 0x20 에있는값 (0xB) 를 저장하고, 더한뒤 0x30 에 결과값을 넣습니다.
이로서 제한된 비트수로 큰수를 표현하고 메모리참조하는 방법을 알아봤습니다.
처음말했다싶이, 임베디드 시스템처럼 제한된환경에서 성능효율을 위해 이러한 제약을 두고 설계하기도합니다.
이러한 설계방식도 알아두는것이 좋겠죠?
#윤성우 윈도우시스템 프로그래밍 바탕으로 제작되었습니다.