직교 명령 집합

Orthogonal instruction set

컴퓨터 공학에서 직교 명령 집합은 모든 명령 유형이 모든 주소 지정 모드를 사용할 수 있는 명령 집합 아키텍처입니다.명령 유형과 주소 지정 모드가 독립적으로 다르다는 점에서 "직교"입니다.직교 명령 집합은 특정 레지스터를[1] 사용하기 위해 특정 명령을 필요로 하는 제한을 두지 않으므로 명령 기능의 [2]중복이 거의 없습니다.

1970년대에 직교성은 프로세서 설계자의 주요 목표로 여겨졌으며, VAX-11은 이 개념의 벤치마크로 자주 사용됩니다.그러나, 1980년대에 RISC 설계 철학의 도입은 더 많은 직교성에 반대하는 추세를 크게 뒤바꾸었다.

최신 CPU는 대부분의 경우 RISC와 같은 코어로 실제 작업을 수행하기 전에 전처리 단계에서 직교성을 시뮬레이션합니다.일반적으로 이 "시뮬레이트된 직교성"은 수학적 개념과 같이 함수 라이브러리디커플링과 완전성의 개념을 포함하는 더 넓은 개념입니다.직교 함수 세트는 확장된 함수의 기초로 사용하기 쉬우며, 우리가 한 부분을 변경해도 다른 함수에 영향을 미치지 않습니다.

기본 개념

기본적으로 모든 범용 컴퓨터는 동일한 방식으로 작동합니다. 메인 메모리에 저장된 데이터는 중앙처리장치(CPU)에 의해 고속 임시 메모리(예를 들어 CPU 레지스터)로 읽혀지고, 그 다음에 다시 메인 메모리에 기록됩니다.메모리는 숫자로 인코딩되고[a] 주소에 의해 참조되는 데이터 값의 집합(숫자 값도 포함)으로 구성됩니다.즉, 데이터에 적용되는 동일한 작업을 주소 [b]자체에 적용할 수 있습니다.작업 중에는 데이터를 프로세서 레지스터에 임시로 보관할 수 있습니다. 스크래치 패드 값은 매우 빠르게 액세스할 수 있는 스크래치 패드 값입니다.레지스터는 예를 들어 숫자의 문자열을 [3]합계에 추가할 때 사용됩니다.

단일 명령, 단일 오퍼랜드

초기 컴퓨터에서는 명령 집합 아키텍처(ISA)가 단일 레지스터를 사용하는 경우가 많았는데, 이 레지스터는 어큐뮬레이터로 알려져 있습니다.지시사항에는 오퍼랜드의 주소가 포함되어 있습니다.예를 들어,ADD address이 명령어를 실행하면 CPU는 해당 주소에서 발견된 메모리 내의 번호를 가져와 어큐뮬레이터에 이미 있는 값에 추가합니다.이 매우 간단한 예시는 각 명령이 데이터의 [4]주소를 포함하기 때문에 ISA는 "하나의 주소 형식"을 가지고 있습니다.

원 어드레스 머신에서는, 추가와 같은 간단한 조작에서도, 복수의 명령이 필요하게 되어,[c] 각각 메모리가 부족하고, 판독에 시간이 걸린다는 단점이 있습니다.숫자 5 + 4 두 개를 추가하는 간단한 작업을 생각해 보십시오.이 경우 프로그램은 값 5를 어큐뮬레이터에 로드해야 합니다.LOAD address명령, 사용ADD address4개의 주소를 가리키는 명령어, 그리고 마지막으로SAVE address결과 9를 다른 메모리 [4]위치에 저장합니다.

단일 명령, 여러 오퍼랜드

예를 들어, 두 오퍼랜드의 주소를 하나의 명령으로 제공함으로써 추가적인 개선을 찾을 수 있습니다.ADD address 1, address 2이러한 「2 주소 형식」의 ISA는 매우 일반적입니다.개념을 '3주소 형식'으로 더욱 확장할 수 있습니다.SAVE또한 확장형으로 접혀 있습니다.ADD address 1, address 2, address of result를 클릭합니다.[4]

