PDP-11 아키텍처

PDP-11 아키텍처()는 디지털 이큅먼트 코퍼레이션 (DEC)이 개발한 16비트 CISC 명령어 집합 (ISA)이다. 이는 PDP-11 미니컴퓨터에 사용되는 중앙 처리 장치 (CPU)와 마이크로프로세서에 의해 구현되었다. 1970년대에 널리 사용되었지만, 1980년대에는 더 강력한 VAX 아키텍처에 의해 결국 가려졌다.

 CPU 레지스터 
+ DEC PDP-11 레지스터 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 (비트 위치) 주요 레지스터  R0 Register 0 R1 Register 1 R2 Register 2 R3 Register 3 R4 Register 4 R5 Register 5 스택 포인터  R6 / SP Stack Pointer 프로그램 카운터  R7 / PC Program Counter 상태 플래그 CPU 특정 I T N Z V C Processor Status Word   Floating Point Status

CPU는 8개의 범용 16비트 레지스터 (R0 ~ R7)를 포함한다. 레지스터 R7은 프로그램 카운터 (PC)이다. 어떤 레지스터라도 스택 포인터로 사용될 수 있지만, R6은 하드웨어 인터럽트와 트랩에 사용되는 스택 포인터(SP)이다. R5는 종종 현재 프로시저 호출 프레임을 가리키는 데 사용된다. 컨텍스트 전환 속도를 높이기 위해 일부 PDP-11 모델은 이중 R0-R5 레지스터 세트를 제공한다. 커널, 슈퍼바이저 (존재하는 경우), 사용자 모드는 별도의 메모리 맵과 별도의 스택 포인터를 가지므로 (사용자 프로그램이 스택 포인터 레지스터에 유효하지 않은 값을 저장하여 시스템 오작동을 일으킬 수 없음) 각 모드는 서로 다른 스택 포인터를 사용한다.

 메모리 
 데이터 형식 
주소 지정 및 쓰기가 가능한 메모리의 가장 작은 단위는 8비트 바이트이다. 바이트는 R0부터 R5까지의 레지스터 하위 절반에도 저장될 수 있다.

16비트 워드는 낮은 주소에 최하위 바이트가 있는 리틀 엔디언 방식으로 저장된다. 워드는 항상 짝수 메모리 주소에 정렬된다. 워드는 R0부터 R7까지의 레지스터에 저장될 수 있다.

확장 명령어 집합(EIS)의 32비트 이중 워드는 낮은 워드가 낮은 번호의 레지스터에 저장되는 레지스터 쌍에만 저장될 수 있다. 이중 워드는 MUL, DIV 및 ASHC 명령어에 사용된다. 다른 32비트 데이터는 기본 아키텍처의 확장으로 지원된다: 부동 명령어 집합(FIS)의 단정밀도 부동소수점과 11/45 및 대부분의 후속 모델용 부동소수점 프로세서 옵션(FPP)의 명령어 집합, 상업용 명령어 집합(CIS)의 긴 데이터는 특이한 미들 엔디언 형식을 포함하여 여러 형식으로 저장되며, 때로는 "PDP-엔디언"이라고 불리기도 한다.

64비트 배정밀도 부동소수점 형식은 FPP 옵션에서 지원된다.

메모리 관리
PDP-11의 16비트 주소는 64 KB를 주소 지정할 수 있다. PDP-11이 VAX로 대체될 무렵에는 8비트 바이트와 16진법 표기가 업계 표준이 되고 있었다. 그러나 PDP-11의 숫자 값은 항상 8진법을 사용하며, PDP-11에 연결된 메모리 양은 항상 워드 수로 표시된다. 기본 논리 주소 공간은 32K 워드이지만, 물리 주소 공간의 상위 4K (메모리 관리가 없는 경우 8진법 160000부터 177777까지)는 버스의 입출력 레지스터가 해당 범위의 주소에 응답하기 때문에 채워지지 않는다. 따라서 원래는 완전히 확장된 PDP-11은 현대 용어로 28K 워드, 즉 56KB였다.

프로세서는 서비스 루틴을 시작하는 데 필요한 프로그램 카운터와 프로세서 상태 워드를 제공하는 2워드 벡터를 위해 낮은 메모리 주소를 예약한다. I/O 장치가 프로그램을 인터럽트하면, 어떤 서비스 루틴이 제어권을 가져야 하는지를 나타내기 위해 버스에 해당 벡터의 주소를 배치한다. 가장 낮은 벡터는 다양한 유형의 트랩을 처리하는 서비스 루틴이다. 트랩은 정의되지 않은 명령어 실행 시도와 같은 일부 프로그램 오류에서 발생하며, 운영체제에 서비스를 요청하기 위해 프로그램이 BPT, EMT, IOT 또는 TRAP과 같은 명령어를 실행할 때도 발생한다.

 메모리 확장 
1975년경에는 PDP-11의 16비트 논리 주소 공간이 점점 더 제약이 되었다. 이를 해결하기 위해 다양한 기술이 사용되었다.
 후기 모델 PDP-11 프로세서는 가상 주소 지정을 지원하기 위해 메모리 관리를 포함한다. 물리 주소 공간은 18 또는 22비트로 확장되어 최대 256KB 또는 4MB의 RAM을 허용한다. 논리 주소 공간(즉, 메모리 매핑 테이블을 변경하지 않고도 언제든지 사용할 수 있는 주소 공간)은 16비트로 제한된다.
 PDP-11/45부터 시작하는 일부 모델은 32K 워드(64KB)를 프로그램 코드용 "명령어 공간"으로, 별도의 32K 워드를 "데이터 공간"으로 사용하도록 설정할 수 있다. 일부 운영체제 — 특히 Unix V7 이후 버전과 RSX11-M+ —는 이 기능에 의존한다.
 필요한 경우 저장된 명령어 또는 데이터 블록을 다른 것으로 오버레이하는 것과 같은 프로그래밍 기술은 응용 프로그래머에게 페이징 문제를 숨길 수 있다. 예를 들어, 모듈라-2 컴파일러는 실행 시간 시스템이 개별 프로시저가 제어를 받을 때 8KB 페이지를 메모리로 스와핑하는 코드를 생성한다.

 주소 지정 모드 
