주소 지정 모드
Addressing mode이 글은 검증을 위해 추가 인용문이 필요합니다. : [ 지정 모드 · · · · JSTOR (2009년 5월 (이 및 ) |
어드레싱 모드는 대부분의 중앙 처리 장치(CPU) 설계에서 명령 집합 아키텍처의 한 측면입니다.주어진 명령 집합 아키텍처에서 정의된 다양한 어드레싱 모드는 해당 아키텍처의 기계어 명령이 각 명령의 오퍼랜드를 식별하는 방법을 정의합니다.어드레싱 모드는 기계명령 또는 다른 곳에 포함된 레지스터 및/또는 상수에 보유된 정보를 사용하여 피연산자의 유효 메모리 주소를 계산하는 방법을 지정한다.
컴퓨터 프로그래밍에서 어드레싱 모드는 어셈블리 언어로 글을 쓰는 사람이나 컴파일러 라이터에게 주로 관심이 있습니다.관련 개념은 모든 주소 지정 모드를 사용하는 모든 명령의 기능을 다루는 직교 명령 집합을 참조하십시오.
주의사항
이 섹션은 어떠한 출처도 인용하지 않습니다.(2012년 5월 (이 및 에 대해 ) |
다양한 어드레싱 모드에 이름을 붙이는 일반적인 방법은 없습니다.특히, 같은 어드레싱 모드에 다른 이름을 붙이거나 다른 어드레싱 모드에 같은 이름을 붙일 수 있습니다.또한 하나의 아키텍처에서 단일 어드레싱 모드로 취급되는 어드레싱 모드는 다른 아키텍처에서 둘 이상의 어드레싱 모드로 커버되는 기능을 나타낼 수 있다.예를 들어 Digital Equipment Corporation(DEC) VAX와 같은 일부 복잡한 명령 집합 컴퓨터(CISC) 아키텍처는 레지스터와 리터럴 또는 즉시 상수를 다른 어드레싱 모드로 취급합니다.IBM System/360 및 그 후속 기종 및 대부분의 RISC(Reduced Instruction Set Computer) 설계와 같은 다른 기종에서는 이 정보를 명령어로 인코딩합니다.따라서, 후자의 기계는 하나의 레지스터를 다른 레지스터에 복사하고, 리터럴 상수를 레지스터에 복사하고, 메모리 위치의 내용을 레지스터에 복사하기 위한 세 가지 명령 코드를 가지고 있는 반면, VAX는 하나의 "MOV" 명령만 가지고 있습니다.
"주소 지정 모드"라는 용어 자체는 "메모리 주소 계산 모드" 또는 "오퍼랜드 액세스 모드" 중 하나로 해석될 수 있습니다.첫 번째 해석에서는 메모리에서 읽거나 메모리에 쓰지 않는 명령(예를 들어 "등록하기 위해 리터럴 추가")은 "주소 지정 모드"가 없는 것으로 간주됩니다.두 번째 해석은 VAX와 같은 기계가 레지스터 또는 리터럴 피연산자를 허용하기 위해 오퍼랜드 모드 비트를 사용할 수 있도록 합니다.첫 번째 해석만 "load effective address"와 같은 명령어에 적용됩니다.이 명령어는 오퍼랜드 자체가 아닌 오퍼랜드의 주소를 로드합니다.
다음에 나타내는 어드레싱 모드는 코드 어드레싱과 데이터 어드레싱으로 나뉩니다.대부분의 컴퓨터 아키텍처는 이 구별을 유지하지만 (거의) 모든 어드레싱 모드를 모든 컨텍스트에서 사용할 수 있는 아키텍처가 있습니다.
다음에 나타내는 순서는 어드레싱 모드를 나타내기 위한 것으로, 특정의 컴퓨터가 사용하는 니모닉을 반드시 반영하고 있는 것은 아닙니다.
어드레싱 모드 수
하드웨어에서 제공하는 어드레싱 모드의 수에 따라 컴퓨터 아키텍처에 따라 크게 다릅니다.복잡한 어드레싱 모드를 배제하고 간단한 어드레싱 모드를 1개 또는 몇 개만 사용하면 몇 가지 이점이 있습니다.단, 몇 가지 추가 명령과 추가 [1][2]레지스터가 필요할 수도 있습니다.사용 가능한 어드레싱 모드가 단순한 CPU뿐이라면 파이프라인 CPU를 설계하기가 훨씬 쉽다는 것이 입증되었습니다[3][4][5].
대부분의 RISC 아키텍처에는 단순한 어드레싱 모드가5개 정도밖에 없습니다만, DEC VAX 등의 CISC 아키텍처에는 12개가 넘는 어드레싱 모드가 있습니다.그 중 일부는 매우 복잡합니다.IBM System/360 아키텍처에는 3개의 주소 지정 모드만 있으며, System/390에는 몇 개의 주소 지정 모드가 추가되었습니다.
주소 지정 모드가 몇 개만 있는 경우, 필요한 특정 주소 지정 모드는 일반적으로 명령 코드(예: IBM System/360 및 후속 버전인 대부분의 RISC) 내에 인코딩됩니다.다만, 어드레싱 모드가 많은 경우는, 어드레싱 모드를 지정하기 위한 명령으로 특정의 필드가 할당되는 경우가 있습니다.DEC VAX에서는 거의 모든 명령에 대해 여러 개의 메모리 오퍼랜드가 허용되므로 각 오퍼랜드 지정자의 처음 몇 비트가 해당 오퍼랜드의 주소 지정 모드를 나타내기 위해 예약되어 있습니다.주소 지정 모드 지정자 비트를 opcode 작동 비트와 분리하여 유지하면 직교 명령 세트가 생성됩니다.
어드레싱 모드가 많은 컴퓨터에서도 실제 프로그램을[6] 측정하면 다음에 나오는 간단한 어드레싱 모드가 사용되는 모든 어드레싱 모드의 약 90% 이상을 차지한다는 것을 알 수 있습니다.이러한 측정은 대부분 컴파일러에 의해 높은 수준의 언어에서 생성된 코드를 기반으로 하기 때문에 이는 사용하는 [7][6][8]컴파일러의 한계를 어느 정도 반영합니다.
유용한 부작용
Intel x86 및 IBM/360 및 그 후계기 등 일부 명령 집합 아키텍처에는 로드 유효 주소 [9][10]명령이 있습니다.이것에 의해, 유효한 오퍼랜드주소의 계산이 실행되지만, 그 메모리 로케이션에 동작하는 대신에, 레지스터에 액세스 했을 주소를 로드합니다.이는 배열 요소의 주소를 서브루틴에 전달할 때 유용합니다.또, 1개의 명령어로 통상보다 많은 계산을 실시하는 약간 교묘한 방법이 될 수도 있습니다.예를 들어, 이러한 명령어를 주소 지정 모드 「base+index+offset」(상세)와 함께 사용하면, 1개의 명령어로 2개의 레지스터와 상수를 추가할 수 있습니다.
코드의 간단한 어드레싱 모드
코드의 간단한 어드레싱 모드를 다음에 나타냅니다.명명법은 플랫폼에 따라 다를 수 있습니다.
절대 또는 직접
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
절대 명령 주소의 유효 주소는 주소 파라미터 자체이며 변경되지 않습니다.
PC-상대적인
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PC 상대 명령 주소의 유효 주소는 다음 명령 주소에 추가된 오프셋 파라미터입니다.이 오프셋은 일반적으로 명령 [11]전후에 코드를 참조할 수 있도록 서명됩니다.
일반적인 점프는 인근 지시에 따르기 때문에 점프와 관련하여 특히 유용하다(대부분의 문장이 상당히 짧거나 짧은 경우 높은 수준의 언어로 표시).실제 프로그램을 측정한 결과 8 또는 10비트 오프셋은 조건부 점프의 90%(대략 ±128 또는 ±512바이트)[12]에 충분히 큰 것으로 나타났습니다.
PC 상대 어드레싱의 또 다른 장점은 코드는 위치에 의존하지 않는다는 것입니다.즉, 주소를 조정할 필요 없이 메모리 내 어디에나 로딩할 수 있습니다.
이 어드레싱 모드의 일부 버전은 두 개의 레지스터("reg1=reg2"인 경우) 또는 한 개의 레지스터("reg1=0"인 경우)를 조건부로 참조하거나 레지스터를 포함하지 않고 상태 레지스터에서 미리 설정된 비트를 암시적으로 참조할 수 있습니다.아래의 조건부 실행을 참조하십시오.
간접 등록
+-----+---+ jumpVia reg +-----+(유효한 PC 주소 = 레지스터 'reg'의 내용)
Register 간접 명령의 유효 주소는 지정된 레지스터의 주소입니다.예를 들어 (A7)는 주소 레지스터 A7의 내용에 액세스 한다.
이 효과는 지정된 레지스터에 주소가 있는 명령으로 제어를 이전하는 것입니다.
많은 RISC 머신과 CISC IBM System/360 및 그 후속 기기에는 리턴 주소를 주소 레지스터에 배치하는 서브루틴콜 명령이 있습니다.레지스터 간접 어드레싱 모드는 해당 서브루틴콜에서 복귀하기 위해 사용됩니다.
시퀀셜 어드레싱 모드
순차 실행
+-----+ nop 다음 명령을 실행합니다. +---+ (유효한 PC 주소 = 다음 명령 주소)
CPU는 순차 명령을 실행한 후 다음 명령을 즉시 실행합니다.
일부 시스템에서는 순차 실행이 주소 지정 모드로 간주되지 않습니다.
대부분의 CPU 아키텍처에서 대부분의 명령은 순차적인 명령입니다.대부분의 명령어는 시퀀셜 명령이기 때문에 CPU 설계자는 이러한 시퀀셜 명령의 실행을 고속화하기 위해 다른 명령(브런치 명령)의 성능을 의도적으로 저하시키는 기능을 추가하는 경우가 많습니다.
조건부 브랜치는 조건에 따라 PC에 2가지 결과 중 하나를 로드합니다.대부분의 CPU 아키텍처에서는, 「테이크」브런치에는 다른 어드레싱 모드를 사용하고, 「테이크 되지 않는」브런치에는 시퀀셜 실행을 사용합니다.
최신 CPU의 많은 기능(명령어 프리페치 및 복잡한 파이프라인 처리, 순서가 어긋나는 실행 등)은 각 명령이 다음 명령 시작 전에 완료된다는 환상을 유지하며 최종 결과는 동일하지만 내부적으로는 그렇지 않습니다.
이러한 순차 명령의 각 "기본 블록"은 참조의 시간적 및 공간적 인접성을 모두 나타낸다.
순차 실행을 사용하지 않는 CPU
프로그램 카운터를 사용하여 순차 실행을 사용하지 않는 CPU는 극히 드문 경우입니다.일부 CPU에서는 각 명령이 항상 다음 명령의 주소를 지정합니다.이러한 CPU에는 지정된 주소를 유지하는 명령 포인터가 있습니다.이 명령 포인터는 프로그램카운터가 아니기 때문에 증분할 수 없습니다.이러한 CPU에는 IBM 650, SECD 머신, Librascope LGP-30 및 RTX 32P와 [13]같은 일부 드럼 메모리 컴퓨터가 포함됩니다.
다른 컴퓨팅 아키텍처는 훨씬 더 나아가 프로그램 카운터에 대한 다양한 대안을 사용하여 von Neumann 병목 현상을 우회하려고 시도합니다.
조건부 실행
일부 컴퓨터 아키텍처에는 조건부 명령(ARM 등, 64비트 모드의 모든 명령에는 더 이상 해당되지 않음) 또는 조건부 로드 명령(x86 등)이 있어 경우에 따라서는 조건부 분기가 불필요해지고 명령 파이프라인의 플러시를 피할 수 있습니다.'비교'와 같은 명령은 조건 코드를 설정하기 위해 사용되며, 후속 명령은 해당 조건 코드에 대한 테스트를 포함하며, 이러한 명령이 준수되는지 또는 무시되는지 여부를 확인합니다.
건너뛰다.
+-------+---+-+ 스킵EQ reg1 reg2는 reg1=reg2 +----+---++인 경우 다음 명령을 건너뜁니다(유효한 PC 주소 = 다음 명령 주소 + 1)
스킵 어드레싱은 고정된 "+1" 오프셋을 가진 특수한 종류의 PC 상대 어드레싱 모드로 간주될 수 있습니다.PC 상대 어드레싱과 마찬가지로 일부 CPU는 하나의 레지스터("reg1=0"인 경우 레지스터")만을 참조하거나 레지스터가 없는 이 어드레싱 모드의 버전을 가지고 있으며 상태 레지스터에서 암묵적으로 이전에 설정된 비트를 참조합니다.다른 CPU에는 테스트할 특정 바이트의 특정 비트를 선택하는 버전이 있습니다(reg12의 비트7이 0인 경우 건너뛰기).
다른 모든 조건부 분기와는 달리 "건너뛰기" 명령은 명령 파이프라인을 플러시할 필요가 없지만 다음 명령을 무시해야 할 수도 있습니다.
간단한 데이터 어드레싱 모드
데이터의 간단한 어드레싱 모드를 다음에 나타냅니다.명명법은 플랫폼에 따라 다를 수 있습니다.
등록(또는 직접 등록)
+-----+---+---+---+ mul reg1 reg2 reg1 := reg2 * reg3; +---+---+---+
이 "주소 지정 모드"는 유효한 주소가 없으며 일부 컴퓨터에서는 주소 지정 모드로 간주되지 않습니다.
이 예에서는 모든 오퍼랜드가 레지스터에 있으며 결과는 레지스터에 배치됩니다.
베이스 플러스 오프셋 및 변동
이를 '베이스 플러스 변위'라고 부르기도 합니다.
+-----+---+-----+-----+ 로드레지스트 베이스 오프셋레지그 := RAM [베이스 + 오프셋]+---+---+ (유효주소 = 지정된 베이스 레지스터의 오프셋 + 내용)
오프셋은 보통 부호 있는 16비트 값입니다(80386에서는 32비트로 확장되었습니다).
오프셋이 제로인 경우, 이것은 레지스터 간접 주소 지정의 예가 됩니다.유효 주소는 베이스 레지스터의 값일 뿐입니다.
많은 RISC 머신에서는 레지스터 0은 값 0으로 고정됩니다.레지스터 0이 베이스 레지스터로서 사용되고 있는 경우는, 절대 어드레싱의 예가 됩니다.다만, 메모리의 일부에만 액세스 할 수 있습니다(오프셋이 16비트인 경우는 64킬로바이트).
16비트 오프셋은 현재 컴퓨터 메모리의 크기에 비해 매우 작아 보일 수 있습니다(이 때문에 80386은 이를 32비트로 확장했습니다).자, 더 나쁠 수도 있어.IBM System/360 메인프레임에는 서명되지 않은 12비트 오프셋만 있습니다.단, 참조 장소의 원칙이 적용됩니다.단기간 동안 프로그램에서 액세스하고자 하는 대부분의 데이터 항목은 서로 상당히 가깝습니다.
이 어드레싱 모드는 인덱스 절대 어드레싱 모드와 밀접하게 관련되어 있습니다.
예 1: 서브루틴 내에서 프로그래머는 파라미터와 로컬 변수에 주로 관심을 가지며, 64KB를 넘는 경우는 거의 없습니다.이것은 1개의 베이스 레지스터(프레임 포인터)로 충분합니다.이 루틴이 객체 지향 언어의 클래스 메서드인 경우 현재 객체(고급 언어에서는 이 속성 또는 자기 자신)를 가리키는 두 번째 베이스 레지스터가 필요합니다.
예 2: 베이스 레지스터에 복합 유형(레코드 또는 구조)의 주소가 포함되어 있는 경우 오프셋을 사용하여 해당 레코드에서 필드를 선택할 수 있습니다(대부분의 레코드/구조는 크기가 32kB 미만임).
즉시/리터럴
+-----+---+---+-----+ reg1 reg2 상수 reg1 := reg2 + 상수; +-------+-----+
이 "주소 지정 모드"는 유효한 주소가 없으며 일부 컴퓨터에서는 주소 지정 모드로 간주되지 않습니다.
상수는 서명되거나 서명되지 않을 수 있습니다.예를들면,move.l #$FEEDABBA, D0
"FEEDABB"의 16진수 값을 이동하다A"를 레지스터 D0으로 변환합니다.
메모리에서 피연산자를 사용하는 대신 피연산자의 값은 명령어 자체 내에서 유지됩니다.DEC VAX 머신에서는 리터럴 오퍼랜드사이즈는 6, 8, 16 또는 32비트 길이입니다.
Andrew Tanenbaum은 프로그램에 포함된 모든 상수의 98%가 13비트에 들어맞는다는 것을 보여주었습니다(RISC 설계 철학 참조).
암묵적
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
암묵적인 어드레싱 모드(x86 어셈블리 언어)라고도 불리는 암묵적인 어드레싱 모드에서는, 송신원 또는 행선지(또는 그 양쪽 모두)의 유효 주소가 명시적으로 지정되어 있지 않습니다.
송신원(있는 경우) 또는 행선지의 유효 주소(또는 그 양쪽 모두) 중 하나가 opcode에 의해 암시됩니다.
암묵적인 어드레싱은 구식 컴퓨터(1970년대 중반까지)에서 매우 일반적이었습니다.이러한 컴퓨터에는 일반적으로 산술이 수행될 수 있는 레지스터가 1개밖에 없었습니다. 즉, 축적기였습니다.이러한 축전지 기계는 거의 모든 명령에서 암묵적으로 축전지를 참조합니다.예를 들어, < a : = b + c; > 연산은 < load b; add c; store a; -- 행선지(어큐뮬레이터)는 모든 "load" 및 "add" 명령에서 암시되며 소스(어큐뮬레이터)는 모든 "store" 명령에서 암시됩니다.
이후 컴퓨터는 일반적으로 산술의 소스 또는 타깃이 될 수 있는 범용 레지스터 또는 RAM 위치를 여러 개 가지고 있었습니다.따라서 나중에 산술의 소스 및 타깃을 지정하기 위해 다른 어드레싱 모드가 필요합니다.
x86 명령어 중 일부는 피연산자 또는 결과(곱셈, 나눗셈, 조건부 점프 카운트) 중 하나에 암묵적인 레지스터를 사용합니다.
많은 컴퓨터(x86 및 AVR 등)에는 스택포인터라고 불리는1개의 특수 목적 레지스터가 있습니다.이 레지스터는 스택에서 데이터를 푸시 또는 팝할 때 암묵적으로 증가 또는 감소하며 소스 또는 수신처의 유효 주소는 (암묵적으로) 스택포인터에 저장되어 있는 주소입니다.
많은 32비트 컴퓨터(68000, ARM, Power 등)PC)에는 스택포인터로 사용할 수 있는 복수의 레지스터가 있습니다.따라서 "레지스터 자동 증가 간접" 어드레싱 모드를 사용하여 스택에서 데이터를 푸시 또는 팝할 때 사용할 레지스터를 지정합니다.
IBM/390 및 Intel Pentium과 같은 일부 현재의 컴퓨터 아키텍처에는 이전 설계와의 하위 호환성을 유지하기 위해 암묵적인 피연산자가 포함된 명령어가 포함되어 있습니다.
많은 컴퓨터에서 사용자/시스템 모드 비트, 인터럽트 활성화 비트 등을 플립하는 명령은 이러한 비트를 유지하는 특수 레지스터를 암시적으로 지정합니다.따라서 Popek 및 Goldberg 가상화 요건을 충족하기 위해 이들 명령을 트랩하는 데 필요한 하드웨어가 단순해집니다.이러한 시스템에서는 트랩 로직이 오퍼랜드(또는 최종 유효 주소)를 조사할 필요가 없고 opcode에서만 확인할 필요가 있습니다.
일부 CPU는 모든 명령(제로 오퍼랜드 CPU)에서 모든 오퍼랜드가 항상 암묵적으로 지정되도록 설계되어 있습니다.
코드 또는 데이터의 기타 어드레싱 모드
절대/직접
+----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
이렇게 하려면 꽤 큰 주소를 위한 명령어 공간이 필요합니다.대부분의 경우 x86 등의 가변 길이 명령이 있는 CISC 머신에서 사용할 수 있습니다.
일부 RISC 머신에는 레지스터의 상반부에 16비트 또는 20비트 상수를 배치하는 특별한 Load Upper Literal 명령이 있습니다.그런 다음 하위 16 또는 12비트를 공급하는 베이스 플러스 오프셋어드레싱 모드에서 베이스 레지스터로 사용할 수 있습니다.이 조합으로 32비트주소를 풀로 할 수 있습니다.
인덱스 절대
+-----+---+-----+-----------+ 로드레지스트 주소 +-----+---+-----+(유효주소 = 주소 + 지정된 인덱스 레지스터의 내용)
또, 이 경우, 꽤 큰 주소의 명령어에도 스페이스가 필요합니다.주소는 배열 또는 벡터의 시작일 수 있으며 인덱스는 필요한 특정 배열 요소를 선택할 수 있습니다.프로세서는 각 어레이 요소의 크기를 고려하여 인덱스 레지스터의 크기를 조정할 수 있습니다.
이 경우 오프셋이 메모리 위치를 모두 처리할 수 있을 만큼 크다는 점을 제외하면 이 모드는 base-plus-offset 주소 지정 모드와 거의 동일합니다.
예 1: 서브루틴 내에서 프로그래머는 문자열을 로컬 상수 또는 정적 변수로 정의할 수 있습니다.문자열 주소는 명령의 리터럴주소에 저장됩니다.오프셋(루프의 이 반복에 사용하는 문자열의 문자)은 인덱스 레지스터에 저장됩니다.
예 2: 프로그래머는 여러 개의 대규모 배열을 글로벌 또는 클래스 변수로 정의할 수 있습니다.어레이의 시작은 참조하는 명령의 리터럴주소(아마도 프로그램로드 시 재배치 로더에 의해 수정됨)에 저장됩니다.오프셋(이 루프의 반복에 사용할 배열의 항목)은 인덱스 레지스터에 저장됩니다.대부분의 경우 루프 내의 명령은 루프 카운터 및 여러 배열의 오프셋에 동일한 레지스터를 재사용합니다.
베이스 플러스 인덱스
+---+---+---+---+---+ 로드레지스터 인덱스 +---+---+(유효주소=지정베이스 레지스터의 내용+지정인덱스 레지스터의 내용)
기본 레지스터는 배열 또는 벡터의 시작 주소를 포함할 수 있으며 인덱스는 필요한 특정 배열 요소를 선택할 수 있습니다.프로세서는 각 어레이 요소의 크기를 고려하여 인덱스 레지스터의 크기를 조정할 수 있습니다.매개 변수로 전달된 배열 요소에 액세스하는 데 사용할 수 있습니다.
베이스 플러스 인덱스 플러스 오프셋
+-----+---+---+-----+-----+ 로드레지스트 기본 인덱스오프셋 +---+---+(유효주소 = 오프셋 + 지정된 기본 레지스터의 내용 + 지정된 인덱스 레지스터의 내용)
베이스 레지스터는 배열의 시작 주소 또는 레코드의 벡터를 포함할 수 있으며 인덱스는 필요한 특정 레코드를 선택할 수 있으며 오프셋은 해당 레코드 내의 필드를 선택할 수 있습니다.프로세서는 각 어레이 요소의 크기를 고려하여 인덱스 레지스터의 크기를 조정할 수 있습니다.
스케일링
+---+---+---+---+---+ 로드레지스터 베이스 인덱스 +---+---+(유효주소 = 지정된 베이스 레지스터의 내용 + 지정된 인덱스레지스터의 축척된 내용)
기본 레지스터에는 배열의 시작 주소 또는 벡터 데이터 구조를 포함할 수 있으며 인덱스는 필요한 특정 배열 요소의 오프셋을 포함할 수 있습니다.
이 어드레싱 모드는 각 어레이 요소의 크기를 고려하여 인덱스 레지스터의 값을 동적으로 스케일링합니다.예를 들어 어레이 요소가 각각 8바이트를 차지하는 배정도 부동소수점 숫자일 경우 인덱스 레지스터의 값에 8을 곱한 후 효과적인 주소 계산에 사용됩니다.배율 배율은 일반적으로 2의 거듭제곱으로 제한되므로 곱이 아닌 이동을 사용할 수 있습니다.
간접 등록
+-----+---+---+ 로드 reg1 베이스 +-----++(유효 주소 = 베이스 레지스터의 내용)
일부 컴퓨터에서는 이 모드를 고유 주소 지정 모드로 사용합니다.많은 컴퓨터에서는 오프셋 값이 0인 베이스 플러스 오프셋만 사용합니다.예를 들어 (A7)
자동증분간접등록
+-----+---+---+---+ 로드레지스터 +---+(유효주소 = 베이스 레지스터의 내용)
유효 주소를 결정한 후, 베이스 레지스터내의 값을 액세스 하는 데이터 항목의 사이즈만큼 증가시킨다.예를 들어, (A7)+는 주소 레지스터 A7의 내용에 액세스 하고 나서, A7의 주소 포인터를 1(통상 1워드)씩 증가시킨다.루프 내에서 이 어드레싱 모드를 사용하여 배열 또는 벡터의 모든 요소를 스텝할 수 있습니다.
높은 수준의 언어에서는 결과를 반환하는 함수에 부작용이 있어서는 안 된다고 생각하는 경우가 많다(부작용이 부족하면 프로그램의 이해와 검증이 훨씬 쉬워진다).이 어드레싱 모드에서는 베이스 레지스터가 변경되는 부작용이 있습니다.후속 메모리 액세스가 중단으로 이어지는 오류(예: 페이지 장애, 버스 오류, 주소 오류)를 야기하는 경우, 하나 이상의 레지스터를 명령이 처음 시작되기 전의 상태로 다시 설정해야 하므로 명령을 재시작하는 것이 훨씬 더 문제가 됩니다.
이 어드레싱 모드를 사용했을 때의 인터럽트로부터의 회복에 관해서, 실장에 문제가 있는 컴퓨터 아키텍처가 적어도2개 있습니다.
- Motorola 68000 (주소는 24비트로 표시).하나 또는 두 개의 자동 증분 레지스터 피연산자를 가질 수 있습니다.68010+에서는, 버스 에러 또는 주소 에러에 CPU 의 내부 상태를 보존하는 것으로, 문제를 해결했습니다.
- DEC VAX최대 6개의 자동 증분 레지스터 피연산자를 가질 수 있습니다.각 오퍼랜드액세스에 의해서, 2개의 페이지 폴트가 발생할 가능성이 있습니다(피 오퍼랜드가 페이지 경계를 넘은 경우).물론 명령어 자체는 50바이트가 넘을 수 있으며 페이지 경계에 걸쳐 있을 수도 있습니다.
자동 검색 간접 등록
+-----+---+---+-+ 로드레지스터 +---+(유효주소 = 베이스 레지스터의 새로운 내용)
유효 주소를 결정하기 전에, 베이스 레지스터내의 값을 액세스 하는 데이터 항목의 사이즈만큼 감소시킨다.
루프 내에서 이 어드레싱 모드를 사용하여 배열 또는 벡터의 모든 요소를 뒤로 이동할 수 있습니다.스택은, 이 모드를 이전의 어드레싱 모드(자동 증분)와 조합해 실장할 수 있습니다.
auto-increment addressing 모드에서의 부작용에 대한 설명을 참조하십시오.
메모리 간접
이 문서에서 설명하는 어드레싱 모드에는 간접 어드레싱을 나타내기 위한 추가 비트가 있을 수 있습니다.즉, 실제로 유효한 주소를 포함한 로케이션의 주소(통상은 완전한 단어)가 일부 모드로 계산됩니다.
코드 또는 데이터에 간접 주소 지정을 사용할 수 있습니다.포인터, 참조 또는 핸들 구현을 훨씬 쉽게 할 수 있으며, 다른 방법으로는 어드레싱할 수 없는 서브루틴을 호출하는 것도 쉬워집니다.간접 어드레싱에는 메모리액세스가 필요하기 때문에 퍼포먼스 저하가 발생합니다.
일부 초기 미니 컴퓨터(예: DEC PDP-8, Data General Nova)는 몇 개의 레지스터와 제한된 직접 주소 범위(8비트)만을 가지고 있었습니다.따라서 메모리 간접 어드레싱을 사용하는 것은 상당한 양의 메모리를 참조하는 거의 유일한 방법입니다.
PC-상대적인
+-----+-----+-----+-----++-----+-road reg1 base=PC 오프셋 +------+------------------------------------------------------------------------------------------------- reg1 := RAM[PC + 오프셋] (유효 주소 = PC + 오프셋)
PC 상대 주소 지정 모드를 사용하여 현재 명령에서 조금 떨어진 프로그램 메모리에 저장된 값을 가진 레지스터를 로드할 수 있습니다.이는 프로그램 카운터(PC)를 "베이스 레지스터"로 선택하는 "베이스 플러스 오프셋" 주소 지정 모드의 특별한 경우로 볼 수 있습니다.
PC 관련 데이터 참조를 지원하는 CPU가 몇 개 있습니다.이러한 CPU에는 다음이 포함됩니다.
MOS 6502와 그 파생 모델에서는, 모든 브랜치 명령에 상대 어드레싱을 사용했습니다.이 명령어만 이 모드를 사용하고 점프는 다양한 다른 어드레싱 모드를 사용했습니다.
x86-64 아키텍처 및 64비트 ARMv8-A 아키텍처에는[14] PC 상대 어드레싱 모드가 있습니다.x86-64에서는 "RIP-relative", ARMv8-A에서는 "Literal"이라고 불립니다.Motorola 6809는 PC 상대 어드레싱 모드도 지원합니다.
PDP-11 아키텍처, VAX 아키텍처 및 32비트 ARM 아키텍처는 레지스터 파일에 PC를 포함시킴으로써 PC 상대 어드레싱을 지원합니다.
IBM z/Architecture에는 General-Instructions-Extension Facility가 활성화된 경우 PC 상대 주소 지정이 포함된 Load Relative Long과 같은 특정 지침이 포함되어 있습니다.
이 어드레싱 모드가 사용되는 경우 컴파일러는 일반적으로 상수를 사용하는 서브루틴의 직전 또는 직후에 리터럴 풀에 배치하여 실수로 상수를 명령으로 실행하는 것을 방지합니다.
이 어드레싱 모드는 항상 메모리에서 데이터를 가져오거나 데이터를 메모리에 저장한 후 다음 명령을 실행하기 위해 순차적으로 중단됩니다(유효한 주소는 데이터를 가리키고 있음). 이 모드는 데이터를 메모리로부터 가져오거나 저장하지 않고 대신 다른 명령으로 분기하는 "PC-relative branch"와 혼동해서는 안 됩니다.e 지정된 오프셋(실효 주소는 실행 가능한 명령을 가리킵니다).
오래된 어드레싱 모드
여기에 기재되어 있는 어드레싱 모드는 1950~1980년에 사용되었지만 대부분의 최신 컴퓨터에서는 사용할 수 없습니다.이 리스트는 결코 완전한 것은 아닙니다.예를 들어 2-3개의 인덱스 레지스터의 [15][16]absolute---minus-logical-OR 등, 그 밖에도 많은 흥미롭고 독특한 어드레싱 모드가 사용되고 있습니다.
멀티레벨 메모리 간접
워드 사이즈가 주소보다 클 경우, 메모리 간접 어드레싱에 참조되는 워드 자체에 다른 메모리 간접 사이클을 나타내기 위한 간접 플래그가 설정되어 있을 수 있습니다.이 플래그를 인다이렉션비트라고 부릅니다.이 플래그는 태그 부착 포인터이며, 다이렉트 포인터인지 간접 포인터인지 여부에 관계없이 인다이렉트비트가 태그 부착됩니다.간접 주소의 체인이 자신을 참조하지 않도록 주의할 필요가 있습니다.간접 주소 체인이 자신을 참조할 경우 주소를 해결하려고 할 때 무한 루프가 발생할 수 있습니다.
IBM 1620, Data General Nova, HP 2100 시리즈 및 NAR 2는 각각 이러한 멀티 레벨 메모리를 간접적으로 갖추고 있으며 이러한 무한 주소 계산 루프에 들어갈 수 있습니다.Nova의 메모리 간접 주소 지정 모드는 간접 스레드 코드 발명에 영향을 미쳤습니다.
18비트 주소와 36비트 워드를 가진 DEC PDP-10 컴퓨터는 각 단계에서 인덱스 레지스터를 사용할 수 있는 다단계 간접 주소 지정을 가능하게 했습니다.모든 주소 [17]워드를 디코딩하기 전에 priority interrupt 시스템이 쿼리되었습니다.따라서 간접 주소 루프는 프리엠프티브 멀티태스킹스케줄러의 타임슬라이스 만료 핸들러를 포함한 디바이스 서비스 루틴의 실행을 방해하지 않습니다.루프 명령은 다른 컴퓨팅 바인딩 작업과 동일하게 처리됩니다.
메모리 매핑 레지스터
일부 컴퓨터에서는 프라이머리 스토리지나 이러한 레지스터를 구현하기 위해 사용되는 프라이머리 메모리가 아닌 레지스터를 참조하는 주소가 있었습니다.IBM[18][a] 650, IBM 7070과[19][c] 같은 일부 초기 컴퓨터에서는 주소 범위의 상위 엔드에 레지스터 주소가 있었지만, 로우 엔드에 레지스터 주소만 사용하고 메모리(예: ICL 1900, DEC PDP-10)의 첫 번째 8 또는 16 단어만 사용하는 경향이 있었습니다.즉, 별도의 "등록할 레지스터 추가" 명령이 필요하지 않습니다. "등록할 메모리 추가" 명령을 사용하면 됩니다.
캐시 메모리가 없었던 PDP-10의 초기 모델의 경우, 메모리의 첫 번째 몇 단어에 로드된 엄격한 내부 루프(설치된 경우 고속 레지스터가 주소 지정 가능)가 자기 코어 메모리에서보다 훨씬 더 빠르게 실행되었습니다.
이후 DEC PDP-11 시리즈의 모델은 레지스터를 입력/출력 영역의 주소에 매핑했지만, 이는 주로 원격 진단을 가능하게 하기 위한 것이었습니다.16비트 레지스터는 연속된8비트 바이트 주소에 매핑되어 있습니다.
메모리 간접 및 자동 증가
DEC PDP-8 미니컴퓨터는 8개의 특별한 장소(주소8 ~ 15)가 있었습니다.메모리의 간접 어드레싱으로 액세스 하면,[20] 이러한 로케이션은 사용전에 자동적으로 증가합니다.이것에 의해, 주소를 증가시키기 위해서 어큐뮬레이터를 사용할 필요 없이, 루프내의 메모리를 간단하게 스텝 할 수 있게 되었습니다.
Data General Nova 미니컴퓨터는 주소 16~[21]31에 16개의 특수한 메모리 위치를 가지고 있었습니다.메모리의 간접 어드레싱으로 액세스 하면, 사용전에 16 ~23 이 자동적으로 증가해, 사용전에 24 ~31 이 자동적으로 감소합니다.
제로 페이지
Data General Nova, Motorola 6800 패밀리 및 MOS Technology 6502 프로세서 패밀리는 내부 레지스터가 거의 없었습니다.산술 및 논리 명령은 대부분 내부 레지스터가 아닌 메모리 내의 값에 대해 수행되었습니다.그 결과, 많은 명령에서는 메모리의 2바이트(16비트) 위치가 필요했습니다.이러한 프로세서의 opcode의 길이가 1바이트(8비트)에 불과하기 때문에 메모리주소는 코드사이즈의 대부분을 차지할 가능성이 있습니다.
이러한 프로세서의 설계자는, 「제로 페이지」어드레싱이라고 불리는 부분적인 수정 프로그램을 포함하고 있었습니다.메모리의 초기 256바이트($0000~$00FF, 페이지 「0」)에는, 1바이트의 절대 메모리 주소 또는 인덱스 메모리 주소를 사용해 액세스 할 수 있습니다.이를 통해 명령 실행 시간은 1클럭 사이클, 명령 길이는 1바이트 감소했습니다.이 지역에서 자주 사용되는 데이터를 저장함으로써 프로그램을 더 작고 빠르게 만들 수 있었습니다.
그 결과 제로 페이지는 레지스터 파일과 동일하게 사용되었습니다.그러나, 많은 시스템에서는, operating system과 유저 프로그램에 의해서 제로 페이지 메모리 영역의 사용율이 높아져, 빈 영역이 한정되어 있기 때문에, 그 사용이 제한되고 있습니다.
다이렉트 페이지
제로 페이지 주소 모드는 WDC 65816, CSG 65CE02, Motorola 6809 등의 최신 8비트 프로세서에서 확장되었습니다.「다이렉트 페이지」어드레싱이라고 불리는 새로운 모드에서는, 메모리의 선두로부터 256 바이트의 제로 페이지 메모리창을 메모리의 선두(오프셋주소 0000달러)의 새로운 장소로 이동하는 기능이 추가되었습니다.
CSG 65CE02에서는 8비트의 오프셋 값을 새로운 베이스 페이지(B) 레지스터에 저장함으로써 메모리 최초의 64KB 내의 임의의 256바이트 경계로 다이렉트페이지를 이동할 수 있었습니다.Motorola 6809는 다이렉트 페이지(DP) 레지스터에서도 같은 작업을 수행할 수 있습니다.WDC 65816에서는 한 걸음 더 나아가 16비트 오프셋 값을 새로운 다이렉트(D) 레지스터에 저장함으로써 다이렉트 페이지를 메모리의 첫 번째 64KB 내의 임의의 위치로 이동할 수 있게 되었습니다.
그 결과, 제로 페이지 어드레싱 모드만을 탑재한 레거시 프로세서에 비해, 보다 많은 수의 프로그램이 향상된 다이렉트 페이지 어드레싱 모드를 이용할 수 있었습니다.
경계 검사를 통해 인덱스 크기 조정
명령어에 2개의 추가 오퍼랜드(일반적으로 상수)가 있으며 하드웨어는 인덱스 값이 이러한 경계 사이에 있는지 확인하는 것을 제외하고는 스케일링된 인덱스 어드레싱과 유사합니다.
또 다른 변형에서는 벡터 기술자를 사용하여 경계를 유지합니다.이것에 의해, 동적으로 할당된 어레이를 간단하게 실장할 수 있어 풀 경계 체크를 실시할 수 있습니다.
워드 내 비트 필드에 간접적
일부 컴퓨터에는 단어 내의 하위 필드에 대한 특별한 간접 주소 지정 모드가 있었습니다.
GE/Honeywell 600 시리즈 문자 주소 지정 간접 단어는 36비트 단어 내에서 6비트 또는 9비트 문자 필드를 지정합니다.
DEC PDP-10(또한 36비트)에는 메모리를 1비트~36비트 크기의 고정 크기 비트필드 또는 바이트 시퀀스로 취급할 수 있는 특별한 명령이 있습니다."바이트 포인터"라고 불리는 메모리의 한 단어 시퀀스 기술자는 시퀀스 내의 현재 워드 주소, 워드 내의 비트 위치 및 각 바이트의 크기를 보유했습니다.
이 디스크립터를 통해 바이트를 로드 및 저장하고 다음 바이트를 가리키도록 디스크립터를 증가시키는 명령이 존재했습니다(바이트는 워드 경계를 넘어 분할되지 않았습니다).많은 DEC 소프트웨어에서는 워드당5개의 7비트바이트(일반 ASCII 문자)가 사용되었으며 워드당1비트는 사용되지 않았습니다.C의 'malloc' 함수는 int의 크기가 [22]char의 몇 배라고 가정하기 때문에 C의 구현에서는 워드당4개의 9비트 바이트를 사용해야 합니다.실제 배수는 시스템에 의존하는 컴파일 시간 연산자 크기/에 따라 결정됩니다.
다음 명령 색인화
엘리엇 503,[23] 엘리엇 803 [23][24]및 아폴로 안내 컴퓨터는 절대 주소 지정만 사용했으며 색인 레지스터는 없었습니다.따라서 간접 점프 또는 레지스터 통과 점프는 명령 집합에서 지원되지 않았습니다.대신 현재 메모리 워드의 내용을 다음 명령에 추가하도록 지시할 수 있습니다.실행할 다음 명령어에 작은 값을 추가하면 예를 들어 다음 명령어가 변경될 수 있습니다.JUMP 0
에JUMP 20
따라서 인덱스 점프의 효과를 창출할 수 있습니다.명령은 즉시 수정되며 메모리에 변경되지 않습니다. 즉, 자체 수정 코드가 아닙니다.다음 명령에 추가되는 값이 충분히 크면 해당 명령의 opcode와 주소 또는 주소 대신 변경할 수 있습니다.
용어집
- Indirect
- 포인터 또는 주소를 통해 참조되는 데이터입니다.
- Immediate
- 명령 또는 명령 목록에 직접 포함된 데이터입니다.
- Index
- 일반적으로 인덱스 레지스터에 유지되는 동적 오프셋으로, 개체 크기에 따라 크기가 조정될 수 있습니다.
- Offset
- 주소에 추가되는 즉시 값. 예를 들어 C 프로그래밍 언어의 구조 필드 액세스에 대응합니다.
- Relative
- 다른 주소에 대해 형성된 주소입니다.
- Post increment
- 사용된 과거 데이터 주소의 스테핑은 다음과 같습니다.
*p++
스택 팝 조작에 사용됩니다. - Pre decrement
- 사용 전 주소의 감소는 다음과 같습니다.
*--p
스택 푸시 조작에 사용됩니다.
「 」를 참조해 주세요.
메모들
레퍼런스
- ^ F. Chow; S. Correll; M. Himelstein; E. Killian; L. Weber (1987). "How many addressing modes are enough?". ACM Sigarch Computer Architecture News. 15 (5): 117–121. doi:10.1145/36177.36193.
- ^ John L. Hennessy; Mark A. Horowitz (1986). "An Overview of the MIPS-X-MP Project" (PDF).
... MIPS-X uses a single addressing mode: base register plus offset. This simple addressing mode allows the computation of the effective address to begin very early ...
- ^ Dr. Jon Squire. "Lecture 19, Pipelining Data Forwarding". CS411 Selected Lecture Notes.
- ^ "High Performance Computing, Notes of Class 11 (Sept. 15 and 20, 2000) - Pipelining". Archived from the original on 2013-12-27. Retrieved 2014-02-08.
- ^ John Paul Shen, Mikko H. Lipasti (2004). Modern Processor Design. McGraw-Hill Professional. ISBN 9780070570641.
- ^ a b John L. Hennessy; David A. Patterson (2002-05-29). Computer Architecture: A Quantitative Approach. p. 104. ISBN 9780080502526.
The C54x has 17 data addressing modes, not counting register access, but the four found in MIPS account for 70% of the modes. Autoincrement and autodecrement, found in some RISC architectures, account for another 25% of the usage. This data was collected form a measurement of static instructions for the C-callable library of 54 DSP routines coded in assembly language.
- ^ Dr. Sofiène Tahar. "Instruction Set Principles: Addressing Mode Usage (Summary)" (PDF). Archived from the original (PDF) on 2011-09-30.
3 programs measured on machine with all address modes (VAX) ... 75% displacement and immediate
- ^ Ali-Reza Adl-Tabatabai; Geoff Langdale; Steven Lucco; Robert Wahbe (1995). "Efficient and Language-Independent Mobile Programs". Proceedings of the ACM SIGPLAN 1996 conference on Programming language design and implementation - PLDI '96. pp. 127–136. doi:10.1145/231379.231402. ISBN 0897917952. S2CID 2534344.
79% of all instructions executed could be replaced by RISC instructions or synthesized into RISC instructions using only basic block instruction combination.
- ^ IBM System/360 Principles of Operation (PDF). IBM. September 1968. p. 135. A22-6821-7. Retrieved 12 July 2019.
- ^ z/Architecture Principles of Operation (PDF). IBM. September 2017. pp. 7–266. SA22-7832-11. Retrieved 12 July 2019.
- ^ 맥스 맥스필드."4비트 컴퓨터 구축: 어셈블리 언어 및 어셈블리러"를 참조하십시오.섹션 "주소 지정 모드" 2019.
- ^ Kong, Shing; Patterson, David (1995). "Instruction set design". Slide 27.
- ^ Koopman, Philip (1989). "Architecture of the RTX 32P". Stack Computers.
- ^ "Introduction to ARMv8 64-bit Architecture". UIC Academy. quequero.org. 9 April 2014.
- ^ 704 Electronic Data-Processing Machine Manual of Operation (PDF). IBM. 1955. pp. 10–11.
- ^ Reference Manual IBM 7090 Data Processing System (PDF). IBM. 1962. pp. 9–10.
- ^ DEC-10-HMAA-D: PDP-10 KA10 Central Processor Maintenance Manual (PDF) (1st Printing ed.). Maynard, Massachusetts: Digital Equipment Corporation. December 1968. p. 2-11. Retrieved 15 May 2021.
Figure 2-9: Effective Address Calculation: test "PI RQ ?"
- ^ "Storage" (PDF). 650 magnetic drum data-processing machine - manual of operation (PDF). June 1955. p. 9. 22-6060-2. Retrieved March 14, 2022.
- ^ "Core Storage and Register Addresses" (PDF). Reference Manual - IBM 7070 Data Processing System (PDF). January 1960. p. 252. A22-7003-0. Retrieved March 14, 2022.
- ^ Jones, Douglas, Reference Instructions on the PDP-8, retrieved 1 July 2013
- ^ Friend, Carl, Data General NOVA Instruction Set Summary, retrieved 1 July 2013
- ^ "C 참조: 함수 malloc()"
- ^ a b 데이브 브룩스."오래된 컴퓨터"
- ^ 빌 퍼비스."Illiott 803B 하드웨어 세부 사항"