[컴퓨터 구조] 어드레싱 모드와 여러 주소 명령어

LeeJaeHoon·2022년 6월 8일
0

어드레싱 모드

컴퓨터의 각 명령은 다양한 오퍼랜드 형식을 가지고 있다. 예를 들어 ARM 프로세서의 add 명령은 다음과 같은 형식을 갖고 있다.

add r0, r1, r2
add r0, r1, #5
add r0, r1, r2 lsl #3

이와 같이 하나의 명령에 대해 다양한 오퍼랜드 형식이 있으며, 오퍼랜드는 레지스터, 상수, 쉬프트, 메모리 주소 등이 될 수 있다.

오퍼랜드를 지정하는 다양한 방식을 어드레싱 모드 addressing mode 라고 한다.

레지스터 모드 register mode

오퍼랜드가 레지스터인 경우를 말한다. 다음 명령은 세 개의 오퍼랜드를 가지고 있는데, 오퍼랜드가 모두 레지스터다. 이 명령에서 사용된 어드레싱 모드는 레지스터 모드다.

add r0, r1, r2

즉치 卽値 모드 immediate mode

상수도 오퍼랜드가 될 수 있다. 레지스터나 메모리에 들어있는 값이 아니라 명령어에 바로 들어있는 값이므로 즉치 卽値 모드, 즉 immediate mode 라고 부른다. 다음 명령에서는 레지스터 모드와 immediate 모드가 함께 사용되고 있다.

add r0, r1, #5

PC-relative 모드

프로그램 카운터 PC 를 기준으로 얼마만큼 떨어져 있는 주소가 오퍼랜드 일 수 있다. 이런 주소 지정법을 PC-relative 모드라고 부른다. 그림 7.8에서 보았듯이 ARM 프로세서의 분기 명령은 PC-relative 모드를 사용한다.

b L1

레지스터 간접 모드 register indirect mode

레지스터가 가리키는 번지가 오퍼랜드인 경우도 있다. 이런 주소 지정법을 레지스터 간접 모드 register indirect mode 라고 한다. 다음 명령에서는 레지스터 r1 이 가리키는 메모리 번지의 내용이 r0 로 이동한다. 이 명령에서는 register 모드와 register indirect모드가 함께 사용되고 있다.

ldr r0, [r1]

memory direct mode

memory direct mode 는 메모리 절대 주소가 오퍼랜드로 사용되는 것을 말한다. 예를 들어 다음 명령을 보자.

다음 명령에서 L1 에 해당되는 기계어 항목이 PC 를 기준으로 한 상대적 위치를 나타낸다면 PC-relative 모드이며, PC 와 관계없이 메모리의 절대적 위치를 나타낸다면 memory direct 모드이다.

jmp L1

memory indirect mode

memory indirect mode 는 메모리에 있는 값이 가리키는 번지가 오퍼랜드인 경우를 말한다. 예를 들어 다음 명령을 보자.

add a, b, @c

위 명령에서는 메모리 b 번지에 있는 내용과, 메모리 c 번지에 있는 내용이 가리키는 번지의 내용이 더해져서 메모리 a 번지에 저장된다. 예를 들어 a 는 메모리 20번지, b는 30번지, c 는 40번지에 해당되고, 40번지에 들어있는 값이 50이라면 위 명령의 실행결과 메모리 30번지의 내용과 메모리 50번지의 내용이 더해져서 그 결과가 메모리 20번지에 저장된다. 이 명령에서는 memory direct mode 와 memory indirect mode 가 각각 사용되었다.

implicit mode

영어 단어 implicit 은 감추어진, 함축적인 등의 뜻을 갖는다. 따라서 implicit mode 란 오퍼랜드가 감추어져 있는 모드를 말한다. 예를 들어 다음 명령을 보자.

stop

위 명령은 stop, 즉 멈추게 한다는 뜻인데, 무엇을 멈추게 하는 것일까? stop 은 컴퓨터 명령이므로 당연히 컴퓨터를 멈추게 하라는 뜻일 것이다. 이와 같이 동작의 대상이 너무 당연해서 감추어져 있는 주소 지정법을 implicit mode 라고 부른다.

effective address

어드레싱 모드와 관련된 컴퓨터 용어로 유효 주소 effective address 라는 것이 있다. 유효 주소란 오퍼랜드가 실제 위치하는 메모리 주소를 의미한다. 예를 들어 다음 명령을 보자.

ldr r0, [r1]

위 명령에서는 레지스터 r1 이 가리키는 메모리 번지의 내용이 레지스터 r0 로 이동한다. 만일 r1 의 내용이 50 이라면 메모리 50번지 내용이 실제 오퍼랜드인 것이다. 즉 유효 주소는 50이다.

여러 주소 명령어

add r0, r1, r2

위 명령의 의미는 레지스터 r1 과 r2 에 있는 내용을 더해서 그 결과를 레지스터 r0 에 저장하라는 것이다. 이 명령에서 r1, r2 는 source operand 이며, r0 는 destination operand 이다. 즉 이 명령에서는 두 개의 source operand와 한 개의 destination operand 등 세 개의 오퍼랜드가 있다.

