주소지정 방식과 유효주소 계산
즉시·직접·간접·레지스터·상대·인덱스·베이스 주소지정의 유효주소를 계산한다.
1. 주소지정 방식의 목적
명령어의 operand 필드가 실제 데이터, 데이터가 있는 메모리 주소, 주소를 가진 레지스터 중 무엇을 뜻하는지 결정하는 규칙이다. 유효주소(EA)와 메모리 접근 횟수는 주소 지정 방식을 비교하는 핵심 기준이다.
2. 주요 방식
즉시 주소지정
명령어 안에 데이터 값 자체가 있다.
operand = A
별도 피연산자 메모리 접근이 없고 빠르지만 표현 가능한 값 크기가 명령어 필드에 제한된다.
직접 주소지정
주소 필드 A가 실제 메모리 주소이다.
EA = A, operand = M[A]
간접 주소지정
주소 필드가 실제 주소를 저장한 메모리 위치이다.
EA = M[A], operand = M[EA]
피연산자까지 얻으려면 보통 추가 메모리 접근이 필요하다.
레지스터 주소지정
명령어가 지정한 레지스터에 데이터가 있다. CPU 내부 접근이므로 빠르지만 레지스터 수가 제한된다.
레지스터 간접 주소지정
지정 레지스터의 값이 메모리 유효주소이다.
EA = R
상대 주소지정
PC와 변위 A를 더한다.
EA = PC + A
분기 명령과 위치 독립 코드에 유용하다.
인덱스 주소지정
배열·테이블 접근에 사용한다.
EA = A + IX
베이스 주소지정
프로그램·세그먼트의 기준 위치와 변위를 더한다.
EA = BR + A
묵시·스택 주소지정
피연산자가 명령어에 명시되지 않고 누산기, 상태 플래그, 스택 최상단 등으로 정해진다.
3. 계산 예시
주소 필드 A=40, PC=1000, 인덱스 레지스터 IX=6, 베이스 레지스터 BR=2000이고 M[40]=500이라면 다음과 같다.
| 방식 | 유효주소 또는 값 |
|---|---|
| 즉시 | 값 40 |
| 직접 | EA 40 |
| 간접 | EA 500 |
| 상대 | EA 1040 |
| 인덱스 | EA 46 |
| 베이스 | EA 2040 |
4. 유효주소와 피연산자 접근 횟수
문제에서 “명령어 인출은 제외하고 피연산자를 얻기 위한 메모리 접근”을 묻는다고 가정하면 전형적으로 다음과 같다.
| 방식 | 주소 계산 | 피연산자 메모리 접근 |
|---|---|---|
| 즉시 | 값이 명령어 내부 | 0 |
| 레지스터 | 레지스터 값 | 0 |
| 직접 | EA=A | 1 |
| 레지스터 간접 | EA=R | 1 |
| 메모리 간접 | EA=M[A] | 2 |
| 2단계 간접 | EA=M[M[A]] | 3 |
캐시 적중과 페이지 테이블 접근까지 포함하는지는 별도 조건이다. “간접이면 무조건 2회”라고 외우기보다 간접 단계 수를 따라가야 한다.
5. 자동 증가·감소 주소지정
레지스터 간접 방식에 레지스터 갱신을 결합할 수 있다.
자동 증가: operand = M[R], 그 후 R ← R + d
자동 감소: 먼저 R ← R - d, 그 후 operand = M[R]
d는 피연산자 크기일 수 있다. 자동 증가는 배열·문자열을 앞에서 뒤로 순회하거나 스택 포인터를 조절하는 데 유용하다. 증가 시점이 접근 전인지 후인지 명령 정의를 확인한다.
6. 베이스+인덱스+스케일
현대 ISA는 배열 구조체 접근을 위해 다음 형태를 제공하기도 한다.
EA = Base + Index×Scale + Displacement
Base=1000, Index=7, Scale=4, Displacement=12이면 EA=1000+28+12=1040이다. Scale은 1,2,4,8처럼 원소 크기에 맞춰 사용되는 경우가 많다.
7. PC 상대 변위와 부호 확장
16비트 signed 변위 0xFFFC는 -4로 해석된다. 다음 명령어 주소가 PC=1000이면 분기 대상은 996이다. 변위를 단순 unsigned 65532로 해석하면 완전히 다른 주소가 된다.
PC-relative 방식은 코드가 메모리 어디에 적재되어도 명령과 대상 사이 거리가 같아 위치 독립 코드와 재배치에 유리하다. 다만 도달 범위는 변위 비트 수와 정렬 단위에 제한된다.
8. 주소지정 추적 예제
다음 상태를 가정한다.
A=40, PC=200, R1=300, IX=5, BR=1000
M[40]=500, M[300]=77, M[500]=88
| 방식 | EA | operand |
|---|---|---|
| 즉시 40 | 없음 | 40 |
| 직접 40 | 40 | 500 |
| 간접 40 | 500 | 88 |
| R1 간접 | 300 | 77 |
| PC 상대 +40 | 240 | M[240] |
| 인덱스 40(IX) | 45 | M[45] |
| 베이스 40(BR) | 1040 | M[1040] |
EA와 최종 operand를 같은 값으로 적지 않도록 표를 두 단계로 계산한다.
9. 스택·묵시 주소 방식
0주소 스택 머신에서 PUSH A; PUSH B; SUB는 일반적으로 스택의 두 값을 꺼내 A-B 순서로 계산해야 한다. 연산자의 좌우 순서가 있는 뺄셈·나눗셈에서 pop 순서를 주의한다. 누산기 기반 1주소 명령은 한 피연산자가 ACC로 묵시된다.
10. 정렬과 주소 계산
4바이트 정수가 4바이트 정렬을 요구하면 주소는 4의 배수여야 한다. 구조체는 각 필드 정렬을 맞추기 위해 padding을 넣을 수 있어 단순히 필드 크기 합과 구조체 크기가 같지 않을 수 있다. 배열 인덱스 주소 계산 문제에서 원소 크기와 시작 인덱스를 반드시 반영한다.
최종 확인 문제
- Base=400, Index=6, Scale=8, Displacement=-16일 때 유효주소를 구하시오.
- 피연산자 메모리 접근만 셀 때 2단계 메모리 간접 주소지정은 일반적으로 몇 회 접근하는가?
- 16비트 signed 변위
0xFFF8과 다음 명령 PC=1000을 사용하는 PC-relative 분기 주소를 구하시오. - 자동 증가 주소지정에서 R=200, 피연산자 크기 4바이트일 때 접근 주소와 접근 후 R 값을 쓰시오.
M[20]=300,M[300]=7일 때 주소 필드 20의 직접 주소지정과 간접 주소지정의 operand를 각각 구하시오.