대부분의 명령어는 피연산자를 지정하기 위해 6비트를 할당한다. 3비트는 8개의 주소 지정 모드 중 하나를 선택하고, 3비트는 범용 레지스터를 선택한다.

6비트 피연산자 주소 지정 모드의 인코딩은 다음과 같다.

5320모드레지스터

다음 섹션에서 각 항목에는 어셈블리 언어로 피연산자를 작성하는 방법의 예가 포함되어 있다. Rn은 R0부터 R7까지 작성된 8개의 레지스터 중 하나를 의미한다.

 범용 레지스터 주소 지정 모드 
다음 8가지 모드는 모든 범용 레지스터에 적용할 수 있다. R6(스택 포인터, SP) 및 R7(프로그램 카운터, PC)에 적용될 때의 효과는 다음 섹션에서 별도로 설명한다.
코드이름예시설명0n레지스터Rn피연산자가 Rn에 있다.1n레지스터 간접(Rn)Rn은 피연산자의 주소를 포함한다.2n자동 증가(Rn)+Rn은 피연산자의 주소를 포함하고, Rn을 증가시킨다.3n자동 증가 간접@(Rn)+Rn은 피연산자 주소의 주소를 포함하고, Rn을 2만큼 증가시킨다.4n자동 감소−(Rn)Rn을 감소시킨 다음, 그 결과를 피연산자의 주소로 사용한다.5n자동 감소 간접@−(Rn)Rn을 2만큼 감소시킨 다음, 그 결과를 피연산자 주소의 주소로 사용한다.6n인덱스X(Rn)Rn+X는 피연산자의 주소이다.7n인덱스 간접@X(Rn)Rn+X는 피연산자 주소의 주소이다.

인덱스 및 인덱스 간접 모드에서 X는 명령어의 두 번째 워드에서 가져온 16비트 값이다. 이중 피연산자 명령어에서는 두 피연산자 모두 이 모드를 사용할 수 있다. 이러한 명령어는 3워드 길이다.

레지스터에 대한 자동 증가 및 자동 감소 연산은 바이트 명령어에서는 1, 워드 명령어에서는 2, 간접 모드가 사용될 때마다 2씩 수행된다. 레지스터가 주소 지정하는 양이 (워드) 포인터이기 때문이다.

 프로그램 카운터 주소 지정 모드 
R7(프로그램 카운터)이 지정될 때, 4가지 주소 지정 모드는 자연스럽게 유용한 효과를 낸다.
코드이름예시설명27즉시#n피연산자는 명령어의 다음 워드이다.37절대@#a피연산자의 주소는 명령어의 다음 워드이다.67상대a피연산자의 주소는 프로그램 카운터에 추가된 명령어의 다음 워드이다.77상대 간접@a피연산자 주소의 주소는 PC에 추가된 명령어의 다음 워드이다.

즉시 및 간접 모드를 결합한 절대 모드의 유일한 일반적인 사용은 입출력 레지스터를 지정하는 것이다. 각 장치의 레지스터는 특정 메모리 주소를 가지기 때문이다. 상대 모드는 더 간단한 구문을 가지며 프로그램 변수 및 점프 대상을 참조하는 데 더 일반적이다. 내부 참조에 대해 상대 모드(및 상대 간접 모드)만 사용하는 프로그램은 위치 독립적이다. 자신의 위치에 대한 가정을 포함하지 않으므로 임의의 메모리 위치에 로드되거나 이동될 수도 있으며, 주소를 위치에 맞게 조정할 필요가 없다(재배치). 현재 위치에 상대적인 이러한 주소를 계산할 때, 프로세서는 즉시 재배치를 수행한다.

즉시 및 절대 모드는 각각 PC에 적용된 자동 증가 및 자동 증가 간접 모드이다. 보조 워드가 위 표에서 말하는 것처럼 "명령어 내"에 있을 때, 다음 명령어의 PC는 보조 워드를 지나 자동으로 증가한다. PC는 항상 워드를 가리키므로 자동 증가 연산은 항상 2씩이다.

 스택 주소 지정 모드 
R6(SP로도 작성됨)은 트랩 및 인터럽트용 하드웨어 스택으로 사용된다. PDP-11이 제공하는 모드 세트에 의해 강제되는 규칙은 스택이 항목이 푸시될 때 아래쪽으로(더 낮은 주소 방향으로) 커진다는 것이다. 모드가 SP 또는 프로그래머가 소프트웨어 스택으로 사용하기로 선택한 레지스터에 적용될 때, 주소 지정 모드는 다음과 같은 효과를 갖는다.
코드이름예시설명16간접(SP)피연산자는 스택의 맨 위에 있다.26자동 증가(SP)+피연산자는 스택의 맨 위에 있고, 그런 다음 스택에서 제거된다.36자동 증가 간접@(SP)+피연산자에 대한 포인터가 스택의 맨 위에 있다. 포인터를 제거한다.46자동 감소 −(SP)스택에 값을 푸시한다.66인덱스X(SP)이는 스택의 맨 위로부터의 양의 거리에 따라 스택의 모든 항목을 참조한다.76인덱스 간접@X(SP)이는 스택의 지정된 위치에 포인터가 있는 값을 참조한다.

