핵심 인사이트 (3줄 요약)

  1. 본질: 변위 주소 지정 (Displacement Addressing)은 기준점이 되는 레지스터 값과 작은 변위값을 더해 EA (Effective Address)를 만드는 주소 계산 방식이다.
  2. 가치: 긴 절대 주소를 명령어마다 반복하지 않아도 되어 코드 밀도는 높아지고, 스택 프레임·구조체 필드·배열 내부 요소처럼 "기준점에서 조금 떨어진 데이터"를 매우 효율적으로 다룰 수 있다.
  3. 판단 포인트: 변위 폭, 부호 확장, 기준 레지스터 종류에 따라 베이스 레지스터·인덱스·상대 주소 지정으로 분화되므로, ISA (Instruction Set Architecture) 설계에서는 코드 크기와 주소 생성 하드웨어 복잡도를 함께 봐야 한다.

Ⅰ. 개요 및 필요성

변위 주소 지정은 "큰 주소는 레지스터에 두고, 명령어에는 그 기준점에서 얼마나 떨어져 있는지만 적는" 방식이다. 예를 들어 LOAD R0, 12(R3)라면 R3가 가리키는 기준 주소에 12를 더해 실제 메모리 위치를 찾는다. 절대 위치를 매번 적는 대신, 기준점과 거리라는 두 조각으로 주소를 표현하는 셈이다.

이 방식이 필요한 이유는 명령어 비트 수는 제한되어 있는데 메모리 주소 공간은 점점 커지기 때문이다. 직접 주소 지정 (Direct Addressing)은 해석은 단순하지만 주소 필드가 길어질수록 명령어 형식이 무거워진다. 반대로 레지스터 간접 주소 지정 (Register Indirect Addressing)은 유연하지만, 같은 객체 안의 여러 필드를 다룰 때는 정확한 주소를 매번 따로 계산하거나 갱신해야 한다. 변위 주소 지정은 기준 주소는 한 번 잡고, 근처 데이터는 작은 오프셋으로 계속 접근하게 해 주어 이 둘 사이의 간극을 메운다.

아래 그림은 왜 "절대 주소 반복"보다 "기준점 + 거리"가 더 실용적인지 보여 준다.

┌────────────────────────────────────────────────────────────────────┐
│ Why displacement addressing exists                                 │
├────────────────────────────────────────────────────────────────────┤
│ large memory space                                                 │
│ 0x0000_0000 ........................................ 0xFFFF_FFFF   │
│                                                                    │
│ direct addressing  : instruction must carry full target address    │
│ register indirect  : register must already hold exact target       │
│ displacement       : register holds region base, instruction says  │
│                      only "how far from the base?"                 │
│                                                                    │
│ result : shorter instruction + flexible access to nearby objects   │
└────────────────────────────────────────────────────────────────────┘

핵심은 주소를 둘로 쪼개는 것이다. 큰 기준점은 레지스터가 맡고, 자주 바뀌지 않는 짧은 상대 거리는 명령어가 맡는다. 그래서 함수의 지역 변수, 객체의 멤버, 스택 프레임 내부 슬롯처럼 "같은 기준점 주변의 값들"을 읽을 때 특히 효율적이다.

  • 📢 섹션 요약 비유: 변위 주소 지정은 "서울역(Base)에서 3번 출구 쪽으로 20m"라고 말하는 길찾기와 같다. 큰 위치는 한 번만 잡고, 나머지는 짧은 거리 설명으로 충분해진다.

Ⅱ. 아키텍처 및 핵심 원리

변위 주소 지정의 핵심 수식은 단순하다. EA = Base + Displacement 다. 여기서 Base는 레지스터 안의 기준 주소이고, Displacement는 명령어 안의 상수다. 변위가 음수일 수도 있으므로, 하드웨어는 보통 부호 확장 (Sign Extension)을 거친 뒤 주소 가산기에서 더한다.