ARM 에서는 데이터 처리 명령의 오퍼랜드는 레지스터라야 하는 제약이 있지만 다른 프로세서는 그런 제약이 없을 수도 있다. 즉 오퍼랜드는 레지스터일 수도 있고, 메모리의 변수일 수도 있고, 상수일 수도 있다. 일반적인 명령어 형식은 다음과 같다.

add a, b, c

위 명령의 의미는 b 와 c 를 더해 그 결과를 a 에 저장한다는 것이다. a 와 b 는 레지스터 또는 메모리의 변수일 수 있으며, c 는 레지스터, 변수, 상수 모두 가능하다.

three-address 명령

앞의 예제에서는 한 명령어에 세 개의 오퍼랜드가 있었다. 이런 명령어 형식을 three-address 명령 형식이라고 부른다. 그러나 모든 프로세서의 명령어들이 three-address 형식을 갖는 것은 아니다. 어떤 프로세서 명령어는 두 개의 오퍼랜드만 가지고 있으며, 혹은 한 개의 오퍼랜드만 갖기도 한다. 심지어는 0개의 오퍼랜드, 즉 아애 오퍼랜드가 없는 경우도 있다.

two-address 명령

add a, b

위 명령의 의미는 a 와 b 를 더해 그 결과를 a 에 저장한다는 것이다. 즉 a 는 source operand와 destination operand를 겸한다. 명령의 결과 a 의 값이 변할 수 있다.

one-address 명령

위 명령의 의미는 a 의 내용을 프로세서 내부에 있는 누산기 累算器 accumulator 라는 이름의 레지스터에 더하라는 것이다.

ARM 프로세서 내부에는 16개의 레지스터가 있지만, one-address 명령어 형식이 사용되는 프로세서 내부에는 한 개의 레지스터만 있으며 그 레지스터 이름을 누산기라고 부른다. 이런 프로세서 구조를 single accumulator organization 이라고 한다.

반면에 three-address 또는 two-address 명령어 형식을 갖는 프로세서 내부에는 그림3.6과 같이 여러 개의 레지스터들이 들어있으며, 이런 구조를 general register organization 이라고 한다.

내부에 레지스터가 하나도 없는 프로세서도 있다. 이런 형식의 컴퓨터는 레지스터 대신 메모리에 위치한 스택 stack 이라는 기억 공간을 사용한다. 이런 구조를 stack organization 이라고 한다.

zero-address 명령

add

add 명령이 실행되면 스택의 꼭대기에 있는 두개의 값이 추출되어 스택 외부에서 더해지며, 그 결과가 다시 스택의 꼭대기에 저장된다. 즉 오퍼랜드는 스택인 것이다.

three-address 형식을 사용하는 컴퓨터의 기계어 명령 길이가 가장 길고 다음은 two-address, 다음은 one-address 가 길다. zero-address 형식의 기계어 명령 길이가 가장 짧다. 같은 개수의 기계어를 메모리에 저장할 때 zero-address 형식을 따르는 것이 가장 작은 메모리를 사용하므로 메모리 절약 면에서 가장 좋다는 의미다.

그러나 다른 면도 고려해야 한다. 동일한 고수준 언어 코드를 기계어로 변환할 때 three-address 형식을 사용하는 것이 일반적으로 가장 작은 개수의 기계어로 번역된다. 작은 개수의 기계어로 번역되므로 메모리 사용을 줄일 수 있다. 다음 예제를 보자. 고수준 언어 코드로 나타낸 예제 문장은 다음과 같다.

s = x * x + y * y

three-address 형식

mul t1, x, x
mul t2, y, y
add s, t1, t2

two-address 형식

load t1, x
mul t1, x
load t2, y
mul t2, y
add t1, t2
store s, t1

one-address 형식

load x
mul x
store t1
load y
mul y
add t1
store s

zero-address 형식

push x
push x
mul
push y
push y
mul
add
pop s

예제로 제시한 고수준 언어 코드를 어셈블리 언어 또는 기계어로 번역할 때 3-address 형식의 명령이 사용된다면 세 개 명령만으로 변환할 수 있지만, 0-address형식을 사용한다면 여덟 개의 명령이 사용되어야 한다. 즉 동일한 고수준 언어 코드를3-address 명령으로 번역하면 적은 개수의 명령만으로도 충분하지만 0-address 명령으
로 번역하면 많은 개수의 명령이 소요된다는 것이다. 0-address 개별 명령의 길이는 3-address 개별 명령의 길이보다 짧지만, 고수준 언어를 번역할 때 더 많은 개수의 명령이 소요된다. 즉 0-address 형식이 항상 더 작은 메모리를 사용하는 것은 아니다. 각각의 장단점은 있지만 최근의 프로세서들은 대체로 3-address 형식을 따르고 있는 추세다.

0개의 댓글