소프트웨어 스택은 바이트를 포함할 수 있지만, SP는 항상 워드 스택이다. SP에 대한 자동 증가 및 자동 감소 연산은 항상 2씩이다.

 명령어 집합 
PDP-11은 바이트와 워드 단위로 작동한다. 바이트는 레지스터 번호(레지스터의 하위 바이트를 식별) 또는 메모리 위치로 지정된다. 워드는 레지스터 번호 또는 하위 바이트의 메모리 위치로 지정되며, 이는 짝수여야 한다. 피연산자를 취하는 대부분의 명령어에서 15비트는 바이트 주소 지정을 지정하기 위해 설정되거나, 워드 주소 지정을 지정하기 위해 해제된다. 다음 두 섹션의 목록에서 어셈블리 언어 프로그래머는 바이트 연산을 지정하기 위해 명령어 기호에 B를 추가했다. 예를 들어, MOV는 MOVB가 되었다.

MARK와 SOB와 같은 몇 가지 명령어는 일부 PDP-11 모델에서 구현되지 않았다.

 이중 피연산자 명령어 
상위 4비트는 수행할 연산을 지정하며(15비트는 일반적으로 워드 대 바이트 주소 지정을 선택함), 6비트 그룹 두 개는 위에 정의된 대로 소스 피연산자 주소 지정 모드와 대상 피연산자 주소 지정 모드를 지정한다.

1512119865320오퍼레이션 코드소스레지스터목적지레지스터

오퍼레이션 코드  니모닉  연산01 MOV  이동: Dest ← Src
(레지스터로 MOVB는 비트 8-15로 부호 확장)11 MOVB02 CMP  비교: Src − Dest12 CMPB03 BIT  비트 테스트: Src ∧ Dest13 BITB04 BIC  비트 지우기: Dest ← Dest ∧ (-1 - Src)14 BICB05 BIS  비트 설정: Dest ← Dest ∨ Src15 BISB06 ADD  추가: Dest ← Dest + Src16 SUB  빼기: Dest ← Dest − Src

ADD 및 SUB 명령어는 워드 주소 지정을 사용하며 바이트 지향 변형이 없다.

인코딩 제한으로 인해 일부 2-피연산자 명령어는 주소 지정 모드 피연산자와 레지스터 피연산자를 활용한다.

159865320오퍼레이션 코드레그소스/목적지레지스터

레지스터 쌍이 사용되는 경우 (아래 "(Reg, Reg+1)"로 작성), 첫 번째 레지스터는 피연산자의 하위 부분을 포함하며 짝수 번호 레지스터여야 한다. 다음 상위 번호 레지스터는 피연산자의 상위 부분 (또는 나머지)을 포함한다. 곱하기 명령어는 예외이다. Reg는 홀수일 수 있지만, 홀수이면 결과의 상위 16비트는 저장되지 않는다.
오퍼레이션 코드  니모닉  연산070MUL  부호 있는 곱셈: (Reg, Reg+1) ← Reg × Src071 DIV  부호 있는 나눗셈: (Reg, Reg+1) ÷ Src를 계산; Reg ← 몫; Reg+1 ← 나머지072 ASH  산술 시프트: if Src<5:0> < 0 then Reg ← Shift-right(Reg, -Src<5:0>) else Reg ← Shift-left(Reg, Src<5:0>)073 ASHC  산술 시프트 결합 (32 비트): if Src<5:0> < 0 then (Reg, Reg+1) ← Shift-right((Reg, Reg+1), -Src<5:0>) else (Reg, Reg+1) ← Shift-left((Reg, Reg+1), Src<5:0>)074 XOR  배타적 논리합: Dest ← Dest ⊻ Reg

 단일 피연산자 명령어 
상위 10비트는 수행할 연산을 지정하며, 15비트는 일반적으로 바이트 대 워드 주소 지정을 선택한다. 6비트 단일 그룹은 위에 정의된 대로 피연산자를 지정한다.

1565320오퍼레이션 코드소스/목적지레지스터
오퍼레이션 코드  니모닉  연산0001 JMP  점프: PC ← ea(Src)0003 SWAB  워드의 바이트 교환: Dest0-7 ↔ Dest8-150050 CLR  지우기: Dest ← 01050 CLRB0051 COM  보수: Dest ← -1 - Dest1051 COMB0052 INC  증가: Dest ← Dest + 11052 INCB0053 DEC  감소: Dest ← Dest − 11053 DECB0054 NEG  부정: Dest ← 0 - Dest1054 NEGB0055 ADC  캐리 추가: Dest ← Dest + C 플래그1055 ADCB0056 SBC  캐리 빼기: Dest ← Dest - C 플래그1056 SBCB0057 TST  테스트: Src ∧ Src1057 TSTB0060 ROR  오른쪽 회전: C ← S0; S0-14 ← S1-15; S15 ← C1060 RORB  바이트 오른쪽 회전: C ← S0; S0-6 ← S1-7; S7 ← C0061 ROL  왼쪽 회전: C ← S15; S1-15 ← S0-14; S0 ← C1061 ROLB  바이트 왼쪽 회전: C ← S7; S1-7 ← S0-6; S0 ← C0062 ASR  산술 오른쪽 시프트: Dest ← Dest ÷ 21062 ASRB0063 ASL  산술 왼쪽 시프트: Dest ← Dest x 21063 ASLB1064 MTPS  PSW로 이동: PSW ← Src0065 MFPI  이전 I 공간에서 이동: −(SP) ← Src1065 MFPD  이전 D 공간에서 이동: −(SP) ← Src0066 MTPI  이전 I 공간으로 이동: Dest ← (SP)+1066 MTPD  이전 D 공간으로 이동: Dest ← (SP)+0067 SXT  부호 확장: if N 플래그 = 0 then Dest ← 0 else Dest ← -11067 MFPS  PSW에서 이동: Dest ← PSW

 분기 명령어 
