Architektura PDP-11

PDP-11
Projektant Firma Sprzęt Cyfrowy
Bity 16-bitowy
wprowadzony 1970 ; 53 lata temu ( 1970 )
Projekt CISC
Typ

Rejestr-rejestr Rejestr-pamięć Pamięć-pamięć
Kodowanie Zmienna (od 2 do 6 bajtów)
Rozgałęzienie Kod warunku
endianizm Mieszane (little-endian dla 16-bitowych liczb całkowitych)
otwarty NIE
Następca VAX
Rejestry
Ogólny cel 8 × 16-bitowy
Zmiennoprzecinkowy 6 × 64-bitowych rejestrów zmiennoprzecinkowych, jeśli występuje FPP

Architektura PDP-11 to architektura zestawu instrukcji CISC (ISA) opracowana przez firmę Digital Equipment Corporation (DEC). Jest on realizowany przez jednostki centralne (CPU) i mikroprocesory stosowane w minikomputerach PDP-11 . Był szeroko stosowany w latach 70., ale ostatecznie został przyćmiony przez potężniejszą architekturę VAX w latach 80.

Pamięć

Formaty danych

Szesnastobitowe słowa są przechowywane w postaci little-endian (z najmniej znaczącymi bajtami na początku). Trzydziestodwubitowe dane — obsługiwane jako rozszerzenia podstawowej architektury, np. zmiennoprzecinkowe w zestawie instrukcji FPU , podwójne słowa w rozszerzonym zestawie instrukcji lub długie dane w komercyjnym zestawie instrukcji — są przechowywane w więcej niż jednym formacie, w tym niezwykły format mid-endian, czasami nazywany „PDP-endian”.

Zarządzanie pamięcią

16-bitowe adresy PDP-11 mogą adresować 64 KB . Zanim PDP-11 ustąpił VAX, 8-bitowe bajty i notacja szesnastkowa stały się standardem w branży; jednak wartości liczbowe na PDP-11 zawsze używają notacji ósemkowej, a ilość pamięci dołączonej do PDP-11 jest zawsze podawana jako liczba słów. Podstawowa logiczna przestrzeń adresowa to 32 000 słów, ale duże 4 KB fizycznej przestrzeni adresowej (adresy od 160000 8 do 177777 8 przy braku zarządzania pamięcią) nie są zapełniane, ponieważ rejestry wejścia/wyjścia na magistrali odpowiadają na adresy z tego zakresu. Tak więc pierwotnie w pełni rozszerzony PDP-11 miał 28 000 słów, czyli 56 KB we współczesnych terminach.

Procesor rezerwuje adresy o małej pamięci dla dwusłowowych wektorów, które dają licznik programu i słowo stanu procesora, od którego można rozpocząć procedurę serwisową. Kiedy urządzenie I/O przerywa program, umieszcza adres swojego wektora na szynie, aby wskazać, która procedura serwisowa powinna przejąć kontrolę. Najniższe wektory to procedury serwisowe do obsługi różnych typów pułapek. Pułapki występują w przypadku niektórych błędów programu, takich jak próba wykonania niezdefiniowanej instrukcji; a także gdy program wykonuje instrukcje, takie jak BPT, EMT, IOT lub TRAP, aby zażądać usługi z systemu operacyjnego.

Rozszerzenie pamięci

W okresie eksploatacji PDP-11 16-bitowa logiczna przestrzeń adresowa stawała się coraz większym ograniczeniem. Aby go obejść, zastosowano różne techniki:

  • Nowsze modele procesorów PDP-11 obejmują zarządzanie pamięcią w celu obsługi adresowania wirtualnego . Fizyczna przestrzeń adresowa została rozszerzona do 18 lub 22 bitów, umożliwiając w ten sposób do 256 KB lub 4 MB pamięci RAM. Logiczna przestrzeń adresowa (czyli przestrzeń adresowa dostępna w każdej chwili bez zmiany tablicy mapowania pamięci) pozostaje ograniczona do 16 bitów.
  • Niektóre modele, począwszy od PDP-11/45, można ustawić tak, aby używały 32 000 słów (64 KB) jako „przestrzeni instrukcji” dla kodu programu i oddzielnych 32 000 słów „przestrzeni danych”. Niektóre systemy operacyjne — w szczególności Unix od wersji V7 i RSX11-M+ — polegają na tej funkcji.
  • Techniki programistyczne, takie jak nakładanie bloku przechowywanych instrukcji lub danych na inny w razie potrzeby, mogą ukryć problemy ze stronicowaniem przed programistą aplikacji. Na przykład Modula-2 tworzy kod, w ramach którego system czasu wykonywania zamienia strony o wielkości 8 Kb w pamięci, gdy poszczególne procedury otrzymują kontrolę.

Rejestry procesora

Rejestry DEC PDP-11
1 5 1 4 1 3 1 2 1 1 10 09 08 07 06 05 04 03 02 01 00 (pozycja bitu)
Rejestry główne
R0 Zarejestruj się 0
R1 Zarejestruj się 1
R2 Zarejestruj się 2
R3 Zarejestruj się 3
R4 Zarejestruj się 4
R5 Zarejestruj się 5
Wskaźnik stosu
R6 / SP Rejestr 6 / W skaźnik stosu
Licznik programu
R7 / PC Rejestr 7 / Licznik programów _
Flagi stanu
  I T N Z V C Słowo statusu procesora _ _ _
    Zmiennoprzecinkowy rejestr stanu punktów _ _ _ _

