A | B | C | D | E | F | G | H | CH | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Architektura PDP-11 je instrukční sada (ISA) vyvinutá firmou Digital Equipment Corporation (DEC). Je implementována centrálními procesorovými jednotkami (CPU) a mikroprocesory používanými v minipočítačích PDP-11. Architektura byla široce používána v 70. letech 20. století, ale v 80. letech 20. století ji nahradila výkonnější architektura VAX-11.
Paměť
Datové formáty
PDP-11 ukládá šestnáctibitová slova do paměti způsobem little endian (s méně významným bajtem jako prvním). Díky oblíbenosti PDP-11 bývá tento formát stále označován jako pdp-endian. 32bitová data podporovaná rozšířeními základní architektury, například pro čísla v pohyblivé řádové čárce v Instrukční sadě FPU, dvojslova v Rozšířené instrukční sadě nebo dlouhá data v Komerční instrukční sadě byla ukládána různými způsoby, včetně neobvyklého formátu mixed endian[1][2].
Správa paměti
16bitové adresy umožňují počítačům PDP-11 adresovat 64 KB. V době nástupu počítačů VAX začínaly být 8bitové bajty a šestnáctkový zápis adres průmyslovým standardem; u počítačů PDP-11 se ale pro číselné hodnoty používala osmičková soustava a velikost paměti se vždy uváděla v dvoubajtových slovech. Základní logický adresní prostor byl tedy 32K slov, ale poslední 4K slov (s adresami 1600008 až 1777778) nebyly obsazeny pamětí, protože tento rozsah sloužil pro adresování hardwarových registrů vstupních a výstupních zařízení. Původní počítače PDP-11 s maximální velikostí paměti měly tedy 28K slov paměti.
Nejnižší adresy paměti jsou rezervovány pro dvouslovné vektory přerušení, které jsou tvořeny hodnotou programového čítače a stavového slova procesoru, se kterými se spouští obslužná funkce přerušení. Když V/V zařízení vyvolá přerušení, nastaví na sběrnici adresu svého vektoru pro indikaci, jaká obslužná funkce má převzít řízení. První vektory patřily obslužným funkcím pro obsluhu různých typů trapů. Trapy se vyvolávají při určitých programových chybách, například při aritmetickém přetečení nebo při pokusu o provedení nedefinované instrukce; také když program provedl některou z instrukcí jako BPT, EMT, IOT nebo TRAP, které slouží k vyvolání služby operačního systému.
Rozšíření paměti
Článek PDP-11 popisuje jak se 16bitový logický adresní prostor stal nepřekonatelným omezením. Během života PDP-11 byly pro obejití tohoto omezení používány následující techniky:
- Pozdější modely PDP-11 procesorů obsahovaly jednotku správy paměti, která podporovala virtuální adresování. Fyzická adresy byl rozšířena na 18 nebo 22 bitů, což umožňovalo adresovat až 256 KB nebo 4 MB RAM. Logický adresní prostor (tj. adresní prostor dostupný v libovolném okamžiku bez změny tabulky mapování paměti) však zůstal omezen na prostor adresovatelný 16 bity.
- Některé modely počínaje PDP-11/45 mohly pracovat v režimu, kdy používaly 32K slov (64 KB) jako „instrukční prostor“„“ pro kód programu, a dalších 32K slov pro data. Některé operační systémy, především Unix od vydání V7 a RSX11-M+ tuto vlastnost využívaly.
- Programovací techniky mohly skrývat problémy se stránkováním před aplikačními programátory. Například překladač jazyka Modula-2 vytvářel kód, ve kterém běhový systém při volání jednotlivých procedur přepínal 8KB stránky do logického adresního prostoru. (Viz externí reference zde.)
Registry procesoru
Registry DEC PDP-11 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Obvykle se uvádí, že CPU PDP-11 obsahuje osm víceúčelových 16bitových registrů (R0 až R7). Registr R7 však funguje jako programový čítač (PC). Jako ukazatel zásobníku je možné použít libovolný z ostatních registrů, ale pro hardwarová přerušení a trapy se jako ukazatel zásobníku (SP) používá registr R6.
Režimy adresování
Ve většině instrukcí se pro výběr operandu používá šest bitů. Tři bity vybírají jeden z osmi režimů adresování a další tři bity vybírají jeden z osmi víceúčelových registrů. Z používání tříbitových skupin přirozeně vyplynulo používání osmičkové notace.
Každá položka v následující části ukazuje, jak by byl v jazyce symbolických adres zapsán operand pro hypotetickou jednooperandovou instrukci se jménem OPR. Rn znamená jeden z registrů, ve skutečnosti zapisovaný jako R0 až R7. (Rn) je obsah registru Rn.
Režimy adresování s víceúčelovými registry
Následujících osm režimů může být aplikováno na libovolný víceúčelový registr. Jejich význam při použití na R6 (ukazatel zásobníku, SP) nebo R7 (programový čítač, PC) jsou uvedeny odděleně v následující části.
Kód | Jméno | Příklad | Popis |
---|---|---|---|
0n | Register | OPR Rn | Operand je v Rn |
1n | Register deferred | OPR (Rn) | Rn obsahuje adresu operandu |
2n | Autoincrement | OPR (Rn)+ | Rn obsahuje adresu operandu, pak inkrementovat Rn |
3n | Autoincrement deferred | OPR @(Rn)+ | Rn obsahuje adresu adresy, pak inkrementovat Rn o 2 |
4n | Autodecrement | OPR −(Rn) | Dekrementovat Rn, pak použít jeho obsah jako adresu |
5n | Autodecrement deferred | OPR @−(Rn) | Dekrementovat Rn o 2, pak použít jeho obsah jako adresu adresy |
6n | Index | OPR X(Rn) | Rn+X je adresa operandu |
7n | Index deferred | OPR @X(Rn) | Rn+X je adresa adresy |
V režimech index a index deferred je X 16bitová hodnota uložená ve druhém slově instrukce. V instrukcích se dvěma operandy může jeden, druhý nebo oba operandy používat libovolný z těchto režimů. Instrukce, které používají pro oba operandy režim index nebo index deferred mají délku tři slova.
V instrukcích pracujících s bajty se provádí autoinkrementace a autodekrementace registru o 1, v instrukcích pracujících se slovy o 2 kdykoli se používá deferred režim, protože velikost paměti, kterou adresuje registrový ukazatel je slovo.
Režimy adresování s programovým čítačem
Pokud se pro adresování použije registr R7 (programový čítač), čtyři z režimů adresování přirozeně dávají užitečné efekty:
Kód | Jméno | Příklad | Popis |
---|---|---|---|
27 | Immediate | OPR #n | Operand je obsažen v instrukci |
37 | Absolute | OPR @#a | Absolutní adresa je obsažena v instrukci |
67 | Relative | OPR a | Adresa je dána součtem dalšího slova v instrukci a PC+2 |
77 | Relative deferred | OPR @a | Adresa adresy je dána součtem dalšího slova v instrukci a PC+2 |
Pro adresování paměti (proměnných a cílů skoků) se používá relativní režim (který má nejjednodušší syntaxi). Program, který pro všechny interní odkazy používá relativní režim (a relativní deferred režim), je pozičně nezávislý; nemá žádné požadavky na vlastní umístění, takže je možné jej zavést na libovolnou adresu v paměti nebo jej dokonce přesouvat bez nutnosti upravovat adresy, aby odpovídaly jeho umístění (tj. není nutná relokace programu). Tento způsob počítání adres relativně k aktuálnímu umístění vlastně znamená, že procesor provádí relokaci přímo při běhu.
Absolutní režim se používá pouze pro adresování hardwarových registrů vstupních a výstupních zařízení, které mají pevné adresy. Pro zápis operandu v absolutním režimu se používá @#
, tj. kombinace symbolů pro bezprostřední a deferred režim.
Režimy immediate a absolute jsou vlastně režimy autoinkrement a autoinkrement deferred aplikované na programový čítač. Otázka, zda se má operand nebo adresa považovat za součást instrukce (jak je napsáno v tabulce) nebo za slovo, které se nachází za instrukcí, a po jehož načtení se také inkrementuje PC, je subjektivní. Každopádně PC se vždy považuje za ukazatel na slovo, takže autoinkrementace je vždy o 2.
Režimy adresování zásobníku
Registr R6 nazývaný také SP se používá jako ukazatel hardwarového zásobníku pro trapy a přerušení. Chování adresovacích režimů vyžaduje, aby zásobník rostl směrem k nižším adresám. Když je některý z dostupných adresovacích režimů aplikován na SP nebo na libovolný registr, který si programátor vybere jako ukazatel na softwarový zásobník, mají režimy adresování následující výsledky:
Kód | Jméno | Příklad | Popis |
---|---|---|---|
16 | Deferred | (SP) | Operand je na vrcholu zásobníku (nechat ho tam) |
26 | Autoincrement | (SP)+ | Vyzvedni operand z vrcholu zásobníku |
36 | Autoincrement deferred | @(SP)+ | Vyzvedni ukazatel na operand z vrcholu zásobníku |
46 | Autodecrement | −(SP) | Ulož hodnotu na zásobník |
66 | Indexed | X(SP) | Operand je na zásobníku vzdálený X od vrcholu |
76 | Indexed deferred | @X(SP) | Na zásobníku ve vzdálenosti X od vrcholu je ukazatel na operand |
I když softwarové zásobníky mohou být tvořeny jednotlivými bajty, SP vždy adresuje zásobník tvořený slovy. Proto autoinkrementace a autodekrementace SP je vždy o 2.
Instrukční sada
PDP-11 pracuje s bajty a se slovy. Bajty mohou být zadány číslem registru, které identifikuje nižší bajt v registru, nebo adresou v paměti. Slova mohou být zadána číslem registru nebo adresou nižšího bajtu v paměti; adresa v tomto případě musí být sudé číslo. Ve většině instrukcí, které mají operandy, rozlišuje bit 15, zda se jedná o instrukci pracující s bajty nebo slovy: pokud je bit 15 nastaven, jedná se o instrukci pracující s bajty; pokud je vynulován, je to instrukce pro práci se slovy. V seznamech v následujících dvou částech jsou mnemoniky instrukcí pracujících s bajty zakončeny písmenem B; například instrukce MOV pracující s bajty je uvedena jako MOVB.
Instrukce se dvěma operandy
Čtyři nejvyšší bity udávají, o jakou operaci se jedná (přičemž bit 15 zpravidla určuje, zda se pracuje se slovy nebo s bajty). Zbývající bity tvoří dvě skupiny po šesti bitech, které udávají režim a registr každého ze dvou operandů, jak je definováno výše.
15 | 14 | 12 | 11 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | |||||
B | Operační kód | Režim | Zdroj | Režim | Cíl |
Operační kód | Mnemonika | Význam |
---|---|---|
01 | MOV | Přesun: dest = src |
11 | MOVB | |
02 | CMP | Porovnání: spočítá src − dest, nastaví pouze příznaky |
12 | CMPB | |
03 | BIT | Bitový test: spočítá dest & src, nastaví pouze příznaky |
13 | BITB | |
04 | BIC | Vynulování bitů: dest &= ~src |
14 | BICB | |
05 | BIS | Nastavení bitů, neboli logické OR: dest |= src |
15 | BISB | |
06 | ADD | Sčítání, dest += src |
16 | SUB | Odčítání, dest −= src |
Instrukce ADD a SUB jsou k dispozici pouze pro práci se slovy (nemají bajtové varianty).
Některé přídavné dvouoperandové instrukce musí mít jako zdrojový operand registr:
15 | 12 | 11 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||
0 | 1 | 1 | 1 | Operační kód | Registr | Režim | Zdroj/Cíl |
Pokud instrukce používá dvojici registrů (popsanou níže jako "(R,R+1)"), obsahuje první registr nejméně významné bity a musí být sudý. Druhý registr obsahuje významnější bity (nebo zbytek po dělení). Výjimkou je instrukce násobení; R může být lichý, ale pak se horních 16 bitů výsledku nikam neukládá.
Operační kód | Mnemonika | Význam |
---|---|---|
070 | MUL | Násobení: (R,R+1) = R × src |
071 | DIV | Dělení: Spočítat (R,R+1) ÷ src; podíl v R, zbytek v R+1 |
072 | ASH | Aritmetický posuv: R <<= src, velikost posunutí může být −32 až 31. |
073 | ASHC | Aritmetický posuv kombinovaný: (R,R+1) <<= src, velikost posunutí může být −32 až 31. |
074 | XOR | Non-ekvivalence: dest ^= reg (pouze pro slova) |
075 | (operace s pohyblivou řádovou čárkou) | |
076 | (systémové instrukce) | |
077 | SOB | Odečtení jedničky a větvení: Dekrementuje registr; jestliže výsledek je nenulový, skočí zpátky o 0 až 63 slov. |
Instrukce s jedním operandem
Nejvyšších 9 bitů udává, jaká operace má být provedena (bit 15 obecně vybírá adresování po slovech nebo po bajtech). (Operací není tolik, kolik by se zdálo, protože většina kombinací nejvyšších čtyř bitů je obsazena instrukcemi se dvěma operandy.) Jedna skupina šesti bitů určuje režim a registr operandu, jak je definováno výše.
15 | 11 | 10 | 6 | 5 | 3 | 2 | 0 | ||||||||
B | 0 | 0 | 0 | 1 | Operační kód | Režim | Registr |