Ortogonális utasításkészlet

A Wikipédiából, a szabad enciklopédiából

A számítástechnikában ortogonális utasításkészletnek nevezik az olyan utasításkészleteket, melyek valamennyi utasítása valamennyi címzési módot használhatja. „Ortogonális” olyan értelemben, hogy az utasítás típusa és a címzés módja egymástól függetlenül változhat. Az ortogonális utasításkészletek nem tartalmaznak olyan korlátot, hogy bizonyos utasítás kizárólag specifikus regisztert használhat.[1]

Ortogonalitás a gyakorlatban[szerkesztés]

Sok CISC architektúrát jellemzi, hogy egy utasítás elérheti a regisztereket vagy a memóriát is, általában több különböző címzési móddal. Ez megkönnyítette a CISC gépek programozását, mert több ezer különböző műveleti kód?? helyett az ortogonális utasításkészlet lehetővé teszi, hogy csak harminc-száz műveleti kóddal („ADD”, „SUBTRACT”, „MULTIPLY”, „DIVIDE”, etc.) és 3-10 címzési móddal kelljen számolni („FROM REGISTER 0”, „FROM REGISTER 1”, „FROM MEMORY” stb.). A DEC PDP-11 és Motorola 68000 architektúrák szinte teljesen, míg az ARM11 és a VAX teljesen ortogonális utasításkészlettel rendelkeztek.

A PDP–11[szerkesztés]

A lebegőpontos utasítások kivételével a PDP–11 igen erősen ortogonális volt. Az összes nem lebegőpontos aritmetikai utasítás kezelhetett akár 1, akár 2 bájtos egészeket, a kezelt adatok pedig lehettek akár regiszterekben, akár az utasítás kódjában, a memóriában, a memóriában, de regiszterekben tárolt pointerrel megcímezve. Még a programszámlálót és a veremmutatót is megváltoztathatták a teljesen hétköznapi utasítások hétköznapi címzési módjai. Valójában még az „immediate” mód – konstans, bedrótozott számok az utasítás operandusában, pl. ADD #4, R1 (R1 = R1 + 4) – implementációja is valójában „register indirect, autoincrement” (regiszter-indirekt, autoinkrementáló) üzemmódban működött a programszámlálót (R7) használva az indirekció regisztereként és az autoinkrementáció céljaként.

Mivel a PDP–11 részben nyolcas számrendszer-orientált volt (3 bites szub-szavakkal, címzési módok 0–7, R0–R7 regiszterek), elektronikusan 8 címzési mód létezett. A veremmutató (R6) és a programszámláló (R7) hivatkozható regiszterek használatával koncepcionálisan 10 címzési módot lehetett megkülönböztetni.

A VAX–11[szerkesztés]

