LISTORY

[윈도우즈 시스템 프로그래밍] Direct 모드와 Indirect 모드 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] Direct 모드와 Indirect 모드

LiStoryTeller 2018. 5. 21. 16:48


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책의 YouTube 강의 정리이다.


이번 차수는 Direct 모드와 Indirect 모드 이다.


⊙ YouTube 주소 ⊙ ☞ Direct 모드와 Indirect 모드



Direct 모드와 Indirect 모드


앞 강의들에서 설명했듯이, 명령어를 디자인 할때 피연산자를 표현할 수 있는 바이트 수를 지극히 제한했다.


피연산자에 4비트가 올수 있다고 가정하겠다.


이 4비트 중에서도 첫번째 비트는 레지스터인지 숫자인지 결정한다.


그러므로 주소, 또는 숫자를  표현할수 있는것은 3비트뿐이다. 이를 가지고 모든 주소와 숫자를 표현할 수 없다.


이 문제를 해결하기 위해 나온 것이 Direct 모드와 Indirect 모드이다.


정확히 말하자면 Direct Addressing mode이다. 어드레싱은 특정 메모리를 참조하는 것이다.


일단 Direct 모드는 레지스터에 써있는 메모리 주소로 가서 직접 데이터 값을 가져오는 것이고,


Indirect 모드는 아래에서 설명하겠다.



⊙ Direct 모드의 문제점


명령어 구성의 또 다른 문제점


int a = 10; // 0x0010 번지 할당

int b = 20; // 0x0100 번지 할당

int c = 0; // 0x0020 번지 할당

c = a + b;


앞의 강의에서는 이 코드를 사용하기 위해 LOAD 명령어를 사용해야 한다고 했다.


즉, 


LOAD r1 0x0010

LOAD r2 0x0100 


이런식의 명령어가 된다.


하지만 0x0100 은 현재 명령어에서 표현할 수 없다(너무 값이 크므로). 


다시 한번 Direct 모드를 설명해보겠다.


Direct 모드는 메모리의 주소 값을 직접 지정해서 값을 가져오는 것이다. 이를 따르면


LOAD r1 0x10


0x10 에 있는 값을 r1에 가져다 두라는 뜻이 된다.



반면 Indirect 모드는 다음과 같다.


LOAD r1 [0x10]


Indirect 모드임을 표시하기 위해 '['와 ']' 기호를 사용하였다.


이 뜻은 0x10 번지에 있는 값을 가져와서 그것을 메모리로 참조하라는 것이다.


즉 0x10 번지에 간다. 가봤더니 값이 16진수로 30이 있다.


이를 그대로 가져다 쓰면 direct 모드


이렇게 하지 않고 메모리를 참조하여 다시 30번지로 가서 그 값을 가져오는 것이 Indirect 모드이다.



그렇다면 이 방법으로 


int b = 20; //0x1000번지 할당 


여기서 발생하는 문제를 해결해 보자


앞에 코드에는 두가지 문제가 있다. 


첫번째는 주소에 직접 접근이 불가능하다는 것이고, 다른 문제 하나는 애초에 0x0100 이라는 숫자를 표현하는 것이 불가능하다는 것이다.


그래서 다음과 같은 방법을 사용하자



일단, 0X0100 을 표현하기 위해 MUL 연산자를 사용하였다.


MUL r0 4 4 => 16

MUL r2 4 4 => 16

MUL r3 r0 r2 => 256(16진수로 100)


명령어 상으로 0x100을 표현할 수는 없지만 MUL 연산자를 사용하여 256, 즉 16진수로 100을 표현하였다.


이를 r3에 넣어주고 30번지에 r3 값을 넣어준다. 


Indirect 모드를 사용하여 30번지에 있는 주소를 참조하여 그 주소에 존재하는 데이터를 r2에 넣어주도록 하였다.


위의 방법으로 int b = 20; //0x1000번지 할당 문제를 해결할 수 있다.







Comments