A PDP–11 architektúra egy utasításkészlet-architektúra (ISA), amelyet a Digital Equipment Corporation (DEC) fejlesztett ki és a PDP–11 miniszámítógépek processzoraiban alkalmazott.
Áttekintés A PDP–11 egy 16 bites CISC típusú miniszámítógép konstrukció. Az architektúra alap adattípusa a 16 bites gépi szó, emellett képes bájtok kezelésére is.
A processzor 8 db 16 bites általános célú regisztert tartalmaz, ezek jelölése R0, R1, R2, R3, R4, R5, R6 és R7. Kettő közülük speciális: az R6 a hardveres veremmutató regiszter, SP-vel is jelölhető, az R7 pedig a programszámláló, PC-vel is jelölhető. A processzorban ezen felül még megtalálható a processzor-állapotszó (processor status word), jele PSW. Az általános célú regiszterek két részre oszthatók, egy alacsonyabb és egy magasabb helyiértékű bájtra, ezek közül a bájtos műveletek az alacsonyabb helyiértékű bájton, a szavas műveletek a 16 bites szón végzik a műveleteket. A regiszterek a műveletekben akkumulátor, mutató, automatikusan növekvő vagy csökkenő mutatók és indexek szerepében állhatnak.
Az architektúrában a gépek operatív memóriája szó szervezésű, tehát 16 bites szavak sorozatának tekinthető. A tárolás little-endian bájtsorrenddel történik. Logikai címtere 16 bites, amely 64 KiB, ill. 32 K szó méretű memóriát jelent. A fizikai címek 16, 18, 22 vagy 24 bitesek lehetnek a különböző megvalósításokban.
Utasításkészlete nagymértékben ortogonális, azaz néhány kivételtől eltekintve minden gépi utasításban mindegyik címzési mód használható. Az ortogonalitás nem teljes. Az utasítások szavakkal és bájtokkal végezhetnek műveleteket, egyes esetekben regiszterpárokban reprezentált adatokkal (pl. szorzás, osztás). A későbbi modellekben megjelent először az egyszeres pontosságú lebegőpontos adattípus és utasításkészlet, majd a matematikai processzor, amely egyszeres és dupla pontosságú adattípusokat kezelt és megfelelt az IEEE 754 szabványnak. A gépi utasítások nulla, egy vagy kétoperandusúak, hosszuk egy, két vagy három szó lehet. A verem kezelése hardveres, a magasabb címektől az alacsonyabbak felé növekszik (azaz a verembe írás csökkenti a veremmutató értékét). A vermet a megszakítási rendszer automatikusan használja. Rendelkezésre áll hardveres veremfigyelő egység (stack-limit egység).
A processzor, a tár és a perifériavezérlők egyetlen kétirányú, aszinkron működésű univerzális sínrendszerre kapcsolódnak. A perifériák vezérlőregiszterei a memória felső 4 KiB méretű részébe vannak leképezve; nincsenek külön I/O utasítások, az adatcsere a perifériák és a processzor között az utasításkészlet MOV (adatmozgató) utasításával végezhető. A sínrendszer biztosítja a perifériák közötti beavatkozás nélküli adatátvitelt és a DMA lehetőségét.
Az architektúra gépei hierarchikus, hardveresen kezelt megszakításkezeléssel rendelkeznek. A processzor 8 prioritási szintet kezel, a perifériákhoz hardveresen prioritás van hozzárendelve. A megszakítási rendszer vektoros típusú. A megszakításvektorok kétszavas értékek, melyek a kezelőrutin kezdőcímét és állapotszavát tartalmazzák, és a memória (oktális) 0–3778, más konfigurációkban 0–7778 címtartományában vannak tárolva.
Memória Adatformátumok A 16 bites szavak little-endian bájtsorrendben voltak tárolva (tehát a legkisebb helyiértékű bájt a legkisebb címen). A PDP–11 nagyon népszerű gép volt, és emiatt ezt az adatábrázolási módot gyakran pdp-endian-ként emlegetik. A 32 bites adatok az alaparchitektúra kiterjesztéseiben jelentek meg, pl. a lebegőpontos formátum az FPU Instruction Set (lebegőpontos processzor utasításkészlet), a duplaszó az Extended Instruction Set (kiterjesztett utasításkészlet) vagy a long adattípus a Commercial Instruction Set (kereskedelmi utasításkészlet) bővítésekben; ezeket több formátumban tárolta a processzor, pl. a szokatlan middle-endian formátumban (ld. Bájtsorrend, Középső a végén).pdp11/05/10/35/40, Chapter 7.pdp11/04/34a/44/60/70, page 421.
Memóriakezelés A PDP–11 16 bites címeket használ, amivel 64 KiB memóriát képes címezni. Abban az időben, mikor a PDP–11 átadta a helyét a VAX-nak, a 8 bites bájt és a hexadecimális jelölés szinte ipari szabvánnyá vált, azonban a PDP–11-nél a számok jelölésében mindenhol az oktális, nyolcas számrendszert használták, és a memória méretét sem bájtban, hanem szavakban adták meg. Az alap logikai címmező 32 K szóból áll, de a legfelső 4 K (tehát az oktális — címeken lévő) szó nem volt memóriához rendelve, mert a sín be/kimeneti regiszterei voltak erre a címterületre leképezve. Tehát eredetileg egy teljes kiépítésű PDP–11 28 K szót tartalmazott.
A processzor az alsó memóriacímeket kétszavas vektoroknak tartotta fenn, melyekben az elvégzendő kiszolgálórutin kezdőcímét és kezdeti állapotszavát tárolta a rendszer. Mikor egy I/O eszköz megszakítja a program futását, a saját vektorcímét a sínre helyezi/írja, ezzel jelezve, hogy melyik kiszolgálórutinnak kell átadni a vezérlést. A legalacsonyabb című vektorok különböző csapdák (trap) kiszolgálórutinjainak címét tartalmazták. A csapdák olyan megszakítások, melyeket programhibák, pl. túlcsordulás vagy nem implementált utasításkód végrehajtásának kísérlete okoznak, valamint a BPT, EMT, IOT vagy TRAP utasítások, melyekkel az operációs rendszer szolgáltatásai hívhatók.
Memóriabővítés A PDP–11-es alaparchitektúra elég rugalmas volt és folyamatosan integrálta az újabb technológiákat, azonban a 16 bites logikai címzés végül a nagyobb alkalmazások készítésének leküzdhetetlen akadályává vált. A PDP–11 életciklusában az alábbi módszerekkel igyekeztek megkerülni: A késői PDP–11 modellek processzorai már memóriakezelőt is tartalmaztak, amely támogatta a virtuális memóriacímzést. A fizikai címet 18 vagy 22 bitesre terjesztették ki, ami ezáltal 256 KiB vagy 4 MiB RAM címzését teszi lehetővé. A logikai címtér (az a címtér, ami bármely pillanatban rendelkezésre áll a memória-lapkiosztás változtatása nélkül) továbbra is 16 bites maradt. Néhány modellnél, kezdve a PDP–11/45-tel, beállítható külön 32 K szó (64 KiB) az „utasítástér” és egy másik külön 32 K szó méretű memóriaterület az „adattér” számára. Néhány operációs rendszer – például a V7 kiadás utáni Unix és az RSX11-M+ – erősen kihasználta ezt a tulajdonságot. Programozási technikákkal elrejthetők a memórialapozási problémák az alkalmazásprogramozók elől. Például a Modula-2 nyelvben a fordítóprogram olyan kódot generált, melyben a futtatórendszer 8 KiB méretű lapokat váltogatott a logikai címtérben, mikor az egyes procedúrák megkapták a vezérlést.
Címzési módok A legtöbb utasítás hat bitet tart fenn az operandus meghatározására. Három bit választja ki a 8 címzési mód egyikét, további három bit szolgál egy regiszter kiválasztására a nyolc általános célú regiszter közül. A hárombites csoportok használata természetessé teszi az oktális jelölés használatát.
Az alábbi szakaszokban minden tételhez tartozik egy példa, mely az operandusok jelölését mutatja assembly nyelven egy hipotetikus/feltételezett egyoperandusú utasításban, melyet OPR jelöl. Rn jelöli az egyik regisztert, amely R0-tól R7-ig terjedhet. (Rn) jelöli az adott regiszter tartalmát.
Az általános célú regiszterek címzése Az alábbi nyolc mód használható mind a nyolc általános célú regiszterrel. Az R6 regiszter a veremmutató, SP-vel is jelölhető, az R7 pedig a programszámláló, PC-vel jelölhető, a különböző címzési módok hatása ezekre a regiszterekre külön szakaszokban szerepel.
KódNévPéldaLeírás0nRegisztermód (Register)OPR RnAz operandus az Rn tartalma1nKözvetett regisztermód (Register deferred)OPR (Rn)Rn az operandus címét tartalmazza2nAutoinkrementáló (Autoincrement)OPR (Rn)+Rn megadja az operandus címét, ezután az Rn tartalma növekszik3nKözvetett autoinkrementáló (Autoincrement deferred)OPR @(Rn)+Rn megadja az operandus címét tartalmazó memóriaszó címét, ezután az Rn tartalma növekszik 2-vel4nAutodekrementáló (Autodecrement)OPR −(Rn)Az Rn regiszter tartalma csökken, ezután az operandus címeként használható5nKözvetett autodekrementáló (Autodecrement deferred)OPR @−(Rn)Rn tartalma 2-vel csökken, ezután az operandus címét tartalmazó szó címe (operandus címének mutatója)6nIndexmód (Index)OPR X(Rn)Rn tartalmához hozzáadódik az X index értéke (az operandus címe Rn+X), az X és Rn tartalma nem változik7nKözvetett index (Index deferred)OPR @X(Rn)Rn+X az operandus címének címe A közvetett címzési módokat „indirekt” vagy „deferred” – késleltetett – módoknak is nevezik. Az index és közvetett módoknál az X egy 16 bites érték, mely az utasítás második szavában van tárolva. A kétoperandusú utasításoknál mindkét operandus használhatja a fenti módokat; ezek az utasítások három szó hosszúak.
Az autoinkrementáló és autodekrementáló módoknál a regiszterek értéke növeléskor a címszámítás után, csökkentéskor a címszámítás előtt változik, bájtos utasítások esetén 1-gyel, szavas utasítások esetén 2-vel. A közvetett módok használatánál a regiszter tartalma mindig 2-vel változik, mivel az ilyenkor egy szóra mutató címre mutat.
Programszámláló használata címzéseknél Az R7 általános regiszter, azonban ez a regiszter a programszámláló is. A processzor ennek segítségével olvassa ki a végrehajtandó utasításokat a memóriából, és az értékét ekkor automatikusan kettővel növeli, hogy az utasításkód utáni szó vagy a következő utasítás címét tartalmazza. A programszámláló minden fenti címzési móddal használható. Az alábbi módok csak speciális jelölések a címzési módok R7-es regiszterrel való használat mellett.
KódNévPéldaLeírás27Azonnali (Immediate)OPR #nAz operandus az utasításkódot követő szóban van elhelyezve37Abszolút (Absolute)OPR @#aAz operandus abszolút címe az utasításkódot követő szóban van elhelyezve67Relatív (Relative)OPR aAz utasításban tárolt érték és a PC+4 adja az operandus címét77Közvetett relatív (Relative deferred)OPR @aAz utasításban tárolt érték és a PC+4 határozza meg a címet, amelyben az operandus címe van
Az abszolút címzési módot ritkán használták, főleg a perifériakezelésben volt használatos, az eszközök be- és kimeneti regisztereinek címzésére, melyek az oktális — címek közé estek. A relatív módnak egyszerűbb a szintaxisa, ezt tipikusan programváltozókra és ugrási célcímekre való hivatkozásra használták. Az a program, amelyben csak relatív és közvetett relatív címzést használtak, kizárólag a kódon belüli hivatkozásokra, pozíciófüggetlen volt; nem tartalmazott semmilyen követelményt saját memóriabeli elhelyezkedésével kapcsolatban, tehát tetszőleges helyre betölthető volt, vagy akár át is lehetett helyezni máshova, anélkül, hogy a programban használt címeket az új elhelyezéshez kellett volna igazítani (relokáció).
Az azonnali és az abszolút módok egyszerűen az autoinkrementáló és közvetett autoinkrementáló módok alkalmazásai a PC (R7) regiszterre. A címzési módok a PC regiszterrel való használatakor az aktuális utasítás végrehajtása után a PC mindig a következő utasításra mutat. A PC mindig szavakat címez, az autoinkrementálás mindig 2-es értékkel történik.
Veremmutató használata címzéseknél Az R6 regiszter szolgál a veremkezelés céljaira, ez a regiszter SP-vel is jelölhető. Az R6 autodekrementáló móddal adatok helyezhetők a verembe, autoinkrementáló címzéssel pedig adatok emelhetők ki belőle. Az indexmódú címzés lehetővé teszi az adatok közvetlen elérését a veremben. A veremmutatót a vezérlőegység a megszakítások kezelésénél is használja. A veremkezelésre más regiszter is használható, de a hardveres R6 veremmutató értéke az autodekrementáló és autoinkrementáló módokkal minden esetben 2-vel változik, még a bájtos utasításoknál is.
A veremmutató esetén a címzési módok a következők: