컴퓨터 명령어 - 주소 지정방식의 종류와 이해
명령어 주소 지정방식(Addressing mode)이란?
- 프로그램 수행 시 오퍼랜드(피연산자)를 지정하는 방법
- 오퍼랜드를 참조하기 전에 오퍼랜드를 변경하거나 해석하는 규칙을 지정
유효주소란?
주소 지정방식에 의해 결정되는 오퍼랜드의 주소
주소 지정방식 필드를 가진 명령어 형식과 필드별 설명은 다음과 같다.
주소 지정방식 필드를 가진 명령어 형식
필드 | 설명 |
연산코드 | 수행할 연산의 종류를 지정 |
주소 지정방식 | 연산에 필요한 오퍼랜드의 주소를 알아내는데 사용 |
오퍼랜드 | 연산의 대상이 되는 기억장치 주소 혹은 레지스터 |
명령어의 주소 지정방식은 컴퓨터에 따라 위와 같이 별도로 정의되기도 하고 연산방식과 공통으로 정의되기도 한다.
주소 지정방식의 종류
1. 의미 주소 지정방식
2. 즉치 주소 지정방식
3. 직접 주소 지정방식과 간접 주소 지정방식
3. 레지스터 주소 지정방식과 레지스터 간접 주소 지정방식
4. 상대 주소 지정방식
5. 인덱스된 주소 지정방식
의미 주소 지정방식(Implied mode)
- 주소필드가 필요없는 방식
- 묵시적 오퍼랜드 지정
예시 :
ADD ; TOS ← TOS + TOS-1
기억장치 스택에서 스택의 맨 위 항목과 그 아래 항목을 더해 스택의 맨 위에 저장한다.
오퍼랜드가 스택의 맨 위에 있다는 것을 묵시적으로 가정한다.
MUL X ; AC ← AC * M[X]
AC의 내용과 M[X]의 내용을 곱해 AC에 저장한다.
M[X]와 곱해지는 대상과 저장되는 위치는 모두 AC인 것을 묵시적으로 가정한다.
즉치 주소 지정방식(Immediate mode)
- 주소필드에 실제 사용할 오퍼랜드(피연산자)를 지정
- 레지스터나 변수를 상수값으로 초기화하는데 유용
예시 :
LDI 100, R1 ; R1 ← 100
레지스터 R1에 데이터 100을 초기화한다.
직접 주소 지정방식과 간접 주소 지정방식
직접 주소 지정방식(Direct-addressing mode)
- 주소필드에 오퍼랜드의 주소(=유효주소)를 직접 저장
- 장점 : 기억장치 접근이 한번에 이루어짐
- 단점 : 오퍼랜드 필드의 길이에 따라 접근할 수 있는 기억장치의 주소공간에 한계가 있음
예시 :
LDA 600 ; AC ←M[600]
M[600]을 AC로 적재한다.
직접 주소 지정방식의 예
① PC(Program counter)가 명령어가 저장된 주소 320을 갖고있으므로 320번지로 간다.
② 320번지는 연산코드(LDA = AC로 적재)와 주소 지정방식(직접 주소)을 갖고있다.
③ 321번지는 주소필드 600을 갖고있다.
④ 이 2개의 단어(word)로 구성된 명령어는 제어 레지스터로 옮겨진다.
⑤ 명령어의 수행결과는 AC ←M[600], 즉 600번지에 있는 700이 AC로 적재된다.
⑥ PC가 두 번 증가한다.
즉 오퍼랜드의 주소는 600이고 M[600]은 700이므로 AC에 700을 적재하며 명령 수행 후 PC는 다음 명령어 주소인 322를 갖게 된다. 여기서 유효주소는 명령어의 주소 부분인 600이다.
간접 주소 지정방식(Indirect-addressing mode)
- 주소필드에 유효주소가 저장되어 있는 기억장치 주소를 저장
- 장점 : 접근할 수 있는 기억장치 주소공간이 중앙처리장치가 한 번에 접근할 수 있는 단어의 길이로 결정됨
- 단점 : 두 번의 기억장치 접근 필요
예시 :
LDA [600] ; AC ← M[M[600]]
M[M[600]]을 AC에 적재한다.
만약 위 그림이 간접 주소 지정방식이라면 AC에 적재되는 것은 700이 아닌 M[700]이 된다. 즉 700번지에 저장된 데이터가 AC에 적재될 것이다.
레지스터 주소 지정방식과 레지스터 간접 주소 지정방식
레지스터 주소 지정방식(Register mode)
- 주소필드에 오퍼랜드(피연산자)가 들어있는 레지스터를 저장하는 방식
- 따라서 오퍼랜드 필드에 레지스터 번호가 저장되며 유효주소가 존재하지 않는다.
- 장점 : 오퍼랜드 필드가 적다. 기억장치가 아닌 레지스터에 접근하므로 속도가 빠름
- 특징 : 레지스터의 수가 제한되어 있으므로 무한정 사용 불가
예시 :
LDA R1 ; AC ← R1
R1의 내용을 AC에 적재한다.
레지스터 간접 주소 지정방식(Register-indirect mode)
- 주소필드에 오퍼랜드가 저장된 기억장치 주소값을 갖고 레지스터를 지정하는 방식
- 따라서 이 방식에서 유효주소는 지정된 레지스터에 있는 주소이다.
예시 :
LDA (R1) ; AC ← M[R1]
기억장치의 R1번지에 있는 값을 AC에 적재한다.
상대 주소 지정방식(Relative addressing mode)
- 유효주소를 계산하기 위해 특정 레지스터의 내용에 명령어 주소필드 값을 더하는 방식
- 특정 레지스터는 PC(Program counter)를 주로 사용
- 유효주소 = 명령어 오퍼랜드 + PC
- 장점 : 적은 비트수로 표현할 수 있기 때문에 간결한 명령어 구성 가능
- 특징 : 분기주소가 명령어 단어와 가까운 위치에 있을 때 분기형 명령어에서 종종 사용
예시 :
LDA $ADRS ; AC ← M[ADRS + PC]
기억장치의 ADRS + PC번지에 있는 값을 AC에 적재한다.
기억장치로부터 명령어를 읽음으로써 PC가 증가하므로 유효주소를 계산할때 반드시 이를 고려해야한다.
인덱스된 주소 지정방식(Indexed addressing mode)
- 유효주소를 계산하기 위해 인덱스 레지스터의 내용에 명령어 주소필드 값을 더하는 방식
- 유효주소 = 명령어 오퍼랜드 + 인덱스 레지스터
- 특징 : 배열을 인덱싱할 때 많이 사용
예시 :
LDA ADRS(R1) ; AC ← M[ADRS + R1]
기억장치의 ADRS + R1번지에 있는 값을 AC에 적재한다.
참고 : 인덱스된 주소 지정방식의 변형으로 베이스 레지스터 주소 지정방식(Base-register mode)가 있다. 이 방식에서는 베이스 레지스터의 내용에 명령어 주소필드 값을 더하여 유효주소를 계산한다. 이 방식은 인덱스 레지스터 대신 베이스 레지스터가 사용된다. 인덱스 레지스터가 명령어 주소필드에 대한 상대적인 위치값을 갖는 반면 베이스 레지스터는 명령어 주소필드로부터의 상대적인 변위값을 갖는다.
주소 지정방식 정리
주소 지정방식 | 설명 | 유효주소 |
의미 주소 지정방식 | 묵시적으로 오퍼랜드를 지정하여 주소필드가 필요 없음 | 없음 |
즉치 주소 지정방식 | 주소필드에 실제 오퍼랜드(피연산자)를 지정 | 오퍼랜드 값이 저장된 기억장치 주소 |
직접 주소 지정방식 | 주소필드에 오퍼랜드의 주소(유효주소)를 지정 | 주소필드 값 |
간접 주소 지정방식 | 주소필드에 유효주소가 저장되어 있는 기억장치 주소를 지정 | 주소필드 값이 가리키는 기억장치 값 |
레지스터 주소 지정방식 | 주소필드에 오퍼랜드(피연산자)가 들어있는 레지스터를 지정하는 방식 | 없음 |
레지스터 간접 주소 지정방식 | 주소필드에 오퍼랜드가 저장된 기억장치 주소값을 갖고 레지스터를 지정하는 방식 | 레지스터에 있는 주소 |
상대 주소 지정방식 | 특정 레지스터의 내용에 명령어 주소필드 값을 더하는 방식 | 주소필드 + PC |
인덱스된 주소 지정방식 | 인덱스 레지스터의 내용에 명령어 주소필드 값을 더하는 방식 | 주소필드 + IR |
그림을 보고 아래 표에서 유효주소와 AC로 적재되는 오퍼랜드 값을 작성해 보자. R1이 인덱스 레지스터라고 가정한다. LDA는 AC로의 로드(load-to-accumulator)를 의미하는 연산코드 기호이다.
정답 ▼
① 즉치주소 : 251번지의 오퍼랜드 500이 AC로 로드된다.
② 직접주소 : 유효주소가 500이 되며, 800이 AC로 로드된다.
③ 간접주소 : 유효주소가 800이 되며, 300이 AC로 로드된다.
④ 상대주소 : 유효주소가 500 + (250 + 2)가 되며, 600이 AC로 로드된다.
⑤ 인덱스 주소 : 유효주소가 500 + 400이 되며, 200이 AC로 로드된다.
⑥ 레지스터 주소 : 유효주소가 존재하지 않으며, 400이 AC로 로드된다.
⑦ 레지스터 간접주소 : 유효주소가 400이 되며, 700이 AC로 로드된다.
참고 서적
컴퓨터구조(김형근·손진곤, 한국방송통신대학교출판문화원)
'IDE Tool > IntelliJ IDEA' 카테고리의 다른 글
[Intellij] - 디버깅 시 값 확인하는 법(Evaluate) (0) | 2021.12.10 |
---|---|
d2 coding 글꼴 적용(맥 / 인텔리제이) (0) | 2021.11.12 |
[IntelliJ] MAC 단축키 (0) | 2021.11.12 |
IntelliJ cannot resolve symbol.. 에러 해결 (0) | 2021.05.21 |
IntelliJ에서 Commit 시 Reformat code 옵션과 Rearrange code 옵션의 차이 (0) | 2021.04.20 |
[IntelliJ] VCS(Git) 사용 시 느림, 멈춤 현상 조치 방법 (1) | 2021.04.20 |
IntelliJ 프로젝트 소스 디렉토리(src) 설정 방법 (0) | 2021.04.20 |
IntelliJ로 Archetype을 사용해서 Maven 프로젝트 쉽게 만드는 방법 (0) | 2021.04.20 |