본문 바로가기
Program

[Program] (윈도우 시스템 프로그래밍) 메모리 참조 명령어 디자인

by snwo 2020. 10. 22.
  • 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 에 결과값을 넣습니다.

 

이로서 제한된 비트수로 큰수를 표현하고 메모리참조하는 방법을 알아봤습니다.

처음말했다싶이, 임베디드 시스템처럼 제한된환경에서 성능효율을 위해 이러한 제약을 두고 설계하기도합니다.

이러한 설계방식도 알아두는것이 좋겠죠?

 

 

#윤성우 윈도우시스템 프로그래밍 바탕으로 제작되었습니다.