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를 더함
명령어Opcode오퍼랜드(즉치값)레지스터또는 ALU

직접 주소지정(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회 메모리 접근이 필요하다. 그 대가로 포인터 크기만큼 주소 공간을 확장할 수 있고, 동적 데이터 구조를 다루는 데 사용할 수 있다.

메모리1차 접근2차 접근주소 1000(주소 5000 저장)주소 5000(실제 데이터)명령어주소=1000주소 5000 획득데이터 획득
LOAD R1, @1000  ; 주소 1000의 값(5000)을 읽고, 다시 5000의 값을 R1에 로드

레지스터 간접 주소지정(Register Indirect Addressing)은 레지스터에 든 값을 메모리 주소로 쓴다. 주소는 레지스터에서 얻고 메모리는 1회만 접근하므로, 간접 주소지정보다 효율적이다. 레지스터 값을 바꾸면서 다양한 위치를 가리킬 수 있어 배열과 포인터 처리에 맞는다.

LOAD R1, (R2)   ; R2에 저장된 주소의 메모리 값을 R1에 로드
STORE R3, (R4)  ; R3의 값을 R4가 가리키는 주소에 저장

변위로 유효 주소를 계산하는 경우

변위 주소지정(Displacement Addressing)은 기준 주소와 오프셋을 더해 유효 주소를 만든다. 기준으로 무엇을 쓰는지에 따라 상대, 베이스 레지스터, 인덱스 주소지정으로 나뉜다.

변위 주소지정Displacement Addressing상대 주소지정Relative베이스 레지스터Base Register인덱스 주소지정IndexedEA = PC + 변위EA = Base + 변위EA = Index + 변위

상대 주소지정(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]
ARM Load/StorePre-indexed[Rn, #off]!Rn 먼저 갱신Post-indexed[Rn], #off접근 Rn 갱신Offset[Rn, #off]Rn 불변

데이터 접근 패턴이 주소 모드를 고르는 방식

컴파일러는 상수 연산에는 즉치 주소지정을, 지역 변수에는 스택 프레임 기준의 변위 주소지정을 선택할 수 있다. 배열 순회에는 인덱스 주소지정, 포인터 역참조에는 레지스터 간접, 전역 변수에는 직접 또는 PC 상대 방식이 대응한다.

ISA를 설계할 때는 주소지정방식의 종류와 복잡도가 명령어 인코딩 효율성, 하드웨어 구현 복잡도, 컴파일러 최적화 용이성, 코드 밀도, 실행 성능에 어떤 영향을 주는지 함께 고려해야 한다.

주소지정방식CPU유효 주소컴퓨터구조명령어 집합