구성 요소역할설계 포인트
기준 레지스터큰 주소 범위의 시작점 보관스택, 데이터 영역, 코드 위치 등 무엇을 기준으로 삼을지 결정
변위 필드기준점에서의 상대 거리 표현비트 폭이 좁으면 코드가 짧아지고, 넓으면 접근 범위가 커짐
AGU (Address Generation Unit)기준 주소와 변위를 더해 EA 생성파이프라인에서 메모리 접근 지연을 최소화해야 함
부호 확장기음수 오프셋 지원스택 프레임의 하위 방향 접근에 중요
캐시/메모리 계층최종 피연산자 제공EA 계산 뒤 실제 성능은 캐시 적중률에 크게 좌우됨

아래 그림은 전형적인 데이터 경로를 보여 준다.

┌────────────────────────────────────────────────────────────────────┐
│ Example: LOAD R0, -16(R5)                                          │
├────────────────────────────────────────────────────────────────────┤
│ instruction field      register file                               │
│   disp = -16  ─────┐    R5 = 0x7FFF_FF20                           │
│                    │            │                                  │
│                    ▼            ▼                                  │
│               sign extension   base read                           │
│                    └──────┬─────┘                                  │
│                           ▼                                        │
│                  AGU / address adder                               │
│               EA = 0x7FFF_FF20 + (-16)                             │
│                           │                                        │
│                           ▼                                        │
│                     Cache / Memory                                 │
│                           │                                        │
│                           ▼                                        │
│                         R0 <- data                                 │
└────────────────────────────────────────────────────────────────────┘

이 구조는 특히 지역성이 강한 데이터에 잘 맞는다. 함수 호출 시 스택 포인터 주변에 지역 변수가 몰려 있고, 객체의 필드는 객체 시작 주소 근처에 연속 배치되며, 배열 원소도 기준 주소에서 일정한 간격으로 이어진다. CPU는 이런 구조를 이용해 "기준점은 크게, 세부 위치는 작게" 표현함으로써 명령어를 짧게 유지한다.

또한 변위 주소 지정은 단순한 편의 기능이 아니라 파이프라인 친화적인 설계다. 현대 CPU는 명령어 해독과 동시에 AGU가 EA를 계산하도록 설계하여, 산술 논리 장치 (ALU)와 주소 계산을 일부 병렬화한다. 그래서 ISA 설계자는 변위 폭을 크게 넓히고 싶은 유혹과, AGU 지연과 명령어 인코딩 비용을 줄이고 싶은 요구 사이에서 균형을 잡아야 한다.

  • 📢 섹션 요약 비유: 변위 주소 지정은 호텔 안내가 "3층(Base) 12호실(Displacement)"로 방을 찾게 하는 것과 같다. 층과 호수를 나눠 말하니 길 찾기가 짧고 빠르다.

Ⅲ. 비교 및 연결

변위 주소 지정은 단일 기법이라기보다 "기준점 + 상대 거리"라는 공통 철학에 가깝다. 무엇을 기준점으로 쓰느냐에 따라 여러 주소 지정 방식으로 분화된다. 이 관점으로 보면 변위 주소 지정은 뒤이어 나오는 베이스 레지스터 주소 지정, 인덱스 주소 지정, 상대 주소 지정의 상위 개념이다.

방식유효 주소 계산강점약점잘 맞는 상황
직접 주소 지정 (Direct Addressing)EA = A해석이 단순긴 주소 필드 필요작은 주소 공간, 고정 데이터
레지스터 간접 주소 지정 (Register Indirect Addressing)EA = Register유연하고 빠른 포인터 접근세부 필드 접근엔 추가 계산 필요포인터 추적, 동적 구조
변위 주소 지정 (Displacement Addressing)EA = Register + Offset코드 밀도와 유연성 균형변위 범위 제한스택, 구조체, 배열 일부
베이스 레지스터 주소 지정 (Base Register Addressing)큰 기준점 + 작은 상수 변위재배치와 큰 주소 공간 대응기준 레지스터 관리 필요세그먼트, 데이터 영역
인덱스 주소 지정 (Indexed Addressing)기준 주소 + 동적 인덱스반복 순회에 강함스케일·인덱스 계산 부담배열, 루프
상대 주소 지정 (Relative Addressing)EA = PC (Program Counter) + Offset위치 독립 코드에 유리도달 범위 제한분기, 재배치 가능한 코드

