주소 지정 방식(Addressing Mode, 어드레싱 모드)은 컴퓨터 중앙 처리 장치(CPU) 설계에서 명령어 집합 아키텍처(ISA)의 핵심 구성 요소이다. 명령어가 실행될 때 피연산자(데이터)의 위치를 식별하고 유효 메모리 주소를 계산하는 방법을 정의한다.
개요
프로그램을 구성하는 기계어 명령어는 수행할 연산(오퍼레이션 코드, Opcode)과 연산에 필요한 데이터(피연산자, Operand)의 위치 정보를 포함한다. 주소 지정 방식은 이 피연산자의 위치를 어떻게 참조할지를 결정하는 규칙이다. 명령어 내에 데이터 자체를 포함할 것인지, 데이터가 저장된 메모리 주소를 명시할 것인지, 또는 레지스터나 다른 주소 계산 방식을 통해 간접적으로 접근할 것인지를 규정한다.
주요 주소 지정 방식의 종류
주소 지정 방식은 CPU 아키텍처에 따라 다양하게 정의되며, 대표적인 방식은 다음과 같다.
1. 즉시 주소 지정 방식 (Immediate Addressing Mode)
명령어의 피연산자 필드에 실제 데이터 값(상수)이 직접 포함된다. 메모리 접근이 필요 없어 속도가 가장 빠르지만, 상수의 크기가 명령어 길이에 제한된다.
2. 직접 주소 지정 방식 (Direct Addressing Mode)
명령어의 피연산자 필드에 데이터가 저장된 메모리의 실제 주소(유효 주소)가 직접 명시된다. 구현이 단순하지만 주소 범위가 명령어 비트 수에 제한된다.
3. 간접 주소 지정 방식 (Indirect Addressing Mode)
명령어의 피연산자 필드가 가리키는 메모리 위치에 실제 데이터의 주소가 저장되어 있다. 즉, 주소를 가리키는 주소를 사용한다. 한 번의 추가 메모리 접근이 필요하므로 속도는 느리지만 넓은 주소 공간을 표현할 수 있다.
4. 레지스터 주소 지정 방식 (Register Addressing Mode)
CPU 내부의 레지스터에 데이터가 저장되어 있으며, 명령어는 해당 레지스터 번호를 지정한다. 메모리 접근 없이 레지스터에 직접 접근하므로 속도가 매우 빠르다.
5. 레지스터 간접 주소 지정 방식 (Register Indirect Addressing Mode)
명령어가 지정한 레지스터에 데이터의 메모리 주소가 저장되어 있고, 그 주소를 통해 실제 데이터에 접근한다. 포인터 연산에 적합하다.
6. 인덱스 주소 지정 방식 (Indexed Addressing Mode)
명령어에 지정된 기준 주소(베이스 주소)에 인덱스 레지스터의 값을 더하여 유효 주소를 계산한다. 배열이나 테이블과 같은 연속된 데이터 구조에 접근할 때 효율적이다.
7. 베이스 레지스터 주소 지정 방식 (Base Register Addressing Mode)
베이스 레지스터의 내용과 명령어에 포함된 변위값(Displacement)을 더하여 유효 주소를 결정한다. 프로그램의 재배치(Relocation)와 세그먼트 내 위치 지정에 사용된다.
8. 상대 주소 지정 방식 (Relative Addressing Mode)
프로그램 카운터(PC, Program Counter)의 현재 값에 명령어에 지정된 변위값을 더하여 유효 주소를 계산한다. 주로 분기 명령어에서 사용되며, 코드 위치에 독립적인(Position-Independent) 코드 작성에 유용하다.
9. 스택 주소 지정 방식 (Stack Addressing Mode)
스택 포인터(SP, Stack Pointer) 레지스터를 사용하여 스택 메모리 영역에 데이터를 push/pop하는 방식이다. 서브루틴 호출, 인터럽트 처리, 지역 변수 관리 등에 사용된다.
의의
주소 지정 방식은 명령어의 길이, 실행 속도, 메모리 접근 횟수, 표현 가능한 주소 범위, 프로그래밍의 유연성 사이에서 균형을 맞추기 위해 설계되었다. 각 방식은 속도와 공간 효율성, 유연성 측면에서 서로 다른 장단점을 가지며, CPU 아키텍처 설계자는 이러한 특성을 고려하여 명령어 집합을 구성한다. 주소 지정 방식의 이해는 어셈블리어 프로그래밍과 컴파일러 설계에 필수적인 기초 개념이다.