Computer architecture

Addressing mode (주소 지정 방식)

TechNote.kr 2017. 9. 14. 16:20
728x90

 컴퓨터 구조 관련 공부를 하다보니 주소 지정 방식에 여러 가지가 있는 것을 보게 되었다. 한글로 된 주소 지정 방식 관련 글들을 보다 보면 "직접(Direct) 주소 지정 방식", "간접(Indirect) 주소 지정 방식", "레지스터(Register) 주소 지정 방식" 등 널리 알려진, 우리가 흔히 접하는 방식 대로 언급되어 있었다. 


그런데 wikipedia에서 addressing mode를 찾아 보면 방식들이 이렇게 단순하지가 않다. 해외에서 사용되는 기계들과 국내에서 사용되는 기계들이 다르지 않을 텐데 무엇때문일까.


  • 제조사별로 같은 주소 지정 방식이더라도 다른 용어를 사용 
    (혹은 다른 지정 방식이더라도 같은 용어 사용)

  • Architecture 별로 서로 다른 주소 지정 방식(addressing mode) 종류 사용
    대다수의 RISC archirecture : 5 simple addressing modes
    CISC architectures (DEC VAX) : over a dozen addressing modes
    IBM System/360 : 3 addressing modes


Wikipedia 영문판에 따르면 다음과 같은 addressing mode 가 있다. 
특정 architecture에 국한하지 않게 code access를 위한 address, data access를 위한 address 등으로 분류하여 성명해 놓았다. 

  • 명령어 주소 지정 방식 (simple addressing modes for code)
    • 절대/직접 주소 지정 (absolute/direct)
    • 프로그램 카운터 상대 주소 지정 (PC-relative)
    • 레지스터를 통한 간접 주소 지정 (Register indirect)
  • 데이터 주소 지정방식 (simple addressing modes for data)
    • 레지스터 직접 사용 (Register direct)
    • 베이스 레지스터 기준 offset 상대 주소 지정 (Base plus offset, and variations)
    • 상수 즉시 사용 (Immediate/literal)
    • 암시적 주소 사용 (Implicit)


Simple addressing modes for code
: 프로그램 코드의 위치를 파악하기 위한 주소를 지정하는 모드


-. Absolute or direct


   +-------+------------------------------+

    | jump |             address              |

   +-------+------------------------------+

 우리가 흔히 이야기하는 직접 주소 지정 방식으로 별다른 주소 관련 연산을 하지 않고, 입력된 값을 주소로 바로 사용한다. 


-. PC-relative


   +-------+------------------------------+

    | jump |             offset                 |     jump relative

   +-------+------------------------------+

PC (program counter, next instruction address)에 저장된 주소 기준으로 offset 을 이용하여 상대적인 위치를 계산한다. offset 은 음수가 될 수도 있다. 
(loop 같은 것을 실행할 때 조건에 따라 이동할 때 유용)


-. Register indirect


   +----------+-----+

    | jumpVia |  reg |

   +----------+-----+

register에 저장된 값을 주소로 사용한다. 이와 같은 방식은 특정 subroutine call instruction 을 마치고 이전 routine으로 복귀 (return)할 때 사용하는 방식이다. return 할 주소를 특정 register 내에 저장해 놓고, 세부 instruction을 수행한 뒤 해당 register에서 다시 읽어와 원래 위치로 복귀하는 것이다. 



Simple addressing modes for data
: 데이터의 위치를 파악하기 위한 주소를 지정하는 모드


-. Register (or Register Direct)


   +------+------+-----+-----+

    | mul  | reg1 | reg2 | reg3 |      reg1 := reg2 * reg3;

   +------+------+-----+-----+

일부 architecture에서는 addressing mode로 여기지 않는 모드 이다. 왜냐하면 실질적이 주소가 표현되어 사용되는 부분이 없기 때문이다. Wikipedia 원문은 아래와 같다. 


 This "addressing mode" does not have an effective address and is not considered to be an addressing mode on some computers. In this example, all the operands are in registers, and the result is placed in a register. 


이 부분을 계속 보다 보니 제목과 같이 "simple addressing modes for data" 인 걸 보면 data가 저장되는 곳을 memory로 한정 짓지 않고, register 까지 더 넓게 보아서 register내에 있는 data를 가리키는 방법 까지 addressing mode로 표현하고 있는 것 같다. 


-. Base plus offset, and variations


   +------+-----+-----+----------------+

    | load | reg  | base |      offset      |         reg := RAM[base + offset]

   +------+-----+-----+----------------+


흔하게 일반적으로 볼 수 있는 방식으로 base register 를 바탕으로 offset을 계산한 곳의 주소를 RAM 상에서 찾아 읽어 reg 내로 적재(load)하는 것이다. 이 부분은 명확히 base + offset 으로 주소 위치를 가리키고 있다. 만약 base 가 0이라면 offset만으로 주소를 구성하게 됨으로 absolute addressing 과 같아지게 된다. 


-. Immediate/literal


   +------+-----+-----+----------------+

    | add  | reg1 | reg2|    constant     |         reg1 := reg2 + constant;

   +------+-----+-----+----------------+


첫번째 register (or register direct) 와 마찬가지로 실질적인 주소 표현이 사용되지 않는다. add 연산을 하기 위해 register 와 상수(constant)가 사용되긴 하지만 메모리 관련된 부분이 없기 때문에 별다른 주소 표현이 필요없기 때문이다. 때문에 마찬가지로 일부 architecture에서는 addressing mode로 여기지 않는다. 


-. Implicit


   +-----------------+

    | clear carry bit  |

   +-----------------+


   +---------------------+

    | clear Accumulator |

   +---------------------+



opcode만으로 이미 지정된 곳의 data를 다루는 명령어로 명시적으로 주소 표현을 사용하지 않기 때문에 implicit addressing mode 라고 한다. (X86 assembly language)



Wikipedia 의 addressing mode를 하나하나 살펴 보다 보니 우리가 computer architecture 책에서 보아오던 주소 표현 방식의 예와 다소 다름이 왜 발생하는지 알 수 있었다. 일반적으로 언급할 때는 좀 더 범용적인 표현으로 어우를 수 있는 대표적인 방식들을 언급했다면 wikipedia 의 경우는 존재하는 많은 수의 addressing mode를 비슷하더라도 구분하여 설명하고 있었다. 때문에 특정 architecture 에서 좀 더 자세히 봐야하는 경우는 wikipedia 가 도움이 될 수 있겠지만 학습하는 입장에서는 다소 혼란스러울 수 있는 부분도 있어 보였다. 


Reference


https://en.wikipedia.org/wiki/Addressing_mode

728x90