대부분의 분기 명령어에서 분기 여부는 조건 코드의 상태에 따라 결정된다. 분기 명령어는 일반적으로 2-피연산자 CMP(비교) 또는 BIT(비트 테스트) 또는 1-피연산자 TST(테스트) 명령어 앞에 온다. 산술 및 논리 명령어 또한 조건 코드를 설정한다. x86 아키텍처의 인텔 프로세서와 달리 MOV 명령어 또한 조건 코드를 설정하므로, 이동된 값이 0이거나 음수인지에 따라 분기하는 데 분기 명령어를 사용할 수 있다.

명령어의 상위 바이트는 연산을 지정한다. 비트 9부터 15는 오퍼레이션 코드이며, 비트 8은 분기가 발생하는 조건 코드 계산의 값이다. 하위 바이트는 프로그램 카운터의 현재 위치에 상대적인 부호 있는 워드 오프셋이다. 이를 통해 코드에서 순방향 및 역방향 분기가 가능하다.

159870오퍼레이션 코드C오프셋

오퍼레이션 코드  C  니모닉  조건 또는 연산000 1  BR  항상 분기 PC ← PC + 2 × Sign-extend(Offset)001 0  BNE  같지 않으면 분기 Z = 0001 1  BEQ  같으면 분기 Z = 1002 0  BGE  크거나 같으면 분기 (N ⊻ V) = 0002 1  BLT  작으면 분기 (N ⊻ V) = 1003 0  BGT  크면 분기 (Z ∨ (N ⊻ V)) = 0003 1  BLE  작거나 같으면 분기 (Z ∨ (N ⊻ V)) = 1100 0  BPL  양수이면 분기 N = 0100 1  BMI  음수이면 분기 N = 1101 0  BHI  높으면 분기 (C ∨ Z) = 0101 1  BLOS  낮거나 같으면 분기 (C ∨ Z) = 1102 0  BVC  오버플로 클리어이면 분기 V = 0102 1  BVS  오버플로 세트이면 분기 V = 1103 0  BCC or BHIS  캐리 클리어이면 분기 또는 높거나 같으면 분기 C = 0103 1  BCS or BLO  캐리 세트이면 분기 또는 낮으면 분기 C = 1

분기 명령어의 제한된 범위는 코드가 증가함에 따라 일부 분기의 대상 주소에 도달할 수 없게 된다는 것을 의미했다. 프로그래머는 1워드 BR을 다음 그룹의 2워드 JMP 명령어로 변경할 것이다. JMP는 조건부 형태가 없으므로, 프로그래머는 BEQ를 JMP 주위로 분기하는 BNE로 변경할 것이다.

SOB(Subtract One and Branch)는 또 다른 조건부 분기 명령어이다. 지정된 레지스터는 1만큼 감소되며, 결과가 0이 아니면 6비트 워드 오프셋에 따라 역방향 분기가 발생한다.

1598650오퍼레이션 코드레그오프셋

오퍼레이션 코드  니모닉  연산077 SOB  하나 빼고 분기: Reg ← Reg - 1; if Reg ≠ 0 then PC ← PC - 2 × Offset

 서브루틴 명령어 
JSR은 서브루틴을 호출한다. 6비트 그룹이 주소 지정 모드를 지정한다. JSR 명령어는 스택에 어떤 레지스터든 저장하고 해당 레지스터에 반환 주소를 로드할 수 있다. 이 기능이 필요 없는 프로그램은 PC를 레지스터로 지정하여(JSR PC, address) 루틴이 RTS PC를 사용하여 반환하도록 한다.

예를 들어, JSR R4, address로 루틴이 호출되면, R4의 이전 값은 스택의 맨 위에 푸시되고 JSR 바로 다음의 주소(일반적으로 반환 주소)가 R4에 배치된다. 그러나 루틴은 (R4)+를 지정하여 인라인으로 코딩된 값에 액세스하거나 @(R4)+를 지정하여 인라인 포인터에 액세스할 수 있다. 자동 증가는 이러한 데이터를 지나서 호출자의 코드가 다시 시작되는 지점으로 이동한다. 두 경우 모두, 이러한 루틴은 RTS R4를 지정하여 호출자에게 반환한다.

PC의 내용을 스택의 최상위 요소와 교환하는 JSR PC,@(SP)+ 형식은 코루틴을 구현하는 데 사용될 수 있다. 루틴이 코루틴의 시작 주소를 스택에 배치하면, JSR PC,@(SP)+를 실행하면 PC가 스택에 저장되고 코루틴으로 점프한다. 그러면 두 코루틴 모두 추가 JSR PC,@(SP)+ 명령어를 사용하여 이전에 중단했던 지점에서 다른 코루틴으로 점프할 수 있다. 이를 통해 두 루틴이 제어를 교환하고 이전 교환 지점에서 서로를 재개할 수 있다.

159865320오퍼레이션 코드레그소스레지스터

오퍼레이션 코드  니모닉  연산004 JSR  서브루틴으로 점프: -(SP) ← Reg; Reg ← PC; PC ← Src
PC에서 Reg로 이동된 값은 JSR 명령어 다음의 주소이다.

15320오퍼레이션 코드레그

오퍼레이션 코드  니모닉  연산00020 RTS  서브루틴에서 반환: PC ← Reg; Reg ← (SP)+

15650오퍼레이션 코드nn

