minhui study

2부 4장 - 2. 레지스터와 명령어에 대한 깊이 있는 이해 본문

컴퓨터 구조/Windows System Programming

2부 4장 - 2. 레지스터와 명령어에 대한 깊이 있는 이해

minhui 2020. 1. 23. 14:35

Section 03. Direct 모드와 Indirect 모드

지금까지 우리가 언급한 메모리 접근방법을 가리켜 Direct모드라 하는데 이 방법을 통해서는 메모리의 모든 영역에 대한 접근이 불가능하다. 왜냐하면 위 그림을 보면 3개의 비트 수로 표현되는 destination부분은 레지스터 갯수가 총 8개여서 문제 될 것이 없지만 메인 메모리 주소값을 나타내는 soure부분에는 표현할 수 있는 값의 범위가 0x0000에서부터 0x00ff까지가 전부이기 때문에 0x100번지에 저장되어 있는 데이터를 참조하고자 한다면 문제가 되기 때문이다.

Direct모드에서는 레지스터에 저장할 데이터가 존재하는 주소를 직접적으로 표현하였는데 반대로 Indirect모드에서는 명령어에서 지정하는 번지에 저장된 값을 주소값으로 참조하게 된다. 그림으로 나타내면 다음과 같다.

이것이 기본적인 LOAD명령어의 Direct 모드 메모리 참조방식이다.

Direct Addressing Mode

다음 그림은 LOAD 명령어의 Indirect 모드를 설명하고 있다. 

Indirect Addressing Mode

위의 두 그림을 비교해보면, 명령어에서 표현하고 있는 0x10번지에서 값을 읽어오는 것이 아니라 0x10번지에 저장된 값을 주소값으로 참조해서 값을 읽어오고있다. 이것이 Indirect모드 메모리 참조방식이다. 

Indirect모드 그림을 보면 피연산자 0x10를 [] 기호로 감싸고 있다. 이는 Indirect모드 연산을 의미하게 된다. 

 

첫 두 비트의 용도를 결정하지 않았으므로 이 영역을 활용하여 Indirect 모드와 Direct 모드 연산을 구분할 수 있다.

지금까지 LOAD 명령어를 기준으로 Indirect모드를 설명하였는데 이는 STORE 명령어에도 동일하게 적용된다.

 

STORE 명령어의 Indirect Addressing 예

 

 > Indirect 모두 활용 예제

 

Indirect Mode 연산이 필요한 상황

① 0x0010(a)번지와 0x0100(b)번지에 저장되어 있는 값을 각각 레지스터 r1, r2로 이동한다. 

    LOAD  r1,  0x0010

    LOAD  r2, 0x0100

 

 -> 0x0010번지에 저장된 데이터를 r1으로 이동시키는 명령어는 문제될 것이 없지만 문제는 두번째 명령어이다.

     source표현을 위해 8비트를 할당하였는데 0x100은 표현할 수 없기 때문이다. 

     이 때 Indirect모드를 도입하면 해결가능하다. LOAD  r2, 0x0100 를 대신할 명령어들을 조합해보자

     0x0100은 십진수로 256이니 이 숫자를 만들어 내야 한다.

         

          Mul  r0,  4,  4  // r1에는 데이터 0x0010이 저장되어 있으므로 r0에 연산결과를 저장

          Mul  r2,  4,  4 

          Mul  r3,  r0,  r2  // r3 = 16 * 16 = 256

 

      이제 r3에 저장된 주소값을 참조하여 메모리로부터 값을 읽어다가 레지스터 r2로 저장하면 된다.

 

② 레지스터 r1과 r2에 있는 값을 더해서 레지스터 r3에 저장한다.

③ 레지스터 r3에 저장된 값을 0x0020(c)번지에 저장한다.

 

위의 예제에서 c = a + b에 해당하는 명령어 조합을 정리하면 다음과 같다.

 

    LOAD  r1,  0x0010

   

    Mul  r0,  4,  4   

    Mul  r2,  4,  4 

    Mul  r3,  r0,  r2  

 

    STORE  r3, 0x0030 

// 레지스터 r3에 저장된 주소 데이터를 다시 메인 메모리로 옮겨다 놓는데 표현할 수 있는 범위를 선택한다. 

    LOAD  r2, [0x0030]

// 메인 메모리를 Indirect모드로 참조해서 값을 읽어오도록 LOAD명령어를 구성한다. 

 

    ADD  r3,  r1,  r2

 

 

출처 : 윈도우즈 프로그래밍(한빛미디어)

Comments