기본 컴퓨터 워드가 명령어와 주소만 유지하는 데 필요한 것보다 훨씬 더 큰 경우가 종종 있습니다. 그리고 대부분의 시스템에서는 주소 대신 상수를 유지하는 데 사용할 수 있는 남은 비트가 있습니다.명령어는 오퍼랜드 중 하나를 상수로 대체할 수 있는 경우 더욱 개선될 수 있습니다.예를 들어.ADD address 1, constant 11개의 메모리 사이클을 배제하고ADD constant 1, constant 2다른 [4]것.

다중 데이터

메모리에 액세스 하는 일반적인 패턴을 생각하면, 한층 더 복잡해집니다.가장 일반적인 패턴 중 하나는 단일 작업이 많은 양의 유사한 데이터에 적용될 수 있다는 것입니다.예를 들어 1,000개의 숫자를 더해야 할 수 있습니다.간단한 2주소 형식의 [d]명령에서는 주소를 변경할 방법이 없기 때문에 1,000개의 추가사항을 기계어로 작성해야 합니다.ISA는 간접 어드레싱의 개념으로 이 문제를 해결합니다.간접 어드레싱에서는, 데이터의 다음의 포인트의 주소가 일정하지 않고, 메모리내에 보관 유지되고 있습니다.이는 프로그래머가 해당 메모리 위치에서 추가를 수행하여 주소를 변경할 수 있음을 의미합니다.또한 ISA는 종종 레지스터 중 하나(경우에 따라서는 특별한 인덱스 레지스터)에 보유된 값을 추가하여 주소를 초기 위치에서 오프셋하는 기능을 포함합니다.다른 사용자는 사용 [4]지침의 일부로 이 추가를 자동으로 수행합니다.

주소 지정 모드가 다양하기 때문에 명령이 약간 다릅니다.단일 주소의 ISA를 고려한다면, 하나의 명령이라도ADD「어드레싱 모드」는, 다음과 같이 많은 가능성이 있습니다.

  • 즉시(일정): ADD.C constant 1: 어큐뮬레이터의 결과에 상수 값을 추가합니다.
  • 다이렉트 어드레스:ADD.A address 1: 주소 1에 저장되어 있는 값을 추가합니다.
  • 메모리 간접:ADD.M address 1주소 1 의 값을 읽어, 그 값을 다른 주소로 사용하고, 그 값을 추가합니다.

또한 많은 ISA에는 산술 태스크뿐만 아니라 어드레싱에도 사용할 수 있는 레지스터가 있습니다.이것은 단일 주소 레지스터를 사용하는 경우 단일 주소 형식으로 사용할 수 있습니다.이 경우, 다음의 몇개의 새로운 모드를 사용할 수 있게 됩니다.

  • 직접 등록:ADD.R register 1: 레지스터 1에 저장되어 있는 주소에 저장된 값을 추가합니다.
  • 변위:ADD.D constant 1: 주소 레지스터에 상수를 추가한 후 결과 위치의 메모리 값을 추가합니다.
  • 색인:ADD.I register 1: 레지스터 1의 값을 주소 레지스터에 추가하여 새 주소를 만든 후 해당 위치의 값을 어큐뮬레이터에 추가합니다.
  • 자동 색인:ADD.AI register 1- Index 케이스와 마찬가지로 주소가 자동으로 증가합니다.

직교성