오퍼레이션 코드  니모닉  연산0064 MARK  서브루틴에서 반환, 스택 항목 삭제: SP ← SP + (2 x nn), PC ← R5, R5 ← (SP)+
MARK는 서브루틴을 종료할 때 스택의 매개변수를 삭제하는 데 사용된다. MARK는 호출자가 반환 루틴에 의해 스택에서 직접 실행되도록 나중에 반환 스택에 배치된다는 점에서 특이하다. 먼저 호출자는 R5를 스택에 푸시한다. 다음으로, 최대 63개의 워드 인수가 스택에 배치될 수 있다. 호출자는 그런 다음 인수의 수를 MARK 오퍼레이션 코드에 추가하고 그 결과를 스택에 푸시한다. SP의 값은 R5로 복사된다. 마지막으로, JSR PC,address가 실행되어 서브루틴을 호출한다. 코드를 실행한 후 서브루틴은 RTS R5로 종료한다. 이는 R5의 값(스택의 MARK 명령어를 가리킴)을 PC에 로드하고 호출자의 반환 주소를 R5로 팝한다. MARK 명령어는 복잡한 작업이 SP에 대한 ADD로 대체될 수 있으므로 거의 사용되지 않는다.

 트랩 명령어 
159870오퍼레이션 코드S오퍼레이션 코드

오퍼레이션 코드  S  니모닉  연산104 0  EMT  에뮬레이터 트랩: -(SP) ← PS; -(SP) ← PC; PC ← (30); PS ← (32)104 1  TRAP  일반 트랩: -(SP) ← PS; -(SP) ← PC; PC ← (34); PS ← (36)

150오퍼레이션 코드

오퍼레이션 코드  니모닉  연산000002 RTI  인터럽트에서 반환: PC ← (SP)+; PS ← (SP)+000003 BPT  브레이크포인트 트랩: -(SP) ← PS; -(SP) ← PC; PC ← (14); PS ← (16)000004 IOT  I/O 트랩: -(SP) ← PS; -(SP) ← PC; PC ← (20); PS ← (22)000006 RTT  트랩에서 반환: PC ← (SP)+; PS ← (SP)+

 트랩 및 예외 벡터 주소 할당 
 벡터 조건 000000 (예약됨) 000004 불법 명령어, 버스 오류, 스택 제한 000010 예약 명령어 000014 BPT 명령어, 트레이스 트랩 000020 IOT 명령어 000024 전원 장애 000030 EMT 명령어 000034 TRAP 명령어 000114 패리티 오류 000244 부동소수점 예외 000250 메모리 관리 오류

 기타 명령어 
150오퍼레이션 코드

오퍼레이션 코드  니모닉  연산000000 HALT  프로세서 중지: 다음 명령어 전에 실행 중지000001 WAIT  인터럽트 대기: 다음 명령어 전에 실행 중지; 다음 인터럽트 핸들러에서 실행 재개000005 RESET  UNIBUS 리셋: 10ms 동안 UNIBUS에 INIT를 어설션; 다른 모든 장치는 전원 켜짐 상태로 리셋000240 NOP  아무 작업 없음: 아무것도 하지 않음

 조건 코드 연산 
156543210오퍼레이션 코드1SNZVC
오퍼레이션 코드  S  니모닉  연산0002 0  Ccc  조건 코드 지우기: N, Z, V, C 비트에 따라 코드 지우기0002 1  Scc  조건 코드 설정: N, Z, V, C 비트에 따라 코드 설정

프로세서 상태 워드(PSW)의 네 가지 조건 코드는 다음과 같다.
 N은 음수 값을 나타낸다.
 Z는 0(동일) 조건을 나타낸다.
 V는 오버플로 조건을 나타낸다.
 C는 캐리 조건을 나타낸다.

이 그룹의 명령어는 Digital이 "마이크로 프로그래밍"이라고 부른 것이다. 명령어 워드의 단일 비트는 단일 조건 코드를 참조했다. 어셈블러는 모든 조합을 지정하기 위한 구문을 정의하지 않았지만, SCC 및 CCC 기호는 각각 네 가지 조건 코드를 모두 설정하거나 지우는 명령어를 어셈블했다.

어떤 조건 코드도 지우거나 설정하지 않는 것(각각 오퍼레이션 코드 000240 및 000260)은 사실상 무연산 명령어(NOP)로 간주될 수 있었다. 실제로 NOP 니모닉은 000240으로 어셈블되었다.

 일관성 없는 명령어 
PDP-11의 수명 동안 명령어 및 주소 지정 모드의 조합 구현에 미묘한 차이가 발생했지만, 어떤 구현도 정확하다고 간주되지 않았다. 이러한 불일치는 PDP-11의 일반적인 사용에는 영향을 미치지 않았다. 예를 들어, MOV R5,-(R5) 명령어에서 R5가 소스로 사용되기 전에 자동 감소되는지 여부는 모델마다 다르다. PDP-11 아키텍처 핸드북, 1983년, 부록 B, "PDP-11 제품군 차이점" 인용.

 선택적 명령어 집합 
 확장 명령어 집합(EIS) 
EIS는 11/35/40 및 11/03의 옵션이며, 최신 프로세서에는 표준으로 제공되었다.
 MUL, DIV 정수 피연산자를 레지스터 쌍으로 곱하고 나눈다.
 ASH, ASHC 산술 - 레지스터 또는 레지스터 쌍을 시프트한다. 양수이면 왼쪽으로 시프트하고, 음수이면 오른쪽으로 시프트한다.

 부동 명령어 집합(FIS) 
FIS는 PDP-11/35/40 및 11/03의 옵션이다. 단정밀도 부동소수점은 레지스터 피연산자로 주소 지정된 스택에서 연산된다. 상위 13비트는 수행할 연산을 지정한다. 3비트 필드는 부동소수점 피연산자 스택 포인터로 사용되는 레지스터를 지정한다. 각 부동소수점은 2워드이며, 각 부동소수점 명령어는 2개의 부동소수점을 연산하여 1개의 부동소수점을 결과로 반환한다. 선택된 스택 포인터는 각 연산 후 4의 보폭으로 증가한다.

