주소지정방식
- Addressing Mode
- 명령어 형식에 포함된 오퍼랜드부에 존재하는 정보를 이용해 피연산자를 찾아내는 방법
- 다양한 주소 지정 방식을 컴퓨터 시스템에 사용하고 있음
- 주소: 저장된 데이터의 위치를 구별하기 위해 각 바이트나 워드 단위로 2진수로 일련번호를 부여한 고유번호
- 주기억장치에서 데이터가 저장된 위치
- 주기억장치에서 원하는 데이터를 인출하기 위해서는 데이터가 저장된 위치를 알아야 함
- 한 번에 처리할 수 있는 비트 수(워드의 크기)는 명령어 길이에 제약을 주게 됨
- CPU의 주소지정 능력에 한계를 두게 됨
- 주소지정방식이 다양한 이유: 제한된 명령어 비트들을 적절하게 이용하여 효율적으로 오퍼랜드를 지정하고 더 큰 용량의 기억장치를 사용할 수 있도록 하기 위한 것
주소지정방식의 효과
- 포인터, 카운터 인덱싱 등을 통해 사용자에게 오퍼랜드 지정의 편의성을 제공하여 프로그래밍하는 데 융통성을 줌
- 더 넓은 범위의 기억장치에 접근하는 방법을 제공
- 번지 필드의 비트를 줄여줌
주소지정방식의 표기 방법
정의 내용 | 표기 방법 |
유효 주소(기억장치의 실제 주소) | EA |
기억장치 주소 | A |
레지스터 번호 | R |
기억장치 A번지의 내용 | (A) |
레지스터 R번지의 내용 | (R) |
주소지정방식의 분류
- 직접 주소지정방식 (Direct Addressing Mode)
- 간접 주소지정방식 (Indirect Addressing Mode)
- 묵시적 주소지정방식 (Implied Addressing Mode)
- 즉시 주소지정방식 (Immediate Addressing Mode)
- 레지스터 주소지정방식 (Register Addressing Mode)
- 레지스터 간접 주소지정방식 (Register-indirect Addressing Mode)
- 변위 주소지정방식 (Displacemnet Addressing Mode)
직접 주소지정방식
- 오퍼랜드 필드의 내용이 유효 주소가 되는 방식으로 가장 일반적인 개념의 주소지정방식
- 지적하려는 위치를 오퍼랜드에서 직접 표현하는 형식으로 가장 간단한 주소지정방식
- EA = A (유효 주소 = 기억장치 주소)
- 장점: 데이터 인출을 위해 오퍼랜드에 저장된 해당 주소의 기억장치에 한 번만 접근
- 단점: 연산 코드를 제외하고 남은 비트들이 주소 비트로 사용되기 때문에 지정할 수 있는 기억장소의 수가 제한됨
- 따라서 많은 수의 주소를 지정할 수 없음
- 오퍼랜드부가 n비트이면 접근 가능한 기억장치의 용량이 2ⁿ개가 됨
- 오퍼랜드부에 레지스터 번호를 적으면 레지스터 주소지정방식이 됨
간접 주소지정방식
- 오퍼랜드에 표현된 값이 실제 데이터가 기억된 주소가 아니고, 실제 데이터의 주소가 위치한 주소를 나타냄
- 오퍼랜드 필드에 데이터 유효 기억장치 주소가 저장되어 있는 주소가 저장되어 있고, 이 주소가 가리키는 기억 장소에서 유효 주소를 얻을 수 있음
- EA = (A) (유효주소 = 기억장치 A번지의 내용)
- 간접 주소지정방식의 동작: 두 번의 기억장치 접근이 필요한 방식
- 첫 번째는 유효주소가 저장된 곳에 접근하는 것
- 두 번째는 유효주소에 접근하여 실질적인 데이터를 얻는 것
- 장점: 최대 기억장치 용량은 CPU가 한 번에 접근할 수 있는 워드의 길이에 의하여 결정됨
- 따라서 워드 길이가 n비트라면, 최대 2n개의 기억장소를 주소지로 만들 수 있음
- 오퍼랜드부의 비트 길이가 짧아도 더 넓은 주소에 접근 가능하게 함
- 단점: 실행 사이클 동안 두 번의 기억장치 접근이 필요함 (데이터 인출시간 더 많이 듦)
- 명령어 형식에서도 주소지정방식을 표시하는 간접비트(I) 필드가 필요함
- 간접 주소지정방식을 사용하는 컴퓨터에서의 명령어 형식
- 주소지정방식 모드 비트 I가 존재
- I=0이면 직접 주소지정방식, I=1이면 간접 주소지정방식
- 연산 코드 + I + 오퍼랜드(기억장치 주소)
묵시적 주소지정방식
- 명령어를 실행하는데 필요한 데이터의 위치가 별도로 지정되어 있지 않고, 명령의 연산 코드가 내포하고 있는 방법
- 오퍼랜드의 소스나 목적지를 명시하지 않음
- 명령어 길이가 짧다는 장점이 있지만, 명령어의 종류가 제한되어 있음
- SHL 명령어는 누산기의 내용을 좌측으로 이동시키는 것이지만, 데이터가 AC에 저장되어 있다는 것을 명령어에 표시하지 않음
- INC ; AC <- AC +1
- INC 명령어는 묵시적으로 누산기의 내용을 1 증가시키는 연산 명령어
- Push A;
- A의 내용을 스택에 저장하라는 명령어
- 명령어에 데이터 저장장소가 명시되어 있지 않고 Push 명령어가 실행되면 묵시적으로 스택을 찾아가는 것
즉시 주소지정방식
- 데이터가 명령어에 포함되어 있는 방식으로, 오퍼랜드 필드의 내용이 연산에 사용할 실제 데이터가 됨 (직접 데이터 형식)
- 프로그램에서 레지스터들이나 변수의 초기값을 어떤 상수값으로 설정하는 데 유용하게 사용됨
- 데이터를 인출하기 위해 기억장치에 접근할 필요가 없다는 장점이 있으나 상수 값의 크기가 오퍼랜드 필드 비트 수에 의하여 제한됨
- 간접 주소지정방식과 비교하여 간접비트가 불필요하므로 비트가 절약되고 오퍼랜드 필드만이 존재하고, 이 오퍼랜드에 상수값만 저장됨
레지스터 주소지정방식
- 연산에 사용할 데이터가 레지스터에 저장되어 있는 방식
- 오퍼랜드 부분이 레지스터 번호를 나타내며, 유효주소는 레지스터 번호가 됨
- EA = R (유효주소 = 레지스터 번호)
- 오퍼랜드의 비트수가 k비트이면, 주소지정에 사용할 수 있는 레지스터들의 수는 2ᵏ개
- 오퍼랜드 필드가 레지스터 번호를 나타내기 때문에 비트 수가 적어도 되며, 데이터 인출을 위하여 기억장치에 접근할 필요가 없다는 장점
- 데이터를 저장할 수 있는 공간이 CPU 내부의 레지스터로 제한됨
레지스터 간접 주소지정방식
- 명령어 형식에서 오퍼랜드 필드가 레지스터 번호를 가리키고, 그 레지스터에 저장된 내용이 유효주소가 됨
- 이 유효주소를 사용하여 실제 데이터를 인출
- EA = (R) (유효주소 = 레지스터에 저장된 내용)
- 주소를 지정할 수 있는 기억장치 영역이 확장됨
- 많은 주소공간 활용 가능
- 레지스터의 길이에 따라 주소지정 영역이 결정됨
- 레지스터의 길이가 16비트라면, 주소지정 영역은 2¹⁶ (64K 바이트)
- 간접 주소지정방식은 기억장치에 두 번 접근하지만, 레지스터 간접 주소지정방식은 기억장치에 한 번만 접근함
변위 주소지정방식
- 직접 주소지정방식과 레지스터 간접 주소지정방식을 조합한 것
- 오퍼랜드 필드는 레지스터 번호필드와 변위 값 필드로 2개가 존재
- 두 오퍼랜드의 조합(계산)으로 유효 주소가 생성됨
- R이 가리키는 레지스터의 내용과 변위 값 A를 더하여 유효 주소를 결정
- 사용하는 레지스터에 따라 여러 종류의 변위 주소지정 방식으로 정의 (계산에 의한 주소지정방식)
- 상대 주소지정: 프로그램 카운터를 사용
- 인덱스 주소지정: 인덱스 레지스터를 사용
- 베이스·레지스터 주소지정: 베이스 레지스터를 사용
상대 주소지정방식
- 프로그램 카운터를 레지스터로 사용하기 때문에 주로 분기 명령어에서 사용됨
- EA = A + (PC) (유효주소 = 기억장치 주소 + PC의 내용)
- 변위 값 A는 2의 보수이고 A ≥ 0이면 앞 방향으로, A < 0이면 뒤 방향으로 분기
- 상대 주소지정방식은 전체 기억장치 주소가 명령어에 포함되어야 하는 일반적인 분기 명령어보다 적은 수의 비트만 있으면 됨
- 즉, 오퍼랜드 필드의 길이가 짧아도 상대적인 값만 표현하면 되므로 대용량의 기억장치 접근이 가능하게 됨
- 간접 주소지정방식과는 달리 별도로 주기억장치에 접근할 필요가 없어 편리함
- 그러나 분기 범위가 오퍼랜드 필드의 길이에 의해 제한을 받음
인덱스 주소지정방식
- 인덱스 레지스터(IX)의 내용과 변위 A를 더하여 유효 주소를 결정
- EA = (IX) + A (유효주소 = 인덱스 레지스터의 내용 + 기억장치 주소)
- 인덱스 레지스터는 인덱스 값을 저장하는 특수 레지스터
- 인덱스 주소지정방식은 배열 데이터에 접근하게 되면 자동 인덱싱이 됨
- 즉, 명령어가 실행될 때마다 인덱스 레지스터의 내용이 자동적으로 증가하는 방식으로 명령어가 실행되면 다음 두 연산이 연속적으로 수행됨
- EA = (IX) + A, IX ← IX + 1
- 명령어 형식의 오퍼랜드부에서 지정한 인덱스 레지스터를 사용하면 배열 연산에 유용함
- 첫 번째 자료의 주소를 기준으로 변위(d)값을 변경시키면 배열 자료의 주소를 연속적으로 지정하기 쉽게 됨
- 시간이 많이 걸리는 단점
베이스·레지스터 주소지정방식
- 베이스 레지스터의 내용과 변위 A를 더하여 유효 주소를 결정하는 방식으로, 서로 다른 세그먼트 내 프로그램의 위치를 지정하는데 사용
- EA = (BR) + A (유효주소 = 베이스 레지스터의 내용 + 기억장치 주소)
- 베이스 레지스터: 명령이 시작되는 시작번지를 저장하고 있는 레지스터
주소지정방식에 따른 메모리 참조 시간 비교
- 묵시적, 즉시, 레지스터 주소지정방식은 연산에 필요한 실제 피연산자가 이미 CPU 내에 존재하므로 별도로 주기억장치 접근이 필요 없어 참조 시간 = 0
- 직접과 레지스터 간접은 한 번만 주기억장치 참조
- 상대와 인덱스 주소지정방식에서는 변위 값 d를 이용해서 한 번의 주기억장치 참조
- 간접은 두 번의 주기억장치 참조
문제풀이 예시
주소 | 메모리 내용 |
1000H | 0306H |
1001H | 1004H |
1002H | 00A6H |
1003H | 0075H |
1004H | 0080H |
주소지정방식 | 명령어 | 실행 후 결과 |
즉시 | LOAD A, 0035H | A: 0035H |
직접 | LOAD A, (1002H) | A: 00A6H |
즉시 | LOAD B, 1000H | B: 1000H |
간접 | LOAD A, ( (1001) ) | A: 0080H |
레지스터 | LOAD B, A | B: 0080H |
상대 | JUMP 0021H | 현재 PC: 1005H 실행 후 PC: 1026H |
즉시 | LOAD IX, 1000H | IX: 1000H |
인덱스 | LOAD A, (IX+03H) | A: 0075H |