직교성은 모든 명령에서 지원되는 주소 지정 모드를 사용할 수 있어야 한다는 원칙입니다.이 예에서는, 의 직접 행선지ADD사용할 수 있습니다.다른 모든 것도 사용할 수 있습니다.이 설계의 이유는 미적인 것이 아니라 프로그램의 객체 코드의 전체 크기를 줄이는 것이 목적입니다.ISA는 다양한 어드레싱 모드를 제공함으로써 프로그래머가 그 시점에서 프로그램의 요구에 정확히 일치하는 것을 선택할 수 있도록 하고, 따라서 동일한 목적을 달성하기 위해 여러 명령을 사용할 필요성을 줄입니다.즉, 총 명령 수가 감소하여 메모리를 절약하고 성능을 향상시킵니다.직교성은 종종 매우 "비트 효율성"[5]으로 설명되었습니다.

주소 지정 모드 지정자 비트를 opcode 작동 비트와 분리하여 유지하면 직교 명령 세트가 생성됩니다.

직교 설계의 궁극적인 목적은 어떤 명령에서도 모든 유형의 주소를 사용할 수 있도록 하는 것이기 때문에 직교성을 구현하는 것은 종종 프로세서 부품 사이에 배선을 추가하는 경우에 불과합니다.그러나 명령 디코더의 복잡성도 가중됩니다.이 회로는 프로그램 카운터가 가리키는 위치에서 메모리로부터 명령을 읽고 [5]처리 방법을 결정합니다.

위에서 설명한 ISA의 예에서는ADD.C직접 인코딩을 사용하는 명령은 명령을 실행하는 데 필요한 데이터를 이미 가지고 있으며 더 이상의 처리는 필요하지 않습니다. 디코더는 단순히 값을 산술 논리 유닛(ALU)으로 보냅니다.다만,ADD.A명령어를 사용하여 주소를 읽어야 하고 메모리 위치의 값을 읽어야 합니다.그러면 ALU는 속행할 수 있습니다.이 일련의 이벤트는 완료하는 데 훨씬 더 오래 걸리고 [5]더 많은 내부 단계가 필요합니다.

그 결과, 명령의 다양한 종류를 완료하는 데 필요한 시간은 매우 다양할 수 있으며, 이로 인해 전체 CPU 설계가 복잡해집니다.따라서 직교성은 설계의 트레이드오프를 나타냅니다.컴퓨터 설계자는 CPU 자체를 더 복잡하게 [5]만들면서도 코드 밀도를 향상시키기 위해 프로그래머에게 더 많은 어드레싱 모드를 제공하는 것을 선택할 수 있습니다.

메모리가 작고 비쌀 때, 특히 드럼 메모리코어 메모리 시대에는 직교성이 매우 바람직했습니다.그러나 복잡성은 현재 기술을 사용하여 달성할 수 있는 수준을 넘어서는 경우가 많았습니다.이러한 이유로 1960년대 대부분의 기계는 설계자가 감당할 수 있는 범위 내에서 부분적인 직교 기능만을 제공했습니다.대규모 통합의 도입으로 컴퓨터 설계의 복잡성이 현저하게 감소하고 완전히 직교하는 설계가 등장하기 시작한 것은 1970년대부터입니다.1980년대까지 이러한 설계는 단일 칩 [5]CPU에 구현될 수 있었다.

1970년대 후반, 최초의 고출력 완전 직교 설계가 등장하면서, 목표는 고급 언어 컴퓨터 아키텍처, 줄여서 HLLCA로 확대되었습니다.기계어의 비트 밀도를 개선하기 위해 직교성이 요구되었듯이, HLLCA의 목표는 ALGOL 68과 같은 고급 언어의 비트 밀도를 개선하는 것이었습니다.이러한 언어들은 일반적으로 일시적인 값을 저장하는 복잡한 스택의 일종인 활성화 레코드를 사용하였고, 일반적으로 ISA는 이를 직접 지원하지 않았으며 기반이 되는 ISA의 많은 개별 명령을 사용하여 구현해야 했다.이러한 구조에 대한 지원을 추가하면 프로그램을 [5]ISA로 직접 번역할 수 있습니다.

실제 직교성

PDP-11

PDP-11은 (주로 부동소수점 [6]명령을 제외하고) 실질적으로 직교했습니다.대부분의 정수 명령어는 1바이트 또는 2바이트 값으로 동작할 수 있으며 레지스터에 저장된 데이터, 명령의 일부로 저장된 데이터, 메모리에 저장된 데이터 또는 레지스터 또는 메모리에 저장된 주소로 가리킬 수 있습니다.PC스택 포인터조차도 모든 일반 데이터 모드를 사용하는 일반 명령의 영향을 받을 수 있습니다."즉시" 모드(예: ADD #4, R1 (R1 = R1 + 4)는 "간접, 자동 증가" 모드로 구현되었으며, 프로그램 카운터(R7)를 레지스터로 지정하여 방향 및 자동 증가에 사용(ADD (R7+RWORD) 4.1).[7]

PDP-11에서는 주소 지정 모드(0~7)에 3비트필드를 사용했기 때문에 (전자적으로)8개의 주소 지정 모드가 있었습니다.추가 3비트 필드에 레지스터(R0–R5, SP, PC)가 지정되었습니다.프로그램 카운터(R7)에 2개의 자동 증가 모드를 적용하는 즉시 및 절대 주소 오퍼랜드에서는 총 10개의 개념 주소 지정 모드가 제공되었습니다.대부분의 2개의 오퍼랜드명령어는 양쪽 [7]파라미터의 모든 어드레싱 모드를 지원했습니다.

VAX-11

VAX-11은 PDP-11의 직교성을 부동 소수점 번호를 [5]포함한 모든 데이터 유형으로 확장했습니다.'ADD'와 같은 명령어는 각각 ADDB, ADDW, ADDL, ADDP, ADDF와 같은 데이터 크기 의존형 변형으로 구분되어 추가 바이트, 워드, 롱워드, 패킹 BCD, 단정도 부동소수점으로 구분되었다.PDP-11과 마찬가지로 스택 포인터와 프로그램카운터는 일반 레지스터 파일(R14 및 R15)[8]에 있습니다.

VAX-11 명령의 일반적인 형식은 다음과 같습니다.

opcode [operand ][operand ]... 

각 컴포넌트는 1바이트이고 opcode는 0~255 범위의 값이며, 2개의 니블(어드레싱 모드를 지정하는 상위 4비트 및 레지스터 번호(R0~R15)[8]를 지정하는 하위 4비트)로 구성된 각 오퍼랜드입니다.

PDP-11의 3비트 필드와 달리 VAX-11의 4비트 서브바이트에서는 16개의 주소 지정 모드(0~15)가 있었습니다.단, 어드레싱 모드0 ~ 3은 6비트 이하의 즉시 데이터(어드레싱 모드의 하위 2비트는 해당 데이터 어드레싱 바이트의 나머지 4비트에 추가되었을 때 즉시 데이터의 상위 2비트가 됩니다)에 대해서는 "짧은 즉시"였습니다.어드레싱 모드 0 ~3이 동일하기 때문에 13(전자) 어드레싱 모드가 되었습니다만, PDP-11과 같이, 스택 포인터(R14)와 프로그램 카운터(R15)의 사용으로, 합계 15 이상의 개념 어드레싱 모드가 작성되었습니다(어셈블러 프로그램은 소스 코드를 실제 스택포간 또는 프로그램 카운터 베이스의 어드레싱으로 변환합니다).([8]필요)

MC68000 등

Motorola의 디자이너들은 조립 언어를 직교로 만들려고 시도했지만, 기초 기계 언어는 약간 덜했다.PDP-11과는 달리 MC68000(68k)은 데이터와 데이터 주소를 메모리에 저장하기 위해 별도의 레지스터를 사용했습니다.ISA는 주소가 그 레지스터에서만 사용될 수 있는 범위 내에서 직교하였으나, 어떤 레지스터가 다른 명령에서 사용될 수 있는지에 대한 제한은 없었다.마찬가지로 데이터 레지스터도 명령 간에 직교했습니다.PDP-11과는 달리 68000에서는 2 파라미터 명령에 대해 1개의 일반 주소 지정 모드만 지원되었습니다.MOV를 제외하고 다른 파라미터는 항상 레지스터였습니다.MOV 명령에서는 양쪽 [9]파라미터의 모든 어드레싱 모드가 지원되고 있습니다.

반면 NS320x 시리즈는 원래 VAX-11 ISA의 싱글칩 구현으로 설계되었습니다.법률상의 문제로 인해 변경은 필요했지만, 그 결과 시스템은 VAX-11의 전체적인 설계 이념의 대부분을 유지하고 완전히 [10]직교한 상태로 유지되었습니다.여기에는 68k에서 [11]발견된 별도의 데이터 및 주소 레지스터가 제거되었습니다.

8080 이후의 설계

8비트 인텔 8080 (8085 및 8051) 마이크로프로세서는 기본적으로 약간 확장 어큐뮬레이터 기반의 설계이므로 직교하지 않습니다.어셈블리 언어 프로그래머 또는 컴파일러 라이터는 각 레지스터에서 가능한 연산을 염두에 두어야 합니다.대부분의 8비트 연산은 8비트 어큐뮬레이터(A-register)에서만 실행할 수 있는 반면 16비트 연산은 16비트 포인터/어큐뮬레이터(HL-register 쌍)에서만 실행할 수 있는 반면 증분 등의 간단한 연산은 7개의 8비트 레지스터 모두에서 가능합니다.이는 주로 모든 opcode를 1바이트 길이로 유지하고자 하는 욕구 때문입니다.

바이너리 호환 Z80은 나중에 프리픽스 코드를 추가하여 이 1바이트 제한에서 벗어나 보다 강력한 명령 집합을 가능하게 했습니다.인텔 8086 에서도 같은 기본적인 아이디어가 채용되고 있습니다만, 보다 급진적인 확장을 가능하게 하기 위해서, 8080과의 바이너리 호환성은 여기에서는 시험하지 않았습니다.당시 높은 코드 밀도를 위해 어느 정도 비정통성을 유지했습니다.80386과 함께 도입된 이 아키텍처의 32비트 확장은 8086 명령어와 확장 명령어를 모두 유지했음에도 불구하고 다소 직교적이었습니다.다만, 사용되고 있는 부호화 전략에서는, 8008 및 8080(및 Z80)으로부터의 트레이스가 다수 표시됩니다.예를 들어, 싱글 바이트 인코딩은 레지스터 및 상수의 푸시팝과 같은 특정 빈번한 작업을 위해 유지됩니다.또한 프라이머리 어큐뮬레이터인 EAX 레지스터는 특정 유형의 작업에 대해 다른 레지스터보다 짧은 인코딩을 사용합니다.이러한 관찰은 컴파일러와 손으로 쓴 코드 모두에서 코드 최적화에 악용될 수 있습니다.

RISC

1970년대까지 많은 연구에서 직교 모드에 의해 제공되는 유연성이 실제 문제에서 거의 또는 전혀 사용되지 않았음을 입증했다.특히 IBM은 System/370에서 실행되는 코드의 흔적을 연구하여 사용 가능한 모드의 극히 일부만 실제 프로그램에서 사용되고 있음을 입증했습니다.종종 VAX에 관한 유사한 연구에서도 동일한 패턴이 나타났다.경우에 따라서는 명령어의 복잡성으로 인해 일련의 작은 명령어보다 실행 시간이 더 오래 걸린다는 것을 알 수 있었습니다.VAX가 그 예입니다.INDEX사용설명서.[12]

같은 기간 반도체 메모리의 크기는 급격히 커지고 비용은 낮아졌다.하지만, 그들은 같은 속도로 속도가 향상되지 않았다.이는 CPU의 속도에 비해 메모리에서 데이터에 액세스하는 데 필요한 시간이 상대적으로 증가했음을 의미합니다.이것은 더 많은 레지스터를 포함해야 한다고 주장했고 CPU에 더 많은 임시 값을 부여했습니다.레지스터의 수가 많을수록 레지스터 번호를 인코딩하기 위해 컴퓨터 워드에 더 많은 비트가 필요하다는 것을 의미하며, 이는 공간을 확보하기 위해 명령어 자체의 수를 줄일 것을 시사한다.

마지막으로 Andrew Tanenbaum의 논문에 따르면 프로그램에 포함된 모든 상수의 97%가 0에서 10 사이이며, 0은 전체의 20~30%를 나타냅니다.또한 프로그램에 포함된 모든 값의 30~40%가 상수이며 단순 변수(배열 등과는 반대)는 35~40%[13]입니다.프로세서가 32비트와 같은 더 큰 명령어를 사용하는 경우 명령 자체가 너무 많은 비트를 사용하지 않는 한 두 개의 상수와 레지스터 번호를 하나의 명령으로 인코딩할 수 있습니다.

이러한 관찰에 의해 프로세서 설계의 주된 목표로서 직교 설계가 포기되어 1980년대에 RISC 철학이 대두되었습니다.RISC 프로세서는 일반적으로 다이렉트(정수)와 레지스터의 2가지 어드레싱 모드밖에 없습니다.오래된 프로세서에서 발견된 다른 모든 모드는 레지스터 간에 데이터를 이동하는 로드 및 저장 명령을 사용하여 명시적으로 처리됩니다.사용할 수 있는 주소 지정 모드는 몇 개뿐이며, 이러한 모드는 명령이 데이터를 참조하는지 또는 제어 전송을 수반하는지 여부에 따라 달라질 수 있습니다.

메모들

  1. ^ 디지털화」를 참조해 주세요.
  2. ^ address는 데이터로 취급할 수 있는 단순한 16진수입니다.
  3. ^ 최신 컴퓨터에서도 제한된 리소스인 캐시에 데이터를 저장함으로써 성능을 극대화합니다.
  4. ^ 주소를 조작할 수 없다고 가정하고

레퍼런스

  1. ^ Null, Linda; Lobur, Julia (2010). The Essentials of Computer Organization and Architecture. Jones & Bartlett Publishers. pp. 287–288. ISBN 978-1449600068.
  2. ^ Tariq, Jamil (1995), "RISC vs CISC: Why less is more", IEEE Potentials (August/September), retrieved 7 May 2019
  3. ^ "Basic Computer Organization & Design" (PDF). Computational Sensory-Motor Systems Laboratory.
  4. ^ a b c d e Tullsen, Dean. "Instruction Set Architecture" (PDF). UCSD.
  5. ^ a b c d e f g Hennessy, John; Patterson, David (2002-05-29). Computer Architecture: A Quantitative Approach. p. 151. ISBN 9780080502526.
  6. ^ "Introduction to the PDP-11". University of Sydney.
  7. ^ a b "PDP-11 instruction reference" (PDF). University of Toronto.
  8. ^ a b c "Another Approach to Instruction Set Architecture—VAX" (PDF).
  9. ^ Veronis, Andrew (2012-12-06). The 68000 Microprocessor. p. 54. ISBN 9781468466478.
  10. ^ Tilson, Michael (October 1983). "Moving Unix to New Machines". BYTE. p. 266. Retrieved 31 January 2015.
  11. ^ "NS32532". Datormuseum.
  12. ^ Patterson, D. A.; Ditzel, D. R. (1980). "The case for the reduced instruction set computer". ACM SIGARCH Computer Architecture News. 8 (6): 25–33. CiteSeerX 10.1.1.68.9623. doi:10.1145/641914.641917. S2CID 12034303.
  13. ^ Tanenbaum, Andrew (1978). "Implications of structured programming for machine architecture". Communications of the ACM. 21 (3): 237–246. doi:10.1145/359361.359454. hdl:1871/2610. S2CID 3261560.