A VAX–11 kiterjesztette a PDP-11 ortogonalitását valamennyi adattípusra, köztük a lebegőpontos számokra is (bár az olyan utasításoknak, mint az 'ADD' létezett több külön adatméretfüggő változata, pl. ADDB, ADDW, ADDL, ADDP, ADDF a bájt, szó, longword, csomagolt BCD (packed BCD) és (egyszeres pontosságú) lebegőpontos számok összeadására. A PDP–11-hez hasonlóan a veremmutató és a programszámláló az általános regiszterfájl része volt (R14 és R15).

A VAX 11 utasítások általános alakja a következő volt:

opkód [ operandus ] [ operandus ] … ,

ahol minden komponens egybájtos, az opkód értéke 0–255 közé esik, az operandus pedig két nibble-ből áll, a felső 4 bit a címzési módot határozza meg, az alsó 4 bit pedig (általában) egy regiszter számát (R0–R15).

Az oktális-orientált PDP–11-gyel szemben a VAX–11 hexadecimális-orientált gép volt (4 bites szub-szó). Ez 16 logikai címzési módot (0–15) eredményezett, melyek közül azonban a 0–3 közöttiek a „short immediate” (rövid azonnali) módok voltak 6 vagy kevesebb bitnyi konstans érték céljára (a címzési mód alsó két bitje adta az azonnali érték felső két bitjét, a maradék négy adat-operandusbithez hozzáfűzve). Mivel a 0–3 címzési módok egyebekben azonosak voltak, ez 13 elektronikus címzési módot eredményezett, de ahogy a PDP–11-nél is, a veremmutató (R14) és a programszámláló (R15) használatával koncepcionálisan 15 címzési módot lehetett használni (az assembler program a forráskódból a megfelelő, veremmutatót vagy programszámlálót alkalmazó címzési módra fordított).

Az MC68000[szerkesztés]

A Motorola fejlesztői megpróbálták az assembly nyelvet ortogonálissá tenni, miközben az alapul szolgáló gépi kód valamivel kevésbé volt az. A PDP–11-től eltérően az MC68000 különálló regiszterekben tárolta az adatokat és a memóriában lévő adatok címeit.

A gépi kód szintjén vizsgálódva látható, hogy az MC68000 szimbolikus utasításai különböző opkódokra fordulhatnak le. Ez a kompromisszumos megoldás csaknem olyan kényelmes, mint egy valódi ortogonális utasításkészlet, de a CPU tervezőinek nagyobb szabadságot ad az utasítások kódjainak az ortogonális megoldásnál hatékonyabb felhasználására.

A 8080 és az azt követő designok[szerkesztés]

A 8 bites Intel 8080 mikroprocesszor (továbbá a 8085 és a 8051 mikrovezérlő) lényegében egy kissé kiterjesztett akkumulátor-alapú design volt, ezért nem volt ortogonális. Az assembly programozónak vagy a fordítóprogram írójának oda kellett figyelnie, hogy melyik regiszteren melyik műveletek elvégzése lehetséges: a legtöbb 8 bites műveletet csak a 8 bites akkumulátoron (az A-regiszteren) lehetett elvégezni, míg a 16 bites műveleteket a 16 bites pointer/akkumulátoron (a HL-regiszterpáron); a legegyszerűbb műveletek, mint az inkrementálás, mind a hét 8 bites regiszteren elvégezhetők voltak. Ennek az oka nagyrészt az volt, hogy az opkódok hosszúságát egy bájton akarták tartani, és fenn akarták tartani a forráskód szintű kompatibilitást az eredeti Intel 8008-cal (a Datapoint 2200 CPU LSI-implementációjával).

A binárisan kompatibilis Z80-as később prefix kódokkal bővítette az opkódokat, hogy az egy bájtos korlátot kikerülve további képességeket építhessen az utasításkészletbe. Ugyanezt az alapötletet alkalmazták az Intel 8086-nál is, itt azonban nem törekedtek a bináris kompatibilitásra, ami radikálisabb kiterjesztést tett lehetővé. A 8086-ost ehelyett szabályos 16 bites processzornak tervezték, ami forráskód szinten volt kompatibilis a 8008, 8080 és 8085 processzorokkal. A magas kódsűrűség kedvéért valamennyire meghagyták a kódot nem ortogonálisnak (amit a kortárs számítógéptudósok „barokkosnak” csúfoltak). Az architektúra 32 bites kiterjesztése a 80386-tal érkezett meg, az eredeti 8086 utasítások (és bővítéseik) megtartása ellenére valamivel ortogonálisabb megközelítést követtek. Az opkódban alkalmazott kódolási stratégia azonban továbbra is az eredeti 8008 és 8080 (valamint a Z80) örökségeit mutatta; például egyes gyakori utasítások, mint a regiszterek vagy konstansok push és pop utasítása egy bájtos opkódot kaptak, az elsődleges akkumulátor, az eax bizonyos művelettípusokban rövidebb kódot kapott; ezeket a megfigyeléseket a kézi és a fordítóprogram által végzett kódoptimalizálás során egyaránt kihasználják.

A RISC-korszak kezdete[szerkesztés]

Egy teljes mértékben ortogonális architektúra nem feltétlenül a leginkább „bithatékony” is egyben. Az 1970-es évek végén az IBM kutatói (és máshol végzett kutatások egyaránt) kimutatták, hogy ezeknek az „ortogonális” címzési módoknak a legnagyobb részét nem használják ki a programok. Megszületett az elképzelés, hogy a teljesen ortogonális utasításkészletet kifejező bitek egy részét talán hatékonyabban fel lehetne használni például több virtuáliscím-bit vagy több választható regiszter kódolására.

A RISC-korszakban a számítógép-tervezők arra törekedtek, hogy elérjenek egy jobbnak vélt egyensúlyt. Legjellemzőbb erre, hogy a legtöbb RISC számítógépnél, bár az utasítások és az általuk kezelt adattípusok tekintetében továbbra is nagymértékben ortogonálisak, áttértek a „load/store” architektúrára. Ezekben az architektúrákban csak néhány „memóriahivatkozó utasítás” képes a központi memória elérésére, és csak abból a célból, hogy a regiszterekbe adatokat töltsenek onnan, vagy visszamentsék a regiszterekből a műveletek eredményét; csak néhány címzési mód elérhető, és ezek a módok különbözhetnek attól függően, hogy az utasítás adatra vonatkozik, vagy vezérlésátadó utasítás (ugrás). Ebből kifolyólag az adatoknak a regiszterekben kell lenniük, mielőtt a többi utasítás dolgozni tudna rajtuk. Ezt a kompromisszumot kimondottan annak érdekében tették, hogy sokkal nagyobb regiszterkészleteket, kiterjesztett virtuális címzést és nagyobb „azonnali adat”-értékeket (az utasítással együtt tárolt adat) lehessen használni.

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben az Orthogonal instruction set 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.

Jegyzetek[szerkesztés]

  1. The Essentials of Computer Organization and Architecture. Jones & Bartlett Publishers, 287–288. o. (2010). ISBN 1449600069