Ugrás a tartalomhoz

PDP–11 architektúra

Ellenőrzött
A Wikipédiából, a szabad enciklopédiából

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

[szerkeszté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.[1]

Memória

[szerkesztés]

Adatformátumok

[szerkesztés]

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).[2][3]

Memóriakezelés

[szerkeszté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 160 000177 777 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

[szerkeszté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

[szerkesztés]

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

[szerkesztés]

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ód Név Példa Leírás
0n Regisztermód (Register) OPR Rn Az operandus az Rn tartalma
1n Közvetett regisztermód (Register deferred) OPR (Rn) Rn az operandus címét tartalmazza
2n Autoinkrementáló (Autoincrement) OPR (Rn)+ Rn megadja az operandus címét, ezután az Rn tartalma növekszik
3n Kö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-vel
4n Autodekrementáló (Autodecrement) OPR −(Rn) Az Rn regiszter tartalma csökken, ezután az operandus címeként használható
5n Kö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)
6n Indexmó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áltozik
7n Kö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.[4] 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

[szerkesztés]

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ód Név Példa Leírás
27 Azonnali (Immediate) OPR #n Az operandus az utasításkódot követő szóban van elhelyezve
37 Abszolút (Absolute) OPR @#a Az operandus abszolút címe az utasításkódot követő szóban van elhelyezve
67 Relatív (Relative) OPR a Az utasításban tárolt érték és a PC+4[5][6] adja az operandus címét
77 Közvetett relatív (Relative deferred) OPR @a Az utasításban tárolt érték és a PC+4[5][6] 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 160 000177 777 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

[szerkesztés]

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:

Kód Név Példa Leírás
16 Közvetett (Deferred) (SP) Az operandus a verem tetején helyezkedik el
26 Autoinkrementáló (Autoincrement) (SP)+ Az operandus a verem tetején helyezkedik el, onnan levenni (pl. „pop” utasítás)
36 Közvetett autoinkrementáló (Autoincrement deferred) @(SP)+ Az operandus címe a verem tetején helyezkedik el, onnan levenni (pl. „pop” utasítás)
46 Autodekrementáló (Autodecrement) −(SP) Helyezze az értéket a verembe (pl. „push” utasítás)
66 Indexelt (Indexed) X(SP) Ezzel elérhető bármelyik elem a veremben, a verem tetejétől számított pozitív indexével
76 Közvetett indexelt (Indexed deferred) @X(SP) A verem egy meghatározott helyén lévő érték az operandus címe

Utasításkészlet

[szerkesztés]

A PDP–11 bájtokon és szavakon képes műveleteket végezni. A bájtok lehetnek regiszterekben, ekkor a bájt a regiszter alsó bájtjára kerül; avagy egy memóriacímen. A szavak lehetnek regiszterekben vagy a memóriában, ahol a szó címe a szó kisebb helyiértékű bájtjára mutat és a cím páros. Az operandusokat használó utasításokban általában a 15-ik bit mutatja, hogy bájtos (1) vagy szavas (0) címzésről van szó. Az assembly nyelvben az utasítások alapértelmezésben szavas címzést használnak, az utasítás mnemonikja után írt B betű jelzi a bájtos műveletet, pl. a MOV bájtos változata a MOVB lesz.

Kétoperandusú utasítások

[szerkesztés]

A legmagasabb helyiértékű négy bit tartalmazza az utasítás kódját (a 15. a bájtos vagy szavas címzést kódolja). Az operandusokat két hatbites csoport jelöli ki, amelyek meghatározzák a címzési módot és a regisztert, a fentiek szerint.

15 12 11 9 8 6 5 3 2 0
Opkód Mód Forrás Mód Cél
src dst
OpkódMnemonikMűvelet
01MOVMove, adatmozgatás: dest = src
11MOVB
02CMPCompare, összehasonlítás: src − dest kiszámítása, csak a flagek beállítása
12CMPB
03BITBit test, bitellenőrzés: dest & src kiszámítása, csak a flagek beállítása
13BITB
04BICBit clear, bit törlése: dest &= ~src
14BICB
05BISBit set, bit beállítás ill. logikai OR: dest |= src
15BISB
06ADDAdd, összeadás, dest += src
16SUBSubtract, kivonás, dest −= src
  • src: forrás jelölése, dst: cél jelölése.

Az ADD és SUB utasítások szavas címzést használnak és nincs bájtorientált változatuk.

Néhány kiegészítő kétoperandusú utasítás regiszter forrásoperandust igényel:

15 9 8 6 5 3 2 0
Opkód Regiszter Mód Src/Dest

Néhány utasításban regiszterpár szerepel, így: „(R,R+1)” – ekkor az első regiszter az alacsonyabb helyiértékű biteket tartalmazza és párosnak kell lennie. A második regiszter tartalmazza a magasabb helyiértékű biteket vagy a maradékot. Kivétel a szorzás utasítás; ekkor a R páratlan lehet, de ebben az esetben az eredmény a felső 16 bitje nem tárolódik.

OpkódMnemonikMűvelet
070MULMultiply, szorzás: (R,R+1) = R × src
071DIVDivide, osztás: (R,R+1) ÷ src kiszámítása; a hányados az R, a maradék az R+1 regiszterekben
072ASHArithmetic shift, aritmetikai eltolás: R <<= src, az eltolás értéke −32..31 lehet.
073ASHCArithmetic shift combined, kombinált aritmetikai eltolás: (R,R+1) <<= src, az eltolás értéke −32..31 lehet.
074XORExclusive OR, kizáró vagy: dest ^= reg (csak szavas)
075Lebegőpontos műveletek (floating-point operations)
076Rendszerutasítások (system instructions)
077SOBSubtract one and branch, csökkentés és ugrás: csökkentse a regiszter tartalmát eggyel, ha az eredmény nem nulla, akkor elágazás vissza, 0..63 szó távolságra.
  • src: forrás jelölése, dest: cél jelölése.

Egyoperandusú utasítások

[szerkesztés]

A legmagasabb helyiértékű kilenc bit tartalmazza az utasítás kódját (a 15. bit általában a bájtos vagy szavas címzést kódolja). Nem minden kombináció jelöl egyoperandusú utasítást, mivel a legfelső négy bit bizonyos értékei más, kétoperandusú utasításokat jelölnek. Az operandust egy hatbites csoport jelöli ki, amely meghatározza a címzési módot és a regisztert, a fentiek szerint.

15 11 10 6 5 3 2 0
B 0 0 0 1 Opkód Mód Regiszter
OpkódMnemonikMűvelet
0003SWABSwap bytes, bájtfelcserélés: a céloperandus alacsonyabb és magasabb helyiértékű bájtjainak értékét cseréli fel
004rJSRJump to subroutine, szubrutinra ugrás
104xEMTEmulator trap, emulátor-csapda
0050CLRClear, törlés: dest = 0
1050CLRB
0051COMComplement, komplemensképzés: dest = ~dest
1051COMB
0052INCIncrement, inkrementáló utasítás, növelés eggyel: dest += 1
1052INCB
0053DECDecrement, dekrementáló utasítás, csökkentés eggyel: dest −= 1
1053DECB
0054NEGNegate, negáló utasítás: dest = −dest
1054NEGB
0055ADCAdd carry, C bit hozzáadása: dest += C
1055ADCB
0056SBCSubtract carry, C bit kivonása: dest −= C
1056SBCB
0057TSTTest, operandus vizsgálata: csak a jelzőbiteket állítja az operandus értékétől függően
1057TSTB
0060RORRotate right 1 bit, ciklikus léptetés jobbra 1 bittel, a C bit is részt vesz a léptetésben
1060RORB
0061ROLRotate left 1 bit, ciklikus léptetés balra 1 bittel, a C bit is részt vesz a léptetésben
1061ROLB
0062ASRShift right, aritmetikai léptetés egy bittel jobbra: dest >>= 1
1062ASRB
0063ASLShift left, aritmetikai léptetés egy bittel balra: dest <<= 1
1063ASLB
0064MARKVisszatérés szubrutinból veremürítéssel, 0..63 utasításszó átugrása
1064MTPSMove to status: PS = src
0065MFPIMove from previous I space: −(SP) = src
1065MFPDMove from previous D space: −(SP) = src
0066MTPIMove to previous I space: dest = (SP)+
1066MTPDMove to previous D space: dest = (SP)+
0067SXTSign extend, előjelkiterjesztés: az N feltételbit kerül a céloperandus minden bitjébe, dest = (16 × N flag)
1067MFPSMove from status: dest = PS
  • dest, src: az utasításban szereplő regiszter (cél vagy forrás) jelölése.

A SWAB utasításnak csak egy változata van.

Feltételes elágazási utasítások

[szerkesztés]

A legtöbb elágazási utasítás (branch) végrehajtása különböző feltételektől függ, amiket a állapotszóban (PSW) lévő jelzőbitek határoznak meg. Az elágazás-utasításokat tipikusan egy kétoperandusú CMP (compare, összehasonlítás), BIT (bit test, bitellenőrzés) vagy egyoperandusú TST (test, vizsgálat) utasítás előzi meg. Az aritmetikai és logikai utasítások szintén beállítják a feltételkódokat. A MOV adatmozgató utasítás nem állítja a jelzőbiteket.

A magasabb helyiértékű bájt meghatározza az utasítást, az alacsonyabb helyiértékű bájt egy előjeles címkülönbség, melyet a processzor a programszámláló aktuális értékéhez ad hozzá címszámításkor. Mivel a címnek párosnak kell lennie (a címkülönbség ill. eltolás is szavakat címez), a címkülönbség kettővel szorzódik, így végül (–128, +127) intervallumon belül lehetséges az ugrás.

15 11 10 8 7 0
x 0 0 0 0 Opkód Eltolás
OpkódMnemonikLeírás
0000xxRendszerutasítások (system instructions)
0004xxBRBranch unconditionally, feltétel nélküli elágazás
0010xxBNEBranch if not equal, elágazás nemegyenlőség esetén (Z=0)
0014xxBEQBranch if equal, elágazás egyenlőség esetén (Z=1)
0020xxBGEBranch if greater than or equal, elágazás nagyobb és egyenlő esetén (N|V = 0)
0024xxBLTBranch if less than, elágazás kisebb és egyenlő esetén (N|V = 1)
0030xxBGTBranch if greater than, elágazás nagyobb esetén (N^V = 1)
0034xxBLEBranch if less than or equal, elágazás kisebb és egyenlő esetén (N^V = 0)
1000xxBPLBranch if plus, elágazás pozitív eredmény esetén (N=0)
1004xxBMIBranch if minus, elágazás negatív eredmény esetén (N=1)
1010xxBHIBranch if higher than, elágazás magasabb értéknél (C|Z = 0, előjel nélküli összehasonlítás eredményét vizsgálja)
1014xxBLOSBranch if lower or same, elágazás, ha alacsonyabb vagy egyenlő (C|Z = 1, előjel nélküli összehasonlítás eredményét vizsgálja)
1020xxBVCBranch if overflow clear, elágazás, ha nem volt túlcsordulás (V=0)
1024xxBVSBranch if overflow set, elágazás túlcsordulás után (V=1)
1030xxBCCBranch if carry clear, elágazás, ha az átvitelbit 0 (C=0)
BHISBranch if higher or same, elágazás, ha magasabb vagy egyenlő (C=0)
1034xxBCSBranch if carry set, elágazás, ha az átvitelbit 1 (C=1)
BLOBranch of lower than, elágazás, ha alacsonyabb (C=1)

Ebbe a csoportba tartozik még a SOB (subtract one and branch, egy kivonása és elágazás) utasítás is, ugyanis ez egy ciklusokban használható kiegészítő feltételes elágazás. Végrehajtása: az operandus tartalma eggyel csökken; ha az eredmény nem nulla, az utasítás alsó 6 bitjén található érték egy visszafelé mutató szavas eltolást (relatív címet) határoz meg, amire átadódik a vezérlés. Ha az eredmény nulla volt, a program a soron következő utasítással folytatódik. Ezzel maximum 63 szó távolságra lehet ugrani.

Az elágazó utasítások ugrási intervalluma korlátos, tehát a program előrehaladásával bizonyos címek a relatív ugrások számára nem lesznek elérhetők. Ilyenkor a programozó feladata BR utasítások helyett kétszavas JMP konstrukciók használata. A JMP utasításnak nincsenek feltételes alakjai, ezért pl. BEQ vagy BNE használható a JMP átugrására.

Ugró és szubrutinhívó utasítások

[szerkesztés]
  • JMP – Jump, feltétel nélküli ugrás, az összes címzési mód használható, kivéve a regisztercímzést, amely „illegális utasítás” kizárást okoz
  • JSR – Jump to subroutine, szubrutinra ugrás ill. szubrutinhívás, ld. alább
  • RTS – Return from subroutine, visszatérés szubrutinból, ld. alább
  • MARK – visszatérés szubrutinból veremürítéssel
  • EMT – Emulator trap, emulátor csapda
  • TRAP, BPT – Breakpoint trap, töréspont csapda
  • IOT – input/output trap, be- és kimeneti csapda
  • RTI & RTT – Return from interrupt, visszatérés megszakításból

A JSR utasítás a megadott regiszter tartalmát elmenti a veremben. A programokban, amelyekben nem használják ezt a lehetőséget, a PC-t jelölik ki az utasítás regiszterének (JSR PC,cím) és a szubrutin az RTS PC utasítással térhet vissza. Ha a szubrutint pl. a „JSR R4, cím” utasítással hívta meg a program, akkor az R4 korábbi értéke a verem tetejére kerül, és a JSR utasítás után következő utasítás címe kerül az R4-be mint visszatérési cím. Ez lehetővé teszi a szubrutin számára az in-line, programkódba illesztett értékekhez való hozzáférést az (R4)+ címzéssel, vagy in-line mutatók használatát @(R4)+ címzéssel. Az autoinkrementálás a címet az adat(ok) utáni szóra mozgatja, arra a pontra, ahol a hívó kód folytatódik. Egy ilyen szubrutin az RTS R4 utasítással térhet vissza a hívóhoz.

Egyéb utasítások

[szerkesztés]
  • HALT, WAIT (várakozás megszakításra)
  • RESET (reset UNIBUS, inicializáló jel küldése a sínrendszerre)

Feltételkódok törlése és beállítása

[szerkesztés]
  • CLC, CLV, CLZ, CLN, CCC – clear, az adott feltételkód törlése
  • SEC, SEV, SEZ, SEN, SCC – set, az adott feltételkód beállítása

A feltételkódok a processzor állapotszavában (processor status word, PSW) az alábbiak:

  • N – negatív érték jelzése,
  • Z – zérus vagy egyenlőség jelzőbitje,
  • V – a túlcsordulás jelzőbitje,
  • C – átvitelbit.

Az SCC és CCC beállítja és törli az összes feltételbitet. Az utasítások által nem állított feltételbitek állapota nem változik.

Választható utasításkészletek

[szerkesztés]
Extended Instruction Set (EIS) – Kiterjesztett utasításkészlet

Az EIS választható volt a 11/35/40 és 11/03 modellekhez, az újabb processzorok beépítve tartalmazták. Bővítések:

  • MUL, DIV – regiszterpár szorzása és osztása egész operandussal
  • ASH, ASHC – kombinált aritmetikai eltolás (arithmetic shift), megadott számmal való eltolás regiszter vagy regiszterpár értékére. Pozitív érték balra, negatív érték jobbra való eltolást eredményez.
Floating Instruction Set (FIS) – Lebegőpontos utasításkészlet

A FIS választható volt a 11/35/40 és 11/03 modellekhez.

  • FADD, FSUB, FMUL, FDIV – csak egyszeres pontosságú értékekre, az érték a regiszter operandus által címzett veremben lehet.
Floating Point Processor (FPP) – Lebegőpontos processzor

Ez a 11/45 és utána következő modellek kiegészítő lebegőpontos processzorának utasításkészlete.

  • Teljes lebegőpontos utasításkészlet egyszeres pontosságú és duplapontos operandusokon, ami a lebegőpontos állapotregiszter (Floating Point Status Register) egyszeres/kétszeres bitjével választható.
  • Az egyszeres pontosságú lebegőpontos adatformátum megfelel az IEEE 754 formátumnak: előjelbit, 8 bites exponens, 23 bites mantissza rejtett 24-ik bittel.
Commercial Instruction Set (CIS) – Üzleti utasításkészlet

A CIS a 11/23/24 modellekben kiegészítő mikrokóddal volt megvalósítva, és egy bővítőmodullal a 11/44, valamint a 11/74 egyik verziójában. Ebben string és decimális utasítások voltak a COBOL és Dibol nyelvekkel való használathoz.

Hozzáférés a processzor állapotszóhoz (Processor Status Word, PSW)

A PSW az oktális 177 776-os memóriacímre volt leképezve, de a PDP–11-es modellek közvetlenebb hozzáférést biztosítottak ehhez a regiszterhez, legkorábbi PDP–11 modelleket kivéve.

  • SPL – Set priority level, prioritási szint beállítása
  • MTPS – Move to Processor Status, mozgatás a processzor állapotregiszterébe
  • MFPS – Move from Processor Status, mozgatás a processzor állapotregiszteréből
Hozzáférés egyéb memóriaterületekhez

Azokon a PDP–11 modelleken, amelyeken rendelkezésre állt az elkülönített utasításterület és adatterület, a területek elérését egy nem ortogonális mozgatóutasítás-készlet biztosította. Ezeket pl. a futásidejű rendszerhívásokat kezelő operációs rendszerrutinokban használták, amelyek ezek segítségével kommunikáltak a hívóval. Az utasítások:

  • MTPD – Move to previous data space, mozgatás az előző adatterületre
  • MTPI – Move to previous instruction space, mozgatás az előző utasításterületre
  • MFPD – Move from previous data space, mozgatás az előző adatterületről
  • MFPI – Move from previous instruction space, mozgatás az előző utasításterületről

Inkonzisztens utasítások

[szerkesztés]

A PDP–11 élettartama alatt a különböző felépítésű és különböző technikákkal megvalósított modellekben idővel apró eltérések jelentkeztek az utasítás- és címzésimód-kombinációk végrehajtásában, bár egyiket sem tartottak az egyedüli helyes megoldásnak. Az eltérések nem nagyon befolyásolták a PDP–11 szokásos használatát.

Például a MOV R5,-(R5) utasítás a regiszterben tárolt értéket az általa mutatott címre mozgatja (az érték és a cím ugyanaz a szám), a cím kettővel való csökkentése után. Egy mikroprogramozott PDP–11 képes lehetett teljesen kiszámítani/kiértékelni a forrásoperandust, még a céloperandus kiértékelésének megkezdése előtt, így a mozgatott érték nem tükrözi a csökkentést (dekrementálást). Egy áramkörökkel megvalósított (huzalozott) PDP–11 esetleg a csökkentést hajtotta végre először, mivel így megtakaríthatott egy memóriaciklust.

Sebesség

[szerkesztés]

A PDP–11 processzorának sebessége modellről modellre változott, és függött a memóriakonfigurációtól, a programokban használt opkódoktól és címzési módoktól is. Az utasítások időzítését három összetevő határozta meg: maga az utasítás lehívása és végrehajtása (fetch/execute), valamint a forrás és a cél hozzáférési ideje. Az utóbbi két komponens függ a címzési módtól. Például a kb. 1975-ös PDP–11/70 modellben egy ADD x(Rm),y(Rn) alakú utasítás lehívás-végrehajtási ideje 1,35 µs plusz a forrás és cél elérési idők, mindkettő 0,6 µs, így a teljes végrehajtási idő 2,55 µs. Minden olyan eset, amikor a címzett memória nem volt a gyorsítótárban, további 1,02 µs-ot adott a végrehajtási időhöz. A regiszter–regiszter típusú ADD Rm,Rn utasítás 0,3 µs alatt végrehajtódhatott a gyorsítótárból. A lebegőpontos utasítások végrehajtási ideje még összetettebb volt, mivel (a végrehajtási időben) volt némi átfedés a CPU és a lebegőpontos processzor között, de általánosságban a lebegőpontos utasítások jelentősen lassabbak voltak. Az egyszeres pontosságú lebegőpontos összeadás utasítás végrehajtási ideje 2,4 µs-től 5,5 µs-ig változhatott, amihez még hozzáadódott az operandusok lehívásának ideje is.[7]

Megszakítások

[szerkesztés]

A PDP–11 0 és 7 közötti prioritási szinten működhet, amelyet a processzor-állapotszó (Processor Status Word, PSW) három bitje határoz meg. A perifériák a sínre kapcsolódnak, a perifériákhoz hardveres úton van hozzárendelve a prioritás, ez határozza meg, hogy az eszköz milyen szinten kérhet megszakítást. A megszakítási kérelemhez a sínre csatlakozó eszköz beállítja a négy közös sínvonalat, a BR4 – BR7 vonalakat, amíg a processzor nem válaszol. A nagyobb számok nagyobb sürgősséget jeleztek, például hogy az adat elveszik vagy a szükséges szektor kikerül az író-olvasófejek alól, hacsak a processzor nem reagál gyorsan az eseményre. Pl. az az esemény, hogy a nyomtató kész egy újabb karakter fogadására, a legalacsonyabb prioritással rendelkezik (BR4), mivel ez az állapot határozatlan ideig fennállhat. Ha a processzor az 5-ös szinten működik, akkor a BR6 és BR7 megszakítások érvényre jutnak, a processzor megkísérli kiszolgálni ezeket. A processzor csak akkor fogadja egy periféria megszakítási kérelmét, ha az egység magasabb szinten kéri a megszakítást, mint a processzor pillanatnyi prioritása. Ha a processzor a 3-as szinten működik, minden megszakítás érvényre jut; ha a 7-es szinten, akkor egyik sem (ekkor egyetlen megszakítási kérelemre sem reagál a processzor). Azok a sínre helyezett kérelmek, melyek nem lettek kiszolgálva, nem vesznek el, hanem csak késleltetve vannak. A megszakítást igénylő eszköz továbbra is érvényesíti a kérelmet.

Amint egy megszakítási kérelem szintje nagyobb, mint a processzor prioritási szintje, a processzor beállítja a megfelelő sín-engedélyező jelet, a BG4–BG7 vonalakon. A sín-engedélyező vonalak nem közös vonalak, hanem sorba vannak kötve: minden kapu bemenete az előző kapu kimenetére csatlakozik a láncban. Mindegyik eszköz rendelkezik ilyen kapuval, és a processzorhoz fizikailag közelebb elhelyezkedő eszköz a láncban korábban következik. Ha az eszköz kibocsátott egy kérelmet és ezután megkapta a sín-engedélyező jelet, ez azt jelenti, hogy az eszköz megkapta a vezérlést a sín felett és nem továbbítja az engedélyt a sínen utána következő eszköznek. Ha az eszköz nem kért megszakítást, továbbadja a sín-engedélyező jelet a legközelebbi eszköznek, így átengedi annak a válaszlehetőséget. (Ha az eszközök nem egymás melletti kártyacsatlakozókat foglaltak el a processzor-kártyán, akkor „engedélytovábbító kártyákat” raktak az üres csatlakozókba az engedélyező jelek továbbítására.)

Miután az eszköz megkapta a busz vezérlését, megszünteti a kérelmet és a sínre helyezi egy kétszavas vektor memóriacímét. A processzor elmenti az aktuális programszámlálót (PC) és a processzor-állapotszót (PSW), majd betölti ezek új értékeit a megadott vektorból. Egy BR6 szinten kérelmező eszköz esetén a vektorban lévő új PSW érték általában 6-ot tartalmaz a processzor prioritási szintjét beállító biteken, így a processzor csak az ennél nagyobb prioritású kérelmeket (BR7) fogadja el, amíg fut a BR6 szintű megszakítás kiszolgálórutinja, és késlelteti az ugyanolyan vagy alacsonyabb prioritású kérelmeket. Az új PC mutatja a kiszolgálórutin kezdőcímét: mihelyt a PC új értéket kap, a végrehajtás az új címen folytatódik. A rutin kiszolgálja az eszközt, vagy legalábbis megszünteti a megszakítást okozó feltételeket. A rutin egy RTI (ReTurn from Interrupt, visszatérés megszakításból) utasítással végződik, amely visszaállítja a PC és a PSW előző értékét, pontosan a megszakítás bekövetkezése előtti állapotba.

Ha a sínre valamilyen hiba okán került a kérelem és egy eszköz sem válaszol az engedélyező jelekre, akkor a processzor túllépi a várakozási időt és egy csapdát (trap, ami szintén egy megszakítás) hajt végre, amely valami módon kezeli vagy jelzi a hardverhibát.

A MACRO-11 assembly nyelv

[szerkesztés]
Lyukszalag a PDP–11-hez

A MACRO-11 a PDP–11 assembly nyelve. Ez a nyelv a PAL-11 (Program Assembler Loader) utódja, amely szintén a PDP–11 assembly nyelve, de nem támogatja a makrók használatát. A MACRO-11 megtalálható volt a DEC minden PDP–11-hez készített operációs rendszerében. A PDP–11-es Unix rendszerek szintén tartalmaztak egy „as” nevezetű assemblert, amely struktúrájában hasonlított a MACRO-11-hez, de eltérő volt a szintaxisa és kevesebb lehetőséget nyújtott.

PDP–11 folklór

[szerkesztés]

Egy elterjedt, ám hamis mítosz szerint a PDP–11 utasításkészlete hatással volt a B programozási nyelv kifejezéseinek készletére. Ennek alapja az, hogy a PDP–11 inkrementáló és dekrementáló címzési módjai hasonlítanak ill. megfelelnek a −−i és i++ szerkezeteknek a C nyelvben. Ha az i és j egyaránt regiszterváltozók, akkor bizonyos kifejezések, mint pl. a *(−−i) = *(j++) egyetlen gépi kódú utasításra fordíthatók. Dennis Ritchie egyértelműen ellentmond ennek a népmesének, megjegyezve, hogy a PDP–11 még nem létezett a B létrehozásának időpontjában. Megjegyzi azonban, hogy ezeket a címzési módokat lehet, hogy a PDP–7 auto-növekményes cellái sugallták, habár a B nyelv megalkotásakor nem használták ezt a hardverfunkciót.[8]

A C programozási nyelv valóban kihasználta a PDP–11 néhány alacsony szintű programozási jellemzőjét, ezáltal ezek a jellemzők továbbterjedtek és felütötték fejüket az újabb processzorokban is.[9]

Jegyzetek

[szerkesztés]
  1. szerk.: Lőcs Gyula: 1. Hardverismertetés, Macro nyelvű programozás I.. SZÁMALK, 13–25. o.. HU ISSN 0230-7464, ISBN 963-553-069-2 összkiadás, ISBN 963-553-070-6 I. kötet (1984)
  2. pdp11/05/10/35/40, Chapter 7.
  3. pdp11/04/34a/44/60/70, page 421.
  4. szerk.: Lőcs Gyula: 2.3 Közvetett címzés, Macro nyelvű programozás I.. SZÁMALK, 37. o.. HU ISSN 0230-7464, ISBN 963-553-069-2 összkiadás, ISBN 963-553-070-6 I. kötet (1984)
  5. 1 2 szerk.: Lőcs Gyula: 2.6 A címzési módok összefoglalása, Macro nyelvű programozás I.. SZÁMALK, 53-54. o.. HU ISSN 0230-7464, ISBN 963-553-069-2 összkiadás, ISBN 963-553-070-6 I. kötet (1984)
  6. 1 2 pdp 11/40 processor handbook (angol nyelven) (PDF) pp. 3-15. Digital Equipment Corporation, 1972. (Hozzáférés: 2013)
  7. DEC PDP-11/70 Processor Handbook, 1975, Appendix C, Instruction Timing
  8. Dennis M. Ritchie (1993. March). The Development of the C Language”. ACM SIGPLAN Notices 28 (3), 201–208. o. [2013. május 23-i dátummal az eredetiből archiválva]. DOI:10.1145/155360.155580. (Hozzáférés: 2013. április 22.) „People often guess that they were created to use the auto-increment and auto-decrement address modes provided by the DEC PDP-11 on which C and Unix first became popular. This is historically impossible, since there was no PDP-11 when B was developed. The PDP-7, however, did have a few `auto-increment' memory cells, with the property that an indirect memory reference through them incremented the cell. This feature probably suggested such operators to Thompson; the generalization to make them both prefix and postfix was his own. Indeed, the auto-increment cells were not used directly in implementation of the operators, and a stronger motivation for the innovation was probably his observation that the translation of ++x was smaller than that of x=x+1.”
  9. Bakyo, John. "DEC PDP-11, benchmark for the first 16/32 bit generation. (1970)" in Great Microprocessors of the Past and Present (V 13.4.0), Section Three, Part I. Accessed 2011-03-04

Fordítás

[szerkesztés]

Ez a szócikk részben vagy egészben a PDP-11 architecture című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Források

[szerkesztés]
  • pdp11 processor handbook - pdp11/05/10/35/40. Digital Equipment Corporation (1973) 
  • pdp11 processor handbook - pdp11/04/34a/44/60/70. Digital Equipment Corporation (1979) 
  • szerk.: Lőcs Gyula: Macro nyelvű programozás I.. SZÁMALK, 1–208. o.. HU ISSN 0230-7464, ISBN 963-553-069-2 összkiadás, ISBN 963-553-070-6 I. kötet (1984) 

További információk

[szerkesztés]
  • „Eac”: PDP-11 (angol nyelven) (wiki). Conservapedia, 2007, 2008. (Hozzáférés: 2013)
  • „jwest”: PDP-11 (angol nyelven). pdp11.org, 2002. február 5. (Hozzáférés: 2013) – néhány hivatkozás megszűnt.

Kapcsolódó szócikkek

[szerkesztés]