15320오퍼레이션 코드레그

오퍼레이션 코드  니모닉  연산07500 FADD  부동소수점 덧셈: 4(Rn) ← 4(Rn) + (Rn), Rn ← Rn + 407501 FSUB  부동소수점 뺄셈: 4(Rn) ← 4(Rn) - (Rn), Rn ← Rn + 407502 FMUL  부동소수점 곱셈: 4(Rn) ← 4(Rn) × (Rn), Rn ← Rn + 407503 FDIV  부동소수점 나눗셈: 4(Rn) ← 4(Rn) ÷ (Rn), Rn ← Rn + 4

 부동소수점 프로세서(FPP) 
이것은 11/45 및 대부분의 후속 모델을 위한 선택적 부동소수점 프로세서 옵션이었다.

 부동소수점 상태 레지스터의 단일/이중 비트에 의해 선택되는 단정밀도 또는 배정밀도 피연산자에 대한 전체 부동소수점 연산
 IEEE 754 형식의 전신인 단정밀도 부동소수점 데이터 형식: 부호 비트, 8비트 지수, 숨겨진 비트 24를 가진 23비트 가수

 상업용 명령어 집합(CIS) 
CIS 또는 CIS11으로 알려진 상업용 명령어 집합은 코볼 및 DIBOL에서 사용되는 문자열 및 이진화 십진법 (BCD) 명령어를 추가한다. 이는 11/23/24의 선택적 마이크로코드로 구현되었으며, 11/44의 추가 모듈 및 11/74의 한 버전으로 구현되었다.

문자열은 두 개의 16비트 정수로 표현되며, 범용 레지스터 중 두 개에 저장되거나 메모리의 다음 위치에 두 개의 16비트 값으로 저장된다. 하나는 최대 64KB 길이인 "n"으로 지정되고, 다른 하나는 메모리에서 문자 데이터의 시작을 가리키는 포인터인 "A"로 지정된다. 함께 n/A 쌍은 문자열의 위치와 길이를 나타낸다.

문자열 복사 연산은 MOVEC, MOVTC 및 MOVRC이다. MOVEC는 한 n/A 쌍에 표시된 위치에서 두 번째 n/A 쌍에 표시된 위치로 메모리의 문자 데이터를 복사한다. 두 n/A 쌍은 레지스터에 있고 세 번째 레지스터에는 하위 8비트에 채움 문자, 상위 8비트에 0이 포함되어 있다. MOVECI는 동일한 작업을 수행하지만 위치와 채움 문자는 레지스터 대신 메모리 위치에 저장된다. 모든 이동 명령어에서 소스가 대상보다 짧으면 대상은 채움 문자로 채워지고, 소스가 더 길면 잘린다. 둘 중 하나가 발생하면 프로세서 상태 플래그를 사용하여 이를 나타낸다. MOVRC/MOVRCI는 유사하지만, 원본 문자열을 대상에 역순으로 복사한다.

MOVTC/MOVTCI는 복사 중에 256바이트 조회 테이블을 사용하여 문자를 번역한다. 이 테이블의 시작은 MOVTC의 다른 레지스터 또는 MOVTCI의 메모리에 있는 16비트 포인터가 가리킨다. 번역은 소스 문자열의 문자 값을 인덱스 번호로 사용하고 해당 인덱스의 번역 테이블에 있는 값을 대상 문자열에 복사한다. 이는 매핑된 EBCDIC 코드에 해당하는 ASCII 문자 코드를 테이블에 배치하여 확장 이진화 십진법 교환 부호를 ASCII로 변환하는 데 사용될 수 있다. 문자 "E"는 ASCII에서 문자 69이고 EBCDIC에서 197이므로, EBCDIC를 ASCII로 변환하려면 위치 197에 69가 있는 256바이트 테이블을 만들어야 한다. MOVTC가 호출되고 원본 문자열에서 197을 보면 테이블의 위치 197을 찾아 97을 찾아 새 문자열에 출력하여 변환을 수행한다.

문자열 비교는 CMPC가 처리하며, 두 문자열을 비교한 결과에 따라 프로세서 조건 코드를 설정한다. LOCC는 문자열에서 문자의 첫 번째 발생을 찾고, SKPC는 일치하지 않는 첫 번째 문자를 검색하는 데 사용된다(예: 문자열 시작의 공백을 제거하는 데 사용). SCANC와 SPANC는 LOCC 및 SKPC와 유사하지만, 마스크된 문자 집합의 모든 문자와 일치한다. 예를 들어, VT, LF 또는 CR과 같은 줄 바꿈 문자의 다음 발생을 찾는 데 사용할 수 있다. 문자 집합은 256바이트 테이블이며, 하위 집합으로 나뉜다. 이는 첫 번째 워드의 하위 8비트가 마스크를 형성하고 두 번째 워드가 테이블의 시작을 가리키는 번역 테이블과 유사하다. 마스크는 비교 중에 문자 집합의 일부인 하위 집합 중 최대 8개를 선택한다. 이 시스템을 사용하면 대문자, 소문자, 숫자 등과 같은 문자 집합을 정의하고 마스크를 통해 쉽게 결합하여(예: 대문자 및 소문자 하위 집합을 선택하여 전체 문자 집합 생성) 사용할 수 있다.

CIS에는 BCD 숫자를 조작하기 위한 데이터 유형 및 명령어 세트도 포함되어 있다. 이 데이터는 두 개의 16비트 레지스터 또는 메모리 위치로도 표현되며, 두 번째 숫자는 문자열의 경우와 동일한 A이다. 첫 번째 워드에는 이제 압축 및 비압축 숫자, 부호 처리, 0에서 16바이트까지의 문자열 길이를 포함하는 데이터의 문자열 표현을 설명하는 네 가지 필드가 포함된다. DEC는 바이트당 한 자리 숫자인 압축되지 않은 데이터를 "숫자 문자열"이라고 불렀다. 바이트당 두 개의 BCD 숫자인 압축된 데이터를 사용하여 16바이트 문자열은 최대 32자리 길이의 BCD 숫자를 저장했다. 명령어에는 압축 및 비압축 데이터용 ADDP/ADDN, SUBP/SUBN, ASHP/ASHN(산술 시프트) 및 CMPP/CMPN(비교)이 포함되었다. 압축 데이터에만 사용할 수 있는 명령어는 MULP와 DIVP이다. CIS에는 또한 BCD 숫자를 압축 및 비압축 형식뿐만 아니라 이진 값으로 변환하는 여섯 가지 명령어 세트(CVT)가 포함되어 있다.

최종 명령어 세트는 두 개 또는 세 개의 2-워드 문자열 디스크립터를 내부 레지스터에 로드하여 여러 MOV가 필요 없도록 한다.

 프로세서 상태 워드(PSW)에 접근 
PSW는 메모리 주소 177 776에 매핑되어 있으므로 모든 데이터처럼 처리될 수 있다. 유일한 예외는 PSW를 메모리 공간에 매핑하지 않는 LSI-11이다. 가장 초기의 PDP-11을 제외한 모든 PDP-11에서 발견되는 명령어는 프로그램이 레지스터에 더 직접적으로 접근할 수 있도록 한다.
 SPL (우선 순위 레벨 설정)
 MTPS (프로세서 상태로 이동)
 MFPS (프로세서 상태에서 이동)

 다른 메모리 공간에 대한 접근 
여러 명령어 공간과 데이터 공간을 제공하는 PDP-11에서는 비정형 이동 명령어 세트가 다른 공간에 대한 접근을 제공한다. 예를 들어, 운영체제에서 런타임 서비스 호출을 처리하는 루틴은 이러한 명령어를 사용하여 호출자와 정보를 교환한다.
 MTPD (이전 데이터 공간으로 이동)
 MTPI (이전 명령어 공간으로 이동)
 MFPD (이전 데이터 공간에서 이동)
 MFPI (이전 명령어 공간에서 이동)

 예시 코드 
다음 PDP-11 어셈블리 소스 코드는 널-종료 ASCIIZ 문자열을 대문자로 변환하는 TOUPPER라는 서브루틴을 위한 것이다.

000000
000000  010046
000002  010146
000004  016600 000006

000010  112001
000012  001414
000014  120127 000172
000020  003373
000022  120127 000141
000026  002776
000030  142740 000040
000034  000766

000036  012601
000040  012600
000042  000207; TOUPPER:
; 널-종료 ASCII 문자열을 스캔하여
; 모든 알파벳 문자를 대문자로 변환한다.
;
; 진입 스택 매개변수:
;      [SP+2] = 대상 문자열의 주소
;      [SP+0] = 반환 주소
;
TOUPPER:
       MOV    R0,-(SP)         ; 레지스터 일부 저장
	   MOV    R1,-(SP)
	   MOV 	  6(SP),R0         ; 문자열 주소 가져오기

LOOP:  MOVB	  (R0)+,R1         ; 문자 하나 가져오기
	   BEQ	  DONE             ; 0이면 완료
	   CMPB	  R1, #’z          ; 'a'와 'z' 사이인가?
	   BGT	  LOOP             ; 아니면 다음 문자 가져오기
	   CMPB	  R1, #’a
	   BLT	  LOOP
	   BICB	  #40,-(R0)        ; 'a'-'z' 사이이면 'A'-'Z'로 만들기
	   BR	  LOOP

DONE:  MOV	  (SP)+,R1         ; 레지스터 복원
	   MOV	  (SP)+,R0
	   RTS	  PC               ; 서브루틴에서 반환
다음 PDP-11 어셈블리 소스 코드는 PDP-11의 주소 지정 모드를 사용하여 일반 레지스터를 전혀 사용하지 않고 동일한 루틴을 작성하는 방법을 보여준다.
000000
000000  105776 000002
000004  001416
000006  127627 000002 000172
000014  003008
000016  127627 000002 000141
000024  002403
000026  142776 000040 000002
000034  005266 000002
000040  000757

000042  000207; TOUPPER2:
; 널-종료 ASCII 문자열을 스캔하여
; 모든 알파벳 문자를 대문자로 변환한다.
;
; 진입 스택 매개변수:
;      [SP+2] = 대상 문자열의 주소
;      [SP+0] = 반환 주소
;
TOUPPER2:
       TSTB	  @2(SP)           ; 스택의 주소에서 문자 테스트
	   BEQ	  DONE             ; 0이면 완료
	   CMPB	  @2(SP), #’z      ; 'a'와 'z' 사이인가?
	   BGT	  NEXTC            ; 아니면 다음 문자를 가리킨다.
	   CMPB	  @2(SP), #’a
	   BLT	  NEXTC
	   BICB	  #40,@2(SP)       ; 'a'-'z' 사이이면 'A'-'Z'로 만들기
NEXTC: INC	  2(SP)            ; 스택의 다음 문자 주소 증가
	   BR	  TOUPPER2

DONE:  RTS	  PC

 속도 
