CPU 주소지정방식과 유효 주소 계산
CPU 주소지정방식의 즉치·직접·간접·변위 접근법과 유효 주소 계산, CISC·RISC의 주소 모드 차이를 정리한다.
2026-08-14 · 최초 발행 2026-01-16
명령어가 오퍼랜드 위치를 해석하는 방법
Address Mode, 즉 주소지정방식은 CPU가 명령어를 실행할 때 연산 대상이 메모리와 레지스터 중 어디에 있는지를 찾는 규칙이다. 주소를 명령어에 그대로 넣을 수도 있고, 레지스터 값이나 변위를 조합해 최종 주소를 계산할 수도 있다. 이 선택은 명령어 길이, 메모리 접근 횟수, 접근 가능한 주소 범위, 프로그램의 유연성에 직접 영향을 준다.
주소지정방식은 오퍼랜드 위치를 정하는 데서 끝나지 않는다. 유효 주소를 어떤 방식으로 계산할지, 명령어 형식을 어떻게 구성할지, 서로 다른 데이터 접근 패턴을 어디까지 지원할지도 함께 결정한다.
유효 주소(Effective Address)는 명령어 실행 중 실제로 참조되는 메모리 주소다. 방식마다 이 주소를 얻는 과정이 다르다.
명령어 안에 값이나 위치를 직접 담는 방식
즉치 주소지정(Immediate Addressing)은 오퍼랜드 자체를 명령어에 포함한다. 데이터가 명령어의 일부로 인코딩되므로 추가 메모리 접근이 필요 없고, 고정된 상수 값을 다룰 때 적합하다. 다만 표현할 수 있는 값의 범위는 명령어 길이에 제한된다.
MOV R1, #100 ; R1 레지스터에 상수 100을 저장
ADD R2, #5 ; R2에 상수 5를 더함
직접 주소지정(Direct Addressing)은 명령어에 메모리 주소를 포함하고, 그 주소에 있는 값을 오퍼랜드로 사용한다. 주소 계산 없이 지정된 위치에 접근할 수 있어 구조는 단순하지만, 주소 필드 크기가 접근 가능한 범위를 제한한다. 전역 변수 접근에 활용할 수 있다.
LOAD R1, 1000 ; 메모리 주소 1000의 값을 R1에 로드
STORE R2, 2000 ; R2의 값을 메모리 주소 2000에 저장
레지스터 주소지정(Register Addressing)은 오퍼랜드를 CPU 레지스터에서 찾는다. 레지스터 번호만 명시하면 되므로 명령어를 짧게 구성할 수 있고, CPU 내부의 값을 대상으로 하므로 빠르다. 반면 레지스터 수와 저장 공간은 제한되어 있어 자주 사용하는 데이터에 적합하다.
ADD R1, R2, R3 ; R2 + R3의 결과를 R1에 저장
MOV R4, R5 ; R5의 값을 R4로 복사
묵시적 주소지정(Implied/Implicit Addressing)에서는 오퍼랜드 위치가 명령어에 이미 정해져 있다. 별도의 주소 필드가 없으므로 명령어가 짧아지지만, 누산기나 스택 포인터처럼 정해진 레지스터와 특수 목적 명령어에만 적용할 수 있다.
INC ; 누산기(ACC) 값을 1 증가
POP ; 스택에서 값을 팝하여 ACC에 저장
RET ; PC를 스택에서 복원
주소를 한 번 더 따라가는 간접 접근
간접 주소지정(Indirect Addressing)은 명령어의 주소가 데이터 자체가 아니라 실제 데이터 주소를 보관한 메모리 위치를 가리킨다. 먼저 주소를 읽고 다시 데이터를 읽으므로 2회 메모리 접근이 필요하다. 그 대가로 포인터 크기만큼 주소 공간을 확장할 수 있고, 동적 데이터 구조를 다루는 데 사용할 수 있다.
LOAD R1, @1000 ; 주소 1000의 값(5000)을 읽고, 다시 5000의 값을 R1에 로드
레지스터 간접 주소지정(Register Indirect Addressing)은 레지스터에 든 값을 메모리 주소로 쓴다. 주소는 레지스터에서 얻고 메모리는 1회만 접근하므로, 간접 주소지정보다 효율적이다. 레지스터 값을 바꾸면서 다양한 위치를 가리킬 수 있어 배열과 포인터 처리에 맞는다.
LOAD R1, (R2) ; R2에 저장된 주소의 메모리 값을 R1에 로드
STORE R3, (R4) ; R3의 값을 R4가 가리키는 주소에 저장
변위로 유효 주소를 계산하는 경우
변위 주소지정(Displacement Addressing)은 기준 주소와 오프셋을 더해 유효 주소를 만든다. 기준으로 무엇을 쓰는지에 따라 상대, 베이스 레지스터, 인덱스 주소지정으로 나뉜다.
상대 주소지정(Relative Addressing)은 프로그램 카운터(PC)에 변위를 더한다. 현재 명령어 위치를 기준으로 주소를 잡기 때문에 위치 독립 코드와 재배치 가능한 프로그램에 맞으며, 분기 명령어의 짧은 점프에 주로 사용한다. 점프할 수 있는 범위는 변위 필드 크기에 따라 제한된다.
JMP +10 ; 현재 PC에서 10바이트 앞으로 점프
BNE -20 ; 조건 충족 시 20바이트 뒤로 점프
베이스 레지스터 주소지정(Base Register Addressing)은 베이스 레지스터 값에 변위를 더한다. 데이터 영역의 시작 주소를 기준으로 삼거나, 구조체의 필드를 베이스와 오프셋으로 찾아갈 때 쓸 수 있다. 런타임에 베이스 값을 바꾸는 동적 재배치도 지원한다.
LOAD R1, 100(R5) ; R5 + 100 주소의 값을 R1에 로드
; 구조체에서 100번째 바이트 오프셋 멤버 접근
인덱스 주소지정(Indexed Addressing)은 인덱스 레지스터 값과 기본 주소를 더한다. 배열 요소를 순회하는 작업에 적합하며, 일부 아키텍처는 인덱스의 자동 증가와 감소를 지원한다.
LOAD R1, Array(R6) ; Array 주소 + R6 값 위치의 데이터 로드
; R6를 증가시키며 배열 순회
접근 비용과 주소 범위를 함께 보는 비교
| 주소지정방식 | 유효 주소 | 메모리 접근 | 주소 범위 | 주요 용도 |
|---|---|---|---|---|
| 즉치 | 명령어 내 포함 | 0회 | N/A | 상수 연산 |
| 직접 | EA = 주소 필드 | 1회 | 제한됨 | 전역 변수 |
| 레지스터 | EA = 레지스터 | 0회 | N/A | 빈번한 연산 |
| 묵시적 | 고정됨 | 0회 | N/A | 스택 연산 |
| 간접 | EA = (주소 필드) | 2회 | 확장 가능 | 포인터 |
| 레지스터 간접 | EA = (레지스터) | 1회 | 확장 가능 | 동적 접근 |
| 상대 | EA = PC + 변위 | 1회 | 제한됨 | 분기 명령 |
| 베이스 | EA = Base + 변위 | 1회 | 확장 가능 | 구조체 |
| 인덱스 | EA = Index + 변위 | 1회 | 확장 가능 | 배열 |
즉치와 레지스터 방식은 빠른 접근에 유리하고, 직접·변위 방식은 그보다 유연한 주소 계산을 제공한다. 레지스터 간접과 간접 방식은 동적 접근 범위를 넓히지만, 특히 간접 방식은 주소를 얻기 위한 추가 메모리 접근이 따른다.
CISC와 RISC가 주소 계산을 다루는 차이
| 구분 | CISC (x86) | RISC (ARM, MIPS) |
|---|---|---|
| 주소 모드 | 다양하고 복잡 | 단순하고 제한적 |
| 메모리 연산 | 복합 명령어 지원 | Load/Store 아키텍처 |
| 예시 | MOV [EBX+ESI*4+8], EAX | LDR R1, [R2, R3, LSL #2] |
| 특징 | 하나의 명령어로 복잡한 주소 | 별도 명령어로 주소 계산 |
x86은 여러 주소지정방식을 조합해 복잡한 유효 주소 계산을 지원한다.
유효 주소 = Base + (Index * Scale) + Displacement
Base: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
Index: EAX, EBX, ECX, EDX, ESI, EDI, EBP (ESP 제외)
Scale: 1, 2, 4, 8
Displacement: 8비트 또는 32비트
MOV EAX, [EBX] ; 레지스터 간접
MOV EAX, [EBX+8] ; 베이스 + 변위
MOV EAX, [EBX+ECX*4] ; 베이스 + 인덱스*스케일
MOV EAX, [EBX+ECX*4+100] ; 베이스 + 인덱스*스케일 + 변위
ARM은 Load/Store 아키텍처를 사용하며, 메모리 접근은 LDR/STR 명령어로만 수행한다. 오프셋, 프리 인덱스, 포스트 인덱스, 레지스터 오프셋, 스케일드 레지스터 모드를 지원한다.
- 오프셋: [Rn, #offset]
- 프리 인덱스: [Rn, #offset]!
- 포스트 인덱스: [Rn], #offset
- 레지스터 오프셋: [Rn, Rm]
- 스케일드 레지스터: [Rn, Rm, LSL #2]
데이터 접근 패턴이 주소 모드를 고르는 방식
컴파일러는 상수 연산에는 즉치 주소지정을, 지역 변수에는 스택 프레임 기준의 변위 주소지정을 선택할 수 있다. 배열 순회에는 인덱스 주소지정, 포인터 역참조에는 레지스터 간접, 전역 변수에는 직접 또는 PC 상대 방식이 대응한다.
ISA를 설계할 때는 주소지정방식의 종류와 복잡도가 명령어 인코딩 효율성, 하드웨어 구현 복잡도, 컴파일러 최적화 용이성, 코드 밀도, 실행 성능에 어떤 영향을 주는지 함께 고려해야 한다.