다른 방식과의 경계도 중요하다. 레지스터 간접 주소 지정은 "정확한 주소가 레지스터 안에 이미 있다"는 가정에 강하지만, 변위 주소 지정은 "정확한 주소까지는 아니어도 기준점은 알고 있다"는 상황에 강하다. 그래서 구조체 필드 접근처럼 멤버 위치가 컴파일 시점에 정해져 있을 때는 변위 주소 지정이 더 자연스럽다.

반대로 동적으로 i가 계속 바뀌는 배열 순회는 순수 변위만으로는 부족하고, 인덱스 레지스터나 스케일드 인덱싱과 결합해야 한다. 또 분기 명령은 보통 PC를 기준점으로 삼는 상대 주소 지정을 사용한다. 즉 변위 주소 지정은 메모리 주소 계산의 중심 원리이고, 실제 ISA는 그 원리를 용도별로 특화한 파생형을 제공한다.

EA = anchor + displacement
        │
        ├─ anchor = base register  -> base register addressing
        ├─ anchor = PC             -> relative addressing
        └─ anchor = object/frame   -> field or stack access
  • 📢 섹션 요약 비유: 변위 주소 지정은 "어디를 출발점으로 삼느냐만 다를 뿐, 남은 길은 몇 걸음 가는가로 설명한다"는 공통 규칙과 같다. 학교를 기준으로 가면 통학길이 되고, 집을 기준으로 가면 동네 길찾기가 되는 셈이다.

Ⅳ. 실무 적용 및 기술사 판단

실무에서 변위 주소 지정이 가장 많이 드러나는 곳은 컴파일러가 만든 기계어다. 함수 지역 변수는 SP (Stack Pointer)나 프레임 포인터를 기준으로 -8, -16 같은 음수 변위로 접근하고, 객체 멤버는 객체 시작 주소를 기준으로 고정 오프셋을 더해 접근한다. 공유 라이브러리와 재배치 가능한 코드에서는 PC-relative 방식이 핵심이 되므로, 변위 주소 지정의 품질은 곧 코드 생성 품질과 연결된다.

ISA를 설계하거나 평가할 때는 다음 판단이 중요하다.

  1. 변위 필드 폭이 충분한가? 너무 좁으면 자주 추가 ADD 명령을 써서 기준 주소를 재조정해야 하므로 코드 밀도와 성능이 함께 나빠진다.
  2. 음수 변위를 자연스럽게 지원하는가? 스택 프레임과 역방향 탐색은 음수 오프셋이 없으면 불편해진다.
  3. AGU가 병목이 되지 않는가? 주소 계산이 느리면 메모리 명령이 많은 코드에서 파이프라인 전체가 눌린다.
  4. 파생 모드와의 역할 분담이 명확한가? 배열 반복은 인덱스, 분기는 PC-relative, 단순 포인터는 register indirect로 나누어야 설계가 선명해진다.

아래 흐름은 어떤 주소 지정이 더 자연스러운지 가르는 실무적 기준이다.

┌────────────────────────────────────────────────────────────────────┐
│ Choosing an addressing style                                       │
├────────────────────────────────────────────────────────────────────┤
│ Is the target near a known base?                                   │
│   ├─ yes -> displacement addressing                                │
│   │         ├─ same object/frame fields? -> fixed offset           │
│   │         └─ branch near current code? -> PC-relative            │
│   └─ no                                                            │
│        ├─ exact pointer already in register? -> register indirect  │
│        └─ element index changes every iteration? -> indexed mode   │
└────────────────────────────────────────────────────────────────────┘

안티패턴

  • 기준점 주변 데이터인데도 절대 주소를 매번 길게 인코딩하는 것
  • 변위 범위가 좁다는 이유만으로 프로그램 전체를 여러 기준 레지스터로 잘게 쪼개 레지스터 압박을 키우는 것
  • 변위 주소 지정이 "메모리 접근 자체를 없애 준다"고 오해하는 것

변위 주소 지정이 빠른 이유는 주소 표현과 계산이 효율적이기 때문이지, 데이터가 캐시와 메모리를 거치지 않아서가 아니다. 따라서 데이터 배치와 지역성을 함께 설계해야 진짜 이점이 살아난다.

  • 📢 섹션 요약 비유: 변위 주소 지정은 창고 물건을 "A구역 4번째 칸"처럼 찾게 하는 방식과 같다. 구역 배치가 좋으면 빨라지지만, 창고 자체가 엉망이면 표기법만 바꿔도 속도는 한계가 있다.

