Architektura PDP-11
Projektant | Firma Sprzęt Cyfrowy |
---|---|
Bity | 16-bitowy |
wprowadzony | 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
|
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
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
- Podręcznik procesora PDP-11 ( wydanie Gordona Bella z 1969 r. , wydanie z 1979 r. w bitsavers )
- Konserwacja serii 16-bitowych minikomputerów PDP-11
- Gordona Bella i Billa Streckera z 1975 r., Czego nauczyliśmy się z PDP-11
- Ersatz-11 , emulator PDP-11
- Dalsze artykuły i linki na stronie Gordona Bella .
- Fuzzball