PDP-11 프로세서 속도는 모델, 메모리 구성, 오퍼레이션 코드 및 주소 지정 모드에 따라 달라진다. 명령어 타이밍은 최대 세 가지 구성 요소를 갖는다: 명령어 자체의 인출/실행 시간과 소스 및 대상에 대한 접근 시간. 마지막 두 구성 요소는 주소 지정 모드에 따라 달라진다. 예를 들어, PDP-11/70(1975년경)에서 ADD x(Rm),y(Rn) 형식의 명령어는 인출/실행 시간이 1.35 마이크로초였으며, 소스 및 대상 시간은 각각 0.6 마이크로초로 총 명령어 시간은 2.55 마이크로초였다. 주소 지정된 메모리가 캐시에 없는 모든 경우는 1.02 마이크로초가 추가된다. 레지스터 대 레지스터 ADD Rm,Rn은 캐시에서 0.3 마이크로초 만에 실행될 수 있다. 부동소수점은 CPU와 부동소수점 프로세서 사이에 약간의 중복이 있으므로 훨씬 더 복잡하지만, 일반적으로 부동소수점은 훨씬 느리다. 단정밀도 부동소수점 덧셈 명령어는 피연산자를 인출하는 시간을 포함하여 2.4에서 5.5 마이크로초 범위이다.DEC PDP-11/70 프로세서 핸드북, 1975년, 부록 C, 명령어 타이밍.

 인터럽트 
PDP-11은 프로세서 상태 워드(PSW)의 3비트로 지정되는 0부터 7까지의 우선순위 레벨로 작동한다. 고급 모델은 PSW의 2비트에 따라 커널(특권), 사용자(응용 프로그램) 및 때로는 감독 모드 중에서 선택하여 작동할 수 있다.

인터럽트를 요청하기 위해 버스 장치는 프로세서가 응답할 때까지 4개의 공통 버스 라인(BR4에서 BR7까지) 중 하나를 어설션한다. 숫자가 높을수록 긴급도가 높음을 나타내며, 프로세서가 빠르게 응답하지 않으면 데이터가 손실되거나 원하는 섹터가 읽기/쓰기 헤드와 접촉하지 않을 수 있다. 프린터가 다른 문자를 받을 준비가 되었는지는 가장 낮은 우선순위(BR4)이며, 무기한으로 준비 상태를 유지한다. 프로세서가 레벨 5로 작동 중이라면 BR6과 BR7이 순서대로 처리된다. 프로세서가 3 이하로 작동 중이면 어떤 인터럽트든 허용하지만, 7로 작동 중이면 아무것도 허용하지 않는다. 허용되지 않은 버스 요청은 손실되지 않고 단순히 연기되며, 서비스가 필요한 장치는 버스 요청을 계속 어설션한다.

인터럽트가 프로세서의 우선순위 수준을 초과할 때마다 프로세서는 해당 버스 허용(BG4부터 BG7까지)을 어설션한다. 버스 허용 라인은 공통 라인이 아니라 데이지 체인이다. 각 게이트의 입력은 체인의 이전 게이트의 출력이다. 각 버스 장치에는 게이트가 있으며, 프로세서에 물리적으로 가까운 장치가 데이지 체인에서 더 앞에 있다. 장치가 요청을 한 경우 버스 허용 입력을 감지하면 버스 제어권을 가지고 있다고 결론을 내리고 다음 버스 장치에 허용 신호를 전달하지 않는다. 장치가 요청을 하지 않은 경우 버스 허용 입력을 버스 허용 출력으로 전파하여 다음으로 가까운 장치가 응답할 기회를 제공한다. (장치가 프로세서 보드에 인접한 슬롯을 차지하지 않는 경우, 빈 슬롯에 삽입된 "허용 연속성 카드"가 버스 허용 라인을 전파한다.)

버스를 제어하게 되면 장치는 버스 요청을 중단하고 인터럽트 서비스 루틴 주소와 새로운 PSW를 가리키는 2워드 벡터의 메모리 주소를 버스에 배치한다. 프로세서는 이전 프로그램 카운터(PC)와 PSW를 저장하고 커널 모드로 진입하며, 지정된 벡터에서 새로운 값을 로드한다. BR6의 장치에 대해 벡터의 새로운 PSW는 일반적으로 새로운 프로세서 우선순위로 6을 지정하므로, 프로세서는 서비스 루틴 동안 더 긴급한 요청(BR7)을 처리하지만, 동일하거나 낮은 우선순위의 요청은 연기한다. 새로운 PC를 사용하여 프로세서는 인터럽트 장치에 대한 서비스 루틴으로 점프한다. 해당 루틴은 적어도 인터럽트를 유발한 조건을 제거하여 장치를 작동시킨다. 루틴은 RTI(인터럽트에서 반환) 명령어로 끝나며, 이는 프로세서가 인터럽트를 허용하기 직전의 PC와 PSW를 복원한다.

버스 요청이 이루어졌는데 어떤 장치도 버스 허용에 응답하지 않으면, 프로세서는 타임아웃되어 하드웨어 문제를 암시하는 트랩을 수행한다.

 MACRO-11 어셈블리 언어 
섬네일|PDP-11에 사용된 천공 테이프

MACRO-11은 PDP-11용 어셈블리어이다. 이는 매크로 기능이 없는 초기 버전의 PDP-11 어셈블리 언어인 PAL-11 (Program Assembler Loader)의 후속작이다. MACRO-11은 모든 DEC PDP-11 운영체제에서 지원된다. PDP-11 유닉스 시스템에는 MACRO-11과 구조적으로 유사하지만 구문이 다르고 기능이 적은 어셈블러("as"라고 불림)도 포함되어 있다.

 같이 보기 
 WD16, PDP-11 ISA의 확장

 내용주 

 각주 

 추가 자료 

 외부 링크 
PDP-11 Processor Handbook (Gordon Bell's 1969 edition, 1979 edition at bitsavers )
 Preserving the PDP-11 Series of 16-bit minicomputers
 Gordon Bell and Bill Strecker's 1975 paper, What We Learned From the PDP-11
 Ersatz-11, a PDP-11 emulator
Further papers and links on Gordon Bell's site.
 The Fuzzball

분류:명령어 집합 구조