Ⅴ. 기대효과 및 결론

변위 주소 지정의 가장 큰 효과는 코드 밀도와 메모리 유연성을 동시에 잡는 것이다. 명령어는 짧게 유지하면서도 큰 주소 공간을 다룰 수 있고, 프로그램이 메모리 어디에 적재되더라도 기준점만 맞으면 동일한 기계어를 재사용할 수 있다. 그래서 스택 접근, 객체 필드 접근, 재배치 가능한 코드, 현대 Load-Store 설계의 거의 모든 곳에서 기본 도구가 된다.

하지만 한계도 분명하다. 변위 폭이 부족하면 추가 주소 계산 명령이 늘고, AGU가 복잡해지면 하드웨어 비용이 커진다. 특히 CISC (Complex Instruction Set Computer) 계열처럼 Base + Index + Scale + Displacement를 동시에 허용할수록 표현력은 높아지지만 디코딩과 주소 생성 경로가 무거워진다. 결국 좋은 설계는 "무엇이 자주 쓰이는 패턴인가"를 보고, 그 패턴에 딱 맞는 정도의 변위 표현력만 제공하는 것이다.

정리하면 변위 주소 지정은 큰 주소를 레지스터에, 작은 거리 정보를 명령어에 나누어 담아 유효 주소를 만드는 핵심 주소 계산 원리다. 기억할 핵심은 단순하다. 절대 주소를 매번 말하지 않고도, 기준점 주변 데이터를 빠르고 짧게 다루게 만드는 메모리 주소 설계의 중심축이라는 점이다.

  • 📢 섹션 요약 비유: 변위 주소 지정은 지도 전체를 매번 펼치는 대신, "지금 서 있는 곳"을 먼저 찍고 그 주변 몇 블록만 읽는 길찾기와 같다. 기준점이 잡히면 나머지 설명은 짧아지고 실용적이 된다.

📌 관련 개념 맵

개념연결 포인트
EA (Effective Address)기준 주소와 변위를 합쳐 실제 접근 위치를 만든다
AGU (Address Generation Unit)변위 주소 지정의 하드웨어 계산 핵심 유닛이다
베이스 레지스터 주소 지정 (Base Register Addressing)변위 주소 지정의 대표 파생형으로 재배치와 큰 주소 공간에 강하다
인덱스 주소 지정 (Indexed Addressing)동적 인덱스와 결합해 배열 순회에 최적화된다
상대 주소 지정 (Relative Addressing)PC를 기준점으로 삼아 위치 독립 코드를 가능하게 한다
스택 프레임 (Stack Frame)지역 변수와 매개변수 접근에서 음수/양수 변위가 빈번히 사용된다
구조체 오프셋 (Structure Offset)객체 시작 주소 기준으로 멤버를 찾을 때 그대로 적용된다

📈 관련 키워드 및 발전 흐름도

직접 주소 지정의 주소 비트 한계
        │
        ▼
기준 주소를 레지스터에 보관
        │
        ▼
변위 주소 지정 (Base + Offset)
        │
        ├──────────────▶ 베이스 레지스터 주소 지정
        ├──────────────▶ 인덱스 / 스케일 확장
        └──────────────▶ PC-relative와 위치 독립 코드

이 흐름도는 "긴 절대 주소를 명령어에 넣기 어렵다"는 문제에서 출발해, 변위 주소 지정이 여러 현대 주소 지정 방식의 공통 뿌리가 되었음을 보여 준다.

👶 어린이를 위한 3줄 비유 설명

  1. 변위 주소 지정은 장난감 서랍의 정확한 주소를 매번 길게 말하지 않고, "큰 서랍장 기준으로 세 번째 칸"이라고 말하는 방법이에요.
  2. 그래서 컴퓨터는 큰 위치는 기억 상자에 두고, 작은 거리만 보고도 금방 원하는 칸을 찾을 수 있어요.
  3. 똑같은 서랍장을 다른 방으로 옮겨도, 기준점만 다시 잡으면 같은 설명으로 계속 찾을 수 있답니다.