Procesor zawiera osiem 16-bitowych rejestrów ogólnego przeznaczenia (od R0 do R7). Rejestr R7 to licznik programu (PC). Chociaż każdy rejestr może być użyty jako wskaźnik stosu, R6 jest wskaźnikiem stosu (SP) używanym do przerwań sprzętowych i pułapek. R5 jest często używany do wskazania bieżącej ramki wywołania procedury. Aby przyspieszyć przełączanie kontekstu, niektóre modele PDP-11 zapewniają podwójne zestawy rejestrów R1-R5. Tryby jądra, nadzorcy (jeśli występują) i użytkownika mają oddzielne mapy pamięci, a także oddzielne wskaźniki stosu (tak, że program użytkownika nie może spowodować nieprawidłowego działania systemu poprzez przechowywanie nieprawidłowej wartości w rejestrze wskaźnika stosu).

Tryby adresowania

Większość instrukcji przydziela sześć bitów do określenia operandu. Trzy bity wybierają jeden z ośmiu trybów adresowania, a trzy bity wybierają rejestr ogólny.

Kodowanie trybu adresowania operandu sześciobitowego jest następujące:

5 3 2 0
Tryb Rejestr


W poniższych sekcjach każdy element zawiera przykład zapisu operandu w asemblerze. Rn oznacza jeden z ośmiu rejestrów, zapisanych od R0 do R7.

Ogólne tryby adresowania rejestrów

Poniższe osiem trybów można zastosować do dowolnego rejestru ogólnego. Ich efekty po zastosowaniu do R6 (wskaźnik stosu, SP) i R7 (licznik programu, PC) są omówione oddzielnie w poniższych sekcjach.

Kod Nazwa Przykład Opis
0n Rejestr Rn Operand jest w Rn
1n Rejestracja odroczona (Rn) Rn zawiera adres operandu
2n Automatyczne zwiększanie (Rn)+ Rn zawiera adres operandu, a następnie inkrementuje Rn
3n Autoinkrementacja odroczona @(Rn)+ Rn zawiera adres adresu operandu, następnie zwiększ Rn o 2
4n Automatyczne zmniejszanie −(Rn) Zmniejsz Rn, a następnie użyj wyniku jako adresu operandu
5n Automatyczne zmniejszanie odroczone @−(Rn) Zmniejsz Rn o 2, a następnie użyj wyniku jako adresu adresu operandu
6n Indeks X(Rn) Rn+X to adres operandu
7n Indeks odroczony @X(Rn) Rn+X to adres adresu operandu

W trybach indeksu i indeksu odroczonego X jest wartością 16-bitową pobraną z drugiego słowa instrukcji. W instrukcjach dwuargumentowych oba operandy mogą używać tych trybów. Takie instrukcje mają długość trzech słów.

Operacje autoinkrementacji i autodekrementacji w rejestrze są wykonywane o 1 w instrukcjach bajtowych, o 2 w instrukcjach słownych io 2, gdy używany jest tryb odroczony, ponieważ ilość, do której adresowany jest rejestr, jest wskaźnikiem (słowem).

Zaprogramuj tryby adresowania licznika

Po określeniu R7 (licznik programu) cztery tryby adresowania naturalnie dają użyteczne efekty:

Kod Nazwa Przykład Opis
27 Natychmiastowy #N Operand jest kolejnym słowem instrukcji
37 Absolutny @#A Adres operandu jest następnym słowem instrukcji
67 Względny A Adres operandu jest kolejnym słowem instrukcji dodanej do PC
77 Względny odroczony @A Adres adresu argumentu jest kolejnym słowem instrukcji dodanej do PC

Jedynym powszechnym zastosowaniem trybu bezwzględnego, którego składnia łączy tryb natychmiastowy i odroczony, jest określenie rejestrów wejścia/wyjścia, ponieważ rejestry dla każdego urządzenia mają określone adresy pamięci. Tryb względny ma prostszą składnię i jest bardziej typowy dla odwoływania się do zmiennych programu i miejsc docelowych skoków. Program, który używa trybu względnego (i względnego trybu odroczonego) wyłącznie dla odwołań wewnętrznych, jest niezależny od pozycji ; nie zawiera żadnych założeń dotyczących jego własnej lokalizacji, więc można go załadować do dowolnego miejsca w pamięci, a nawet przenieść, bez potrzeby dostosowywania jego adresów w celu odzwierciedlenia jego lokalizacji ( relocated ). Przy obliczaniu takich adresów względem bieżącej lokalizacji procesor przeprowadzał relokację w locie.

Tryby natychmiastowy i bezwzględny to odpowiednio tryb automatycznego przyrostu i odroczony tryb automatycznego przyrostu, stosowane na komputerze PC. Gdy słowo pomocnicze jest „w instrukcji”, jak podano w powyższej tabeli, PC dla następnej instrukcji jest automatycznie zwiększany za słowem pomocniczym. Ponieważ PC zawsze wskazuje słowa, operacja automatycznego zwiększania jest zawsze o 2.

Tryby adresowania stosu

R6, również pisany jako SP, jest używany jako stos sprzętowy dla pułapek i przerwań. Konwencja narzucona przez zestaw trybów zapewnianych przez PDP-11 polega na tym, że stos rośnie w dół — w kierunku niższych adresów — w miarę wypychania na niego elementów. Gdy tryb jest zastosowany do SP lub do dowolnego rejestru, którego programista zdecyduje się użyć jako stosu oprogramowania, tryby adresowania mają następujące skutki:

Kod Nazwa Przykład Opis
16 Odroczony (SP) Operand znajduje się na szczycie stosu
26 Automatyczne zwiększanie (SP)+ Operand znajduje się na szczycie stosu, a następnie zdejmij go
36 Autoinkrementacja odroczona @(SP)+ Wskaźnik do operandu znajduje się na górze stosu; wysuń wskaźnik
46 Automatyczne zmniejszanie −(SP) Przenieś wartość na stos
66 Indeksowane X(SP) Odnosi się to do dowolnego elementu na stosie przez jego dodatnią odległość od góry
76 Indeksowane odroczone @X(SP) Odnosi się to do wartości, do której wskaźnik znajduje się w określonym miejscu na stosie

Chociaż stosy oprogramowania mogą zawierać bajty, SP jest zawsze stosem słów. Operacje autoinkrementacji i autodekrementacji na SP są zawsze o 2.

Zestaw instrukcji

PDP-11 działa na bajtach i słowach. Bajty są określane przez numer rejestru - identyfikujący bajt niższego rzędu w rejestrze - lub przez lokalizację pamięci. Słowa są określone przez numer rejestru lub lokalizację pamięci bajtu niższego rzędu, który musi być liczbą parzystą. W większości instrukcji, które przyjmują operandy, bit 15 jest ustawiony na adresowanie bajtów lub bit czysty na adresowanie słów. Na listach w następnych dwóch sekcjach programista języka asemblerowego dodał B do symbolu instrukcji, aby określić operację bajtową; na przykład MOV stało się MOVB.

Kilka instrukcji, na przykład MARK i SOB, nie zostało zaimplementowanych w niektórych modelach PDP-11.

Instrukcje dwuargumentowe

Cztery bity wyższego rzędu określają operację, która ma zostać wykonana (przy czym bit 15 ogólnie wybiera adresowanie słowo kontra bajt). Dwie grupy po sześć bitów określają tryb adresowania argumentu źródłowego i tryb adresowania argumentu docelowego, jak zdefiniowano powyżej.

15 12 11 9 8 6 5 3 2 0
Kod operacji Src Rejestr Cel Rejestr
Kod operacji Mnemoniczny Operacja
01 MOV Przenieś: Cel ← Src

Uwaga: Przeniesienie bajtu do znaku rejestru rozciąga się na bity 8-15

11 MOVB
02 CMP Porównaj: Set-flags(Src − Dest)
12 CMPB
03 FRAGMENT Test bitów: Ustaw flagi (Src ∧ Dest)
13 BITB
04 BIC Bit jasne: Dest ← Dest ∧ Uzupełnienie do jedynek (Src)
14 BICB
05 BIS Zestaw bitów: Dest ← Dest ∨ Src
15 BISB
06 DODAĆ Dodaj: Dest ← Dest + Src
16 POD Odejmij: Cel ← Cel − Src

Instrukcje ADD i SUB używają adresowania słów i nie mają odmian zorientowanych na bajty.

Niektóre instrukcje dwuoperandowe wykorzystują operand trybu adresowania i dodatkowy operand rejestru:

15 9 8 6 5 3 2 0
Kod operacji Rej źródło/docel Rejestr

