PDP–11 architektúra

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 | forrásszöveg szerkesztése]

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, amelyek 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 | forrásszöveg szerkesztése]

Adatformátumok[szerkesztés | forrásszöveg szerkesztése]

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 alap architektú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 | forrásszöveg szerkesztése]

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 000—177 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, amelyekben 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, amelyeket 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, amelyekkel az operációs rendszer szolgáltatásai hívhatók.

Memóriabővítés[szerkesztés | forrásszöveg szerkesztése]

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, amelyben 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 | forrásszöveg szerkesztése]

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, amely az operandusok jelölését mutatja assembly nyelven egy hipotetikus/feltételezett egyoperandusú utasításban, amelyet 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 | forrásszöveg szerkeszté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ó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, amely 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 | forrásszöveg szerkesztése]

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, amelyek az oktális 160 000—177 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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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ód Mnemonik Művelet
01 MOV Move, adatmozgatás: dest = src
11 MOVB
02 CMP Compare, összehasonlítás: src − dest kiszámítása, csak a flagek beállítása
12 CMPB
03 BIT Bit test, bitellenőrzés: dest & src kiszámítása, csak a flagek beállítása
13 BITB
04 BIC Bit clear, bit törlése: dest &= ~src
14 BICB
05 BIS Bit set, bit beállítás ill. logikai OR: dest |= src
15 BISB
06 ADD Add, összeadás, dest += src
16 SUB Subtract, 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ód Mnemonik Művelet
070 MUL Multiply, szorzás: (R,R+1) = R × src
071 DIV Divide, osztás: (R,R+1) ÷ src kiszámítása; a hányados az R, a maradék az R+1 regiszterekben
072 ASH Arithmetic shift, aritmetikai eltolás: R <<= src, az eltolás értéke −32..31 lehet.
073 ASHC Arithmetic shift combined, kombinált aritmetikai eltolás: (R,R+1) <<= src, az eltolás értéke −32..31 lehet.
074 XOR Exclusive OR, kizáró vagy: dest ^= reg (csak szavas)
075 Lebegőpontos műveletek (floating-point operations)
076 Rendszerutasítások (system instructions)
077 SOB Subtract 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 | forrásszöveg szerkesztése]

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ód Mnemonik Művelet
0003 SWAB Swap bytes, bájtfelcserélés: a céloperandus alacsonyabb és magasabb helyiértékű bájtjainak értékét cseréli fel
004r JSR Jump to subroutine, szubrutinra ugrás
104x EMT Emulator trap, emulátor-csapda
0050 CLR Clear, törlés: dest = 0
1050 CLRB
0051 COM Complement, komplemensképzés: dest = ~dest
1051 COMB
0052 INC Increment, inkrementáló utasítás, növelés eggyel: dest += 1
1052 INCB
0053 DEC Decrement, dekrementáló utasítás, csökkentés eggyel: dest −= 1
1053 DECB
0054 NEG Negate, negáló utasítás: dest = −dest
1054 NEGB
0055 ADC Add carry, C bit hozzáadása: dest += C
1055 ADCB
0056 SBC Subtract carry, C bit kivonása: dest −= C
1056 SBCB
0057 TST Test, operandus vizsgálata: csak a jelzőbiteket állítja az operandus értékétől függően
1057 TSTB
0060 ROR Rotate right 1 bit, ciklikus léptetés jobbra 1 bittel, a C bit is részt vesz a léptetésben
1060 RORB
0061 ROL Rotate left 1 bit, ciklikus léptetés balra 1 bittel, a C bit is részt vesz a léptetésben
1061 ROLB
0062 ASR Shift right, aritmetikai léptetés egy bittel jobbra: dest >>= 1
1062 ASRB
0063 ASL Shift left, aritmetikai léptetés egy bittel balra: dest <<= 1
1063 ASLB
0064 MARK Visszatérés szubrutinból veremürítéssel, 0..63 utasításszó átugrása
1064 MTPS Move to status: PS = src
0065 MFPI Move from previous I space: −(SP) = src
1065 MFPD Move from previous D space: −(SP) = src
0066 MTPI Move to previous I space: dest = (SP)+
1066 MTPD Move to previous D space: dest = (SP)+
0067 SXT Sign extend, előjelkiterjesztés: az N feltételbit kerül a céloperandus minden bitjébe, dest = (16 × N flag)
1067 MFPS Move 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 | forrásszöveg szerkesztése]

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, amelyet a processzor a programszámláló aktuális értékéhez ad hozzá a 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ód Mnemonik Leírás
0000xx Rendszerutasítások (system instructions)
0004xx BR Branch unconditionally, feltétel nélküli elágazás
0010xx BNE Branch if not equal, elágazás nemegyenlőség esetén (Z=0)
0014xx BEQ Branch if equal, elágazás egyenlőség esetén (Z=1)
0020xx BGE Branch if greater than or equal, elágazás nagyobb és egyenlő esetén (N|V = 0)
0024xx BLT Branch if less than, elágazás kisebb és egyenlő esetén (N|V = 1)
0030xx BGT Branch if greater than, elágazás nagyobb esetén (N^V = 1)
0034xx BLE Branch if less than or equal, elágazás kisebb és egyenlő esetén (N^V = 0)
1000xx BPL Branch if plus, elágazás pozitív eredmény esetén (N=0)
1004xx BMI Branch if minus, elágazás negatív eredmény esetén (N=1)
1010xx BHI Branch 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)
1014xx BLOS Branch 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)
1020xx BVC Branch if overflow clear, elágazás, ha nem volt túlcsordulás (V=0)
1024xx BVS Branch if overflow set, elágazás túlcsordulás után (V=1)
1030xx BCC Branch if carry clear, elágazás, ha az átvitelbit 0 (C=0)
BHIS Branch if higher or same, elágazás, ha magasabb vagy egyenlő (C=0)
1034xx BCS Branch if carry set, elágazás, ha az átvitelbit 1 (C=1)
BLO Branch 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 | forrásszöveg szerkesztése]

  • 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 | forrásszöveg szerkesztése]

  • 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 | forrásszöveg szerkesztése]

  • 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úcsordulá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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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, amelyek 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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 nyelben. 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 ezek 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 a fejüket az újabb processzorokban is.[9]

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

  1. szerk.: Lőcs Gyula: 1. Hardverismertetés, Macro nyelvű programozás I. (magyar nyelven). 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. (magyar nyelven). 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. ^ a b szerk.: Lőcs Gyula: 2.6 A címzési módok összefoglalása, Macro nyelvű programozás I. (magyar nyelven). 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. ^ a b pdp 11/40 processor handbook (angol nyelven) (PDF) pp. 3-15. Digital Equipment Corporation, 1972
  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. DOI:10.1145/155360.155580. „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 | forrásszöveg szerkesztése]

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.

Források[szerkesztés | forrásszöveg szerkesztése]

  • 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. (magyar nyelven). 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 | forrásszöveg szerkesztése]

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

Kapcsolódó szócikkek[szerkesztés | forrásszöveg szerkesztése]