Gdy używana jest para rejestrów (zapisana poniżej jako „(Reg, Reg+1)”, pierwszy rejestr zawiera najmłodszą część operandu i musi być rejestrem o numerze parzystym. Następny rejestr o wyższym numerze zawiera rejestr o wyższym numerze część operandu (lub reszta) Wyjątkiem jest instrukcja mnożenia Reg może być nieparzysta, ale jeśli tak jest, 16 bitów wyniku nie jest zapisywanych.

Kod operacji Mnemoniczny Operacja
070 MUL Pomnóż: (Reg, Reg+1) ← Reg × Src
071 DIV Podziel: Oblicz (Reg, Reg+1) ÷ Src; Reg ← iloraz; Reg+1 ← reszta
072 POPIÓŁ Przesunięcie arytmetyczne: jeśli Src<5:0> < 0 then Reg ← Shift-right(Reg, -Src<5:0>) else Reg ← Shift-left(Reg, Src<5:0>)
073 ASHC Łączne przesunięcie arytmetyczne: jeśli Src<5:0> < 0 to (Reg, Reg+1) ← Shift-prawo((Reg, Reg+1), -Src<5:0>) else (Reg, Reg+1) ← Shift-lewo((Reg, Reg+1), Src<5:0>)
074 XOR Wyłącznie lub: Dest ← Dest ⊻ Reg

Instrukcje jednoargumentowe

Dziesięć bitów wyższego rzędu określa operację, która ma zostać wykonana, przy czym bit 15 ogólnie wybiera adresowanie bajtów i słów. Pojedyncza grupa sześciu bitów określa operand, jak zdefiniowano powyżej.

15 6 5 3 2 0
Kod operacji źródło/docel Rejestr
Kod operacji Mnemoniczny Operacja
0001 JMP Skok: PC ← Src
0003 WYMAZ Zamień bajty słowa: Dest ← Zamień bajty (Dest)
0050 CLR Wyczyść: Cel ← 0
1050 CLRB
0051 KOM Dopełnienie: Dest ← Uzupełnienie do jedynek(Dest)
1051 GRZEBIEŃ
0052 INC Przyrost: cel ← cel + 1
1052 INCB
0053 grudzień Zmniejszenie: Cel ← Cel − 1
1053 GRUDZIEŃ
0054 NEG Zaprzeczenie: Dest ← Uzupełnienie do dwójek (Dest)
1054 NEGB
0055 ADC Dodaj przeniesienie: Dest ← Dest + flaga C
1055 ADCB
0056 SBC Odejmij przeniesienie: Dest ← Dest - flaga C
1056 SBCB
0057 TST Test: Ustaw flagi (Src)
1057 TSTB
0060 ROR Obróć w prawo: Cel ← Obróć w prawo (Dest, 1)
1060 ROB
0061 ROL Obróć w lewo: Cel ← Obróć w lewo (Dest, 1)
1061 ROLB
0062 ASR Arytmetyczne przesunięcie w prawo: Cel ← Shift-prawo (Dest, 1)
1062 ASRB
0063 ASL Przesunięcie arytmetyczne w lewo: Dest ← Shift-left(Dest, 1)
1063 ASLB
1064 MPPS Przenieś do PSW: PSW ← Src
0065 MFPI Przesuń z poprzedniej przestrzeni I: −(SP) ← Src
1065 MFPD Przejście z poprzedniej przestrzeni D: −(SP) ← Src
0066 MTPI Przejdź do poprzedniej przestrzeni I: Cel ← (SP)+
1066 MTPD Przejdź do poprzedniej przestrzeni D: Cel ← (SP)+
0067 SXT Przedłużenie znaku: jeśli flaga N ≠ 0, to cel ← -1, w przeciwnym razie cel ← 0
1067 MFPS Przenieś z PSW: Cel ← PSW

Instrukcje oddziałów

W większości instrukcji rozgałęzienia to, czy rozgałęzienie jest zajęte, opiera się na stanie kodów warunków. Instrukcja rozgałęzienia jest zwykle poprzedzona dwuargumentową instrukcją CMP (porównanie) lub BIT (test bitowy) lub jednoargumentową instrukcją TST (test). Instrukcje arytmetyczne i logiczne również ustawiają kody warunków. W przeciwieństwie do Intela w architekturze x86 , instrukcje MOV również je ustawiają, więc instrukcja rozgałęzienia może być użyta do rozgałęzienia w zależności od tego, czy przeniesiona wartość była zerowa, czy ujemna.

Starszy bajt instrukcji określa operację. Bity od 9 do 15 są kodem operacyjnym, a bit 8 jest wartością obliczenia kodu warunku, którego wynikiem jest wzięcie gałęzi. Bajt niższego rzędu jest przesunięciem słowa ze znakiem względem bieżącej lokalizacji licznika programu. Pozwala to na rozgałęzienia do przodu i do tyłu w kodzie.

15 9 8 7 0
Kod operacji C Zrównoważyć
Kod operacji C Mnemoniczny Warunek lub działanie
000 1 BR Gałąź zawsze PC ← PC + 2 × rozszerzenie znaku (przesunięcie)
001 0 BNE Gałąź, jeśli nie jest równa Z = 0
001 1 BEQ Rozgałęzienie, jeśli równe Z = 1
002 0 BGE Rozgałęzienie, jeśli jest większe lub równe (N ⊻ V) = 0
002 1 BLT Rozgałęzienie, jeśli mniej niż (N ⊻ V) = 1
003 0 BGT Gałąź, jeśli jest większa niż (Z ∨ (N ⊻ V)) = 0
003 1 BLE Rozgałęzienie, jeśli jest mniejsze lub równe (Z ∨ (N ⊻ V)) = 1
100 0 BPL Rozgałęzienie, jeśli plus N = 0
100 1 BMI Rozgałęzienie, jeśli minus N = 1
101 0 BHI Gałąź, jeśli wyższa (C ∨ Z) ​​= 0
101 1 BLOS Gałąź, jeśli jest niższa lub taka sama (C ∨ Z) ​​= 1
102 0 BVC Rozgałęzienie, jeśli przelew jest czysty V = 0
102 1 BVS Rozgałęzienie, jeśli zestaw przelewowy V = 1
103 0 BCC lub BHIS Rozgałęzienie, jeśli jest jasne, lub Rozgałęzienie, jeśli wyższe lub takie samo C = 0
103 1 BCS lub BLO Rozgałęzienie, jeśli zestaw przenoszenia, lub Rozgałęzienie, jeśli niższy C = 1

Ograniczony zakres instrukcji rozgałęzień oznaczał, że wraz ze wzrostem kodu docelowe adresy niektórych rozgałęzień stawały się nieosiągalne. Programista zamieni jednowyrazową instrukcję BR na dwuwyrazową instrukcję JMP z następnej grupy. Ponieważ JMP nie ma formularzy warunkowych, programista zmieniłby BEQ na BNE, który rozgałęział się wokół JMP.

SOB (Subtract One and Branch) to kolejna warunkowa instrukcja rozgałęzienia. Określony rejestr jest zmniejszany o 1, a jeśli wynik nie jest równy zero, wykonywana jest gałąź odwrotna na podstawie 6-bitowego przesunięcia słowa.

15 9 8 6 5 0
Kod operacji Rej Zrównoważyć
Kod operacji Mnemoniczny Operacja
077 SZLOCH Odejmij jeden i rozgałęzienie: Reg ← Reg - 1; jeśli Reg ≠ 0 to PC ← PC - 2 × przesunięcie

Instrukcje podprogramu

Instrukcja JSR może zapisać dowolny rejestr na stosie. Programy, które nie potrzebowały tej funkcji, określały PC jako rejestr (JSR PC, adres), a procedura zwracała przy użyciu RTS PC. Gdyby procedura została wywołana z, na przykład, „JSR R4, adres”, wtedy stara wartość R4 znajdowałaby się na szczycie stosu, a adres powrotu (zaraz po JSR) byłby w R4. Pozwala to procedurze uzyskać dostęp do wartości zakodowanych w wierszu przez podanie (R4)+ lub do wskaźników w wierszu przez podanie @(R4)+. Autoinkrementacja przesunęła się poza te dane do punktu, w którym kod dzwoniącego został wznowiony. Taka procedura musiałaby określać RTS R4, aby powrócić do swojego wywołującego.

15 9 8 6 5 3 2 0
Kod operacji Rej Src Rejestr
Kod operacji Mnemoniczny Operacja
004 JSR Skok do podprogramu: -(SP) ← Reg; Rej. ← PC; PC ← Src
15 3 2 0
Kod operacji Rej
Kod operacji Mnemoniczny Operacja
00020 RTS-y Powrót z podprogramu: PC ← Reg; Rej ← (SP)+
15 6 5 0
Kod operacji nn
Kod operacji Mnemoniczny Operacja
0064 OCENA Powrót z podprogramu, odrzucenie wpisów stosu: SP ← PC + 2 x nn, PC ← R5, R5 ← (SP)+

Instrukcje dotyczące pułapek

15 9 8 7 0
Kod operacji S Kod operacji
Kod operacji S Mnemoniczny Operacja
104 0 ratownik medyczny Pułapka emulatora: -(SP) ← PS; -(SP) ← PC; PC ← (30); PS ← (32)
104 1 PUŁAPKA Pułapka ogólna: -(SP) ← PS; -(SP) ← PC; PC ← (34); PS ← (36)
15 0
Kod operacji
Kod operacji Mnemoniczny Operacja
000002 RTI Powrót z przerwania: PC ← (SP)+; PS ← (SP)+
000003 BPT Pułapka punktu przerwania: -(SP) ← PS; -(SP) ← PC; PC ← (14); PS ← (16)
000004 IOT Pułapka we/wy: -(SP) ← PS; -(SP) ← PC; PC ← (20); PS ← (22)
000006 RTT Powrót z pułapki: PC ← (SP)+; PS ← (SP)+

Przypisywanie adresów wektorów pułapek i wyjątków

Wektor Stan
000000 (Skryty)
000004 Niedozwolona instrukcja, błąd magistrali, limit stosu
000010 Zarezerwowana instrukcja
000014 Instrukcja BPT, pułapka śledzenia
000020 Instrukcja IOT
000024 Awarii zasilania
000030 Instrukcja ZRM
000034 Instrukcja TRAP
000114 Błąd parzystości
000244 Wyjątek zmiennoprzecinkowy
000250 Błąd zarządzania pamięcią

Różne instrukcje

15 0
Kod operacji
Kod operacji Mnemoniczny Operacja
000000 POSTÓJ Zatrzymaj procesor: Zatrzymaj wykonywanie przed następną instrukcją
000001 CZEKAĆ Czekaj na przerwanie: Zatrzymaj wykonywanie przed następną instrukcją; Wznów wykonywanie przy następnym programie obsługi przerwania
000005 RESETOWANIE Zresetuj UNIBUS: Potwierdź INIT na UNIBUS przez 10 ms; Wszystkie inne urządzenia resetują się do stanu włączenia

Operacje na kodzie warunku

15 6 5 4 3 2 1 0
Kod operacji 1 S N Z V C
Kod operacji S Mnemoniczny Operacja
0002 0 Ccc Wyczyść kody stanu: Wyczyść kody zgodnie z bitami N, Z, V, C
0002 1 Scc Ustaw kody warunków: Ustaw kody zgodnie z bitami N, Z, V, C

Cztery kody stanu w słowie stanu procesora (PSW) to

  • N wskazuje wartość ujemną
  • Z oznacza stan zerowy (równy).
  • V wskazujące stan przepełnienia, oraz
  • C wskazujące na stan przenoszenia.

Instrukcje w tej grupie były tym, co Digital nazwał „mikroprogramowanymi”: pojedynczy bit w słowie instrukcji odnosił się do pojedynczego kodu warunku. Asembler nie zdefiniował składni, aby określić każdą kombinację, ale symbole SCC i CCC złożyły instrukcję, która odpowiednio ustawiała lub kasowała wszystkie cztery kody warunków.

Wyczyszczenie lub ustawienie żadnego z kodów stanu (odpowiednio kody operacyjne 000240 i 000260) nie może być skutecznie uznane za instrukcje braku operacji. W rzeczywistości mnemonik NOP składa się z 000240.

Niespójne instrukcje

W ciągu życia PDP-11 pojawiły się subtelne różnice w implementacji instrukcji i kombinacjach trybów adresowania, chociaż żadna implementacja nie została uznana za poprawną. Niespójności nie miały wpływu na zwykłe użytkowanie PDP-11.

Opcjonalne zestawy instrukcji

Rozszerzony zestaw instrukcji (EIS)

EIS jest opcją dla 11/35/40 i 11/03 i jest standardem w nowszych procesorach.

  • MUL, DIV mnożenie i dzielenie operandu liczby całkowitej w celu zarejestrowania pary
  • Arytmetyka ASH, ASHC - przesunięcie rejestru lub pary rejestrów. Dla liczby dodatniej przesunie się w lewo, a dla ujemnej w prawo.

Pływający zestaw instrukcji (FIS)

Zestaw instrukcji FIS jest opcją dla PDP-11/35/40 i 11/03. Działanie z pojedynczą precyzją na stosie adresowanym przez operand rejestru. 13 bitów wysokiego rzędu określa operację, która ma zostać wykonana. Trzybitowe pole określa, który rejestr jest używany jako wskaźnik stosu operandów zmiennoprzecinkowych. Każda liczba zmiennoprzecinkowa składa się z dwóch słów, a każda instrukcja zmiennoprzecinkowa działa na dwóch liczbach zmiennoprzecinkowych, w wyniku czego zwracana jest jedna liczba zmiennoprzecinkowa. Wybrany wskaźnik stosu jest zwiększany o krok 4 po każdej operacji.

15 3 2 0
Kod operacji Rej
Kod operacji Mnemoniczny Operacja
07500 FADD Dodawanie zmiennoprzecinkowe: 4(Rn) ← 4(Rn) + (Rn), Rn ← Rn + 4
07501 FSUB Odejmowanie zmiennoprzecinkowe: 4(Rn) ← 4(Rn) - (Rn), Rn ← Rn + 4
07502 FMUL Mnożenie zmiennoprzecinkowe: 4(Rn) ← 4(Rn) × (Rn), Rn ← Rn + 4
07503 FDIV Dzielenie zmiennoprzecinkowe: 4(Rn) ← 4(Rn) ÷ (Rn), Rn ← Rn + 4

Procesor zmiennoprzecinkowy (FPP)

To była opcjonalna opcja procesora zmiennoprzecinkowego dla 11/45 i większości kolejnych modeli.

  • pełne operacje zmiennoprzecinkowe na operandach pojedynczej lub podwójnej precyzji, wybieranych pojedynczym/podwójnym bitem w rejestrze stanu zmiennoprzecinkowego
  • poprzednik formatu danych zmiennoprzecinkowych pojedynczej precyzji formatu IEEE 754 : bit znaku, 8-bitowy wykładnik, 23-bitowa mantysa z ukrytym bitem 24

Zestaw instrukcji handlowych (CIS)

Komercyjny zestaw instrukcji, znany jako CIS lub CIS11, dodaje łańcuchowe i kodowane binarnie instrukcje dziesiętne (BCD) używane przez COBOL i DIBOL . Został zaimplementowany przez opcjonalny mikrokod w 11/23/24 oraz przez dodatkowy moduł w 11/44 i jednej wersji 11/74.

Łańcuchy są reprezentowane przez dwie 16-bitowe liczby całkowite przechowywane w dowolnych dwóch rejestrach ogólnego przeznaczenia lub jako dwie 16-bitowe wartości w kolejnych miejscach w pamięci. Jeden oznaczony jest „n”, co oznacza długość do 64 kB, a drugi „A”, który jest wskaźnikiem początku danych znakowych w pamięci. Razem para n/A wskazuje położenie i długość łańcucha. Podstawowymi operacjami są MOVEC, MOVTC i MOVRC, które przenoszą dane znakowe w pamięci z miejsca wskazanego w jednej parze n/A do lokalizacji w drugiej n/A. MOVECI, MOVTCI i MOVRCI zrobiły to samo, ale z lokalizacjami wskazanymi przez n/A par w pamięci zamiast rejestrów. MOVEC/MOVECI po prostu kopiuje dane z jednej lokalizacji do drugiej. MOVRC/MOVRCI odwraca oryginalny łańcuch do miejsca docelowego. We wszystkich instrukcjach ruchu, jeśli źródło jest krótsze niż miejsce docelowe, miejsce docelowe jest uzupełniane, jeśli źródło jest dłuższe, jest obcinane. Jeśli tak się stanie, flagi stanu procesora są używane do wskazania tego.

MOVTC/MOVTCI tłumaczy znaki podczas kopiowania przy użyciu 256-bajtowej tabeli wyszukiwania przechowywanej w trzeciej parze n/A, przy czym A wskazuje początek tabeli, a osiem niższych bitów n jest kodem ASCII używanym do wypełnienia ciągu docelowego jeśli ciąg źródłowy jest krótszy. Tłumaczenia używają wartości ASCII ciągu źródłowego jako numeru indeksu i kopiują wartość z tabeli translacji pod tym indeksem do ciągu docelowego. Można to wykorzystać do EBCDIC konwersji, na przykład poprzez umieszczenie w tabeli odpowiedniego kodu znaku EBCDIC dla odwzorowanych kodów ASCII. Znak „E” to znak 69 w ASCII i 197 w EBCDIC, więc aby przekonwertować EBCDIC na ASCII, należałoby utworzyć tabelę 256 bajtów z 69 w miejscu 197. Kiedy wywoływany jest MOVTC i widzi 197 w oryginalnym łańcuchu, to wyświetli 97 w nowym ciągu, wykonując konwersję.

Porównywanie ciągów jest obsługiwane przez CMPC, który ustawia kody stanu procesora na podstawie wyników porównania dwóch ciągów. LOCC znajduje pierwsze wystąpienie znaku w łańcuchu, podczas gdy SKPC wyszukuje pierwszy niepasujący znak, używany na przykład do przycinania spacji na początku łańcuchów. SCANC i SPANC są podobne do LOCC i SKPC, ale pasują do dowolnego znaku w zamaskowanym zestawie znaków. Można to wykorzystać na przykład do znalezienia następnego wystąpienia dowolnego znaku łamania wiersza, takiego jak VT, LF lub CR. Zestawy znaków to tablica o długości 256 bajtów, podzielona na podzbiory. Są one podobne do tablic translacji, w których dolne osiem bitów pierwszego słowa tworzy maskę, a drugie słowo wskazuje początek tablicy. Maska wybiera, które podzbiory (maksymalnie osiem) są częścią zestawu znaków podczas porównywania. Korzystając z tego systemu, można zdefiniować zestawy znaków, takie jak wielkie, małe litery, cyfry itp., A następnie łatwo utworzyć połączenie za pomocą maski, na przykład wybierając podzbiory wielkich i małych liter w celu utworzenia pełnego zestawu liter.

CIS zawiera również zestaw typów danych i instrukcje manipulowania liczbami BCD. Te dane są również reprezentowane przez dwa 16-bitowe rejestry lub lokalizacje pamięci, przy czym druga liczba to A identyczna z wielkością liter. Pierwsze słowo zawiera teraz cztery pola, które opisują łańcuchową reprezentację danych, która obejmuje upakowane i rozpakowane cyfry, obsługę znaku i długość ciągu od 0 do 16. DEC odnosi się do rozpakowanych danych, z jedną cyfrą na bajt , jako „ciągi numeryczne”. Wykorzystując spakowane dane, z dwiema cyframi BCD na bajt, ciąg 16 słów zawierał liczby BDC o długości do 32 cyfr. Instrukcje obejmowały ADDP/ADDN dla spakowanych i rozpakowanych danych, SUBP/SUBN, ASHP/ASHN (przesunięcie arytmetyczne) i CMPP/CMPN (porównanie). Dostępne tylko dla spakowanych danych są MULP i DIVP. Zawiera również zestaw instrukcji do konwersji liczb BCD między formatami spakowanymi i rozpakowanymi, a także do iz wartości binarnych.

Ostateczny zestaw instrukcji jest używany do ładowania danych łańcuchowych i BCD do iz rejestrów wewnętrznych, unikając potrzeby manipulowania bitami w kodzie.

Dostęp do słowa statusu procesora (PSW)

PSW jest odwzorowywany na adres pamięci 177 776, a zatem może być przetwarzany jak dowolne dane. Instrukcje znalezione na wszystkich PDP-11 z wyjątkiem najwcześniejszych dają programom bardziej bezpośredni dostęp do rejestru.

  • SPL (ustaw poziom priorytetu)
  • MTPS (przejście do statusu procesora)
  • MFPS (przejście ze stanu procesora)

Dostęp do innych przestrzeni pamięci

Na PDP-11, które zapewniają wiele przestrzeni instrukcji i przestrzeni danych, zestaw nieortogonalnych instrukcji ruchu zapewnia dostęp do innych przestrzeni. Na przykład procedury w systemie operacyjnym, które obsługują wywołania usług w czasie wykonywania, używają tych instrukcji do wymiany informacji z wywołującym.

  • MTPD (przejście do poprzedniej przestrzeni danych)
  • MTPI (przejście do poprzedniej przestrzeni instrukcji)
  • MFPD (przejście z poprzedniej przestrzeni danych)
  • MFPI (przejście z poprzedniej przestrzeni instrukcji)

Prędkość

Szybkość procesora PDP-11 różni się w zależności od modelu, konfiguracji pamięci, kodu operacyjnego i trybów adresowania. Czasy instrukcji składają się z maksymalnie trzech elementów: wykonanie/pobranie samej instrukcji oraz czas dostępu do źródła i miejsca docelowego. Ostatnie dwa składniki zależą od trybu adresowania. Na przykład w PDP-11/70 (około 1975 r.) instrukcja w postaci ADD x (R m ), y (R n ) miał czas pobierania/wykonania 1,35 mikrosekundy oraz czasy źródła i miejsca docelowego po 0,6 mikrosekundy, co daje całkowity czas instrukcji 2,55 mikrosekundy. Każdy przypadek, w którym adresowana pamięć nie znajduje się w pamięci podręcznej, dodaje 1,02 mikrosekundy. Rejestr do rejestru ADD Rm , Rn może być wykonany z pamięci podręcznej w ciągu 0,3 mikrosekundy. Zmiennoprzecinkowy jest jeszcze bardziej złożony, ponieważ istnieje pewne nakładanie się procesora i procesora zmiennoprzecinkowego, ale ogólnie rzecz biorąc, zmiennoprzecinkowy jest znacznie wolniejszy. Zmiennoprzecinkowa instrukcja dodawania o pojedynczej precyzji waha się od 2,4 do 5,5 mikrosekund plus czas na pobranie operandów.

Przerywa

PDP-11 działa na poziomie priorytetu od 0 do 7, określonym przez trzy bity w słowie stanu procesora (PSW) , a modele z wyższej półki mogą pracować w różnych trybach, Kernel (uprzywilejowany), User (aplikacja), a czasami Supervisor, zgodnie z dwoma bitami w PSW.

Aby zażądać przerwania, urządzenie magistrali potwierdza jedną z czterech wspólnych linii magistrali, od BR4 do BR7, aż do odpowiedzi procesora. Wyższe liczby wskazywały na większą pilność, być może dane mogły zostać utracone lub żądany sektor mógł obrócić się bez kontaktu z głowicami odczytu/zapisu, chyba że procesor zareaguje szybko. Gotowość drukarki na kolejny znak ma najniższy priorytet (BR4), ponieważ może pozostawać w gotowości w nieskończoność. Jeśli procesor działa na poziomie 5, BR6 i BR7 będą w porządku. Jeśli procesor działa na poziomie 3 lub niższym, przyzna każde przerwanie; jeśli o 7, nie przyzna żadnego. Żądania autobusu, które nie zostały zaakceptowane, nie są tracone, a jedynie odraczane. Urządzenie wymagające obsługi nadal potwierdza swoje żądanie magistrali.

Ilekroć przerwanie przekracza poziom priorytetu procesora, procesor potwierdza odpowiednie przydział magistrali, od BG4 do BG7. Linie magistrali nie są liniami wspólnymi, ale łańcuchem : wejście każdej bramki jest wyjściem poprzedniej bramki w łańcuchu. Bramka znajduje się na każdym urządzeniu magistrali, a urządzenie fizycznie bliżej procesora znajduje się wcześniej w łańcuchu. Jeśli urządzenie wysłało żądanie, to po wykryciu wejścia zezwolenia na magistralę dochodzi do wniosku, że kontroluje magistralę i nie przekazuje sygnału przyznania do następnego urządzenia na magistrali. Jeśli urządzenie nie wysłało żądania, propaguje swoje wejście bus-grant do swojego wyjścia bus-grant, dając następnemu najbliższemu urządzeniu szansę na odpowiedź. (Jeśli urządzenia nie zajmują sąsiednich gniazd do płyty procesora, „karty przyznania ciągłości” włożone do pustych gniazd propagują linię magistrali).

Po przejęciu kontroli nad magistralą urządzenie odrzuca żądanie magistrali i umieszcza na magistrali adres pamięci swojego dwusłowowego wektora. Procesor zapisuje licznik programów (PC) i PSW, wchodzi w tryb jądra i ładuje nowe wartości z określonego wektora. W przypadku urządzenia w BR6 nowy PSW w swoim wektorze zwykle określa 6 jako nowy priorytet procesora, więc procesor będzie honorował pilniejsze żądania (BR7) podczas procedury serwisowej, ale odroczy żądania o takim samym lub niższym priorytecie. Wraz z nowym komputerem PC procesor przechodzi do procedury serwisowej urządzenia przerywającego. Ta procedura obsługuje urządzenie, przynajmniej usuwając warunek, który spowodował przerwanie. Procedura kończy się instrukcją RTI (ReTurn from Interrupt), która przywraca PC i PSW tuż przed przyznaniem przerwania przez procesor.

Jeśli żądanie magistrali zostanie wysłane w wyniku błędu i żadne urządzenie nie odpowie na przyznanie magistrali, procesor przekroczy limit czasu i wykona pułapkę, która sugeruje zły sprzęt.

Język asemblera MACRO-11

Taśma perforowana używana do PDP-11

MACRO-11 to język asemblera dla PDP-11. Jest następcą PAL-11 (Program Assembler Loader), wcześniejszej wersji języka asemblera PDP-11 bez funkcji makr. MACRO-11 jest obsługiwany we wszystkich systemach operacyjnych DEC PDP-11. uniksowe PDP-11 zawierają również asembler (zwany „ as ”), strukturalnie podobny do MACRO-11, ale z inną składnią i mniejszą liczbą funkcji.

Notatki

Dalsza lektura

  •   Eckhouse, jr., Richard H.; Morris, L. Robert (1979). Organizacja, programowanie i aplikacje systemów mikrokomputerowych (PDP-11) . Englewood Cliffs, New Jersey : Prentice Hall . ISBN 0-13-583914-9 .
  • Michael Singer, PDP-11. Programowanie w języku asemblera i organizacja maszyn , John Wiley & Sons, NY: 1980.
  • Podręcznik procesora pdp11 - pdp11/05/10/35/40 . Firma Sprzęt Cyfrowy. 1973.
  • Podręcznik procesora pdp11 - pdp11/04/34a/44/60/70 . Firma Sprzęt Cyfrowy. 1979.

Linki zewnętrzne