Režim adresování - Addressing mode

Adresovací režimy jsou aspektem architektury instrukční sady ve většině návrhů centrální procesorové jednotky (CPU). Různé režimy adresování, které jsou definovány v dané architektuře sady instrukcí, definují, jak instrukce jazyka stroje v této architektuře identifikují operand (y) každé instrukce. Režim adresování určuje, jak vypočítat efektivní paměťovou adresu operandu pomocí informací uložených v registrech a/nebo konstantách obsažených v instrukci stroje nebo jinde.

V počítačovém programování jsou režimy adresování primárně zajímavé pro ty, kteří píší v jazycích sestavení, a pro autory kompilátorů . Související koncept najdete v ortogonální sadě instrukcí, která se zabývá schopností jakékoli instrukce použít jakýkoli režim adresování.

Upozornění

Všimněte si, že neexistuje žádný obecně uznávaný způsob pojmenování různých režimů adresování. Zejména různí autoři a výrobci počítačů mohou dát stejnému režimu adresování různá jména nebo různým režimům adresování stejná jména. Kromě toho může režim adresování, který je v jedné dané architektuře považován za jeden režim adresování, představovat funkci, která je v jiné architektuře pokryta dvěma nebo více režimy adresování. Například některé architektury počítačů s komplexními instrukčními sadami (CISC), jako je Digital Equipment Corporation (DEC) VAX , považují registry a doslovné nebo okamžité konstanty pouze za další režim adresování. Ostatní, jako je IBM System/360 a jeho nástupci a většina počítačů s omezeným počtem instrukčních sad (RISC), kódují tyto informace do instrukce. Poslední zmíněné stroje tedy mají tři odlišné instrukční kódy pro kopírování jednoho registru do druhého, kopírování doslovné konstanty do registru a kopírování obsahu paměťového místa do registru, zatímco VAX má pouze jednu instrukci „MOV“.

Termín „režim adresování“ sám podléhá různým výkladům: buď „režim výpočtu adresy paměti“ nebo „režim přístupu k operandu“. Podle prvního výkladu jsou instrukce, které nečtou z paměti nebo nezapisují do paměti (například „přidat doslovné do registru“), považovány za zařízení, které nemají „režim adresování“. Druhá interpretace umožňuje strojům, jako je VAX, které používají bity režimu operandu, aby umožnily registr nebo doslovný operand. Pouze první interpretace se vztahuje na pokyny jako „načíst efektivní adresu“.

Níže uvedené režimy adresování jsou rozděleny na adresování kódu a adresování dat. Většina počítačových architektur toto rozlišení zachovává, ale existují (nebo existovaly) některé architektury, které umožňují (téměř) použití všech režimů adresování v jakémkoli kontextu.

Níže uvedené pokyny jsou čistě reprezentativní pro ilustraci režimů adresování a nemusí nutně odrážet mnemotechnické pomůcky používané konkrétním počítačem.

Počet režimů adresování

Různé počítačové architektury se velmi liší v počtu režimů adresování, které poskytují v hardwaru. Eliminace složitých režimů adresování a používání pouze jednoho nebo několika jednodušších režimů adresování má určité výhody, přestože to vyžaduje několik dalších pokynů a možná i další registr. Ukázalo se mnohem snazší navrhovat propojené CPU, pokud jsou k dispozici pouze jednoduché režimy adresování.

Většina architektur RISC má pouze asi pět jednoduchých režimů adresování, zatímco architektury CISC, jako je DEC VAX, mají více než tucet režimů adresování, z nichž některé jsou poměrně komplikované. Architektura systému IBM System/360 měla pouze tři režimy adresování; pro System/390 bylo přidáno několik dalších .

Pokud existuje pouze několik režimů adresování, je konkrétní požadovaný režim adresování obvykle zakódován v kódu instrukce (např. IBM System/360 a následníci, většina RISC). Ale když existuje mnoho režimů adresování, v instrukci je často vyhrazeno konkrétní pole pro určení režimu adresování. DEC VAX povolil více operandů paměti pro téměř všechny instrukce, a proto si vyhradil prvních pár bitů každého specifikátoru operandu pro indikaci režimu adresování pro tento konkrétní operand. Udržování bitů specifikátoru režimu adresování odděleně od provozních bitů operačního kódu vytváří ortogonální sadu instrukcí .

I na počítači s mnoha režimy adresování měření skutečných programů naznačuje, že níže uvedené jednoduché režimy adresování představují přibližně 90% nebo více ze všech použitých režimů adresování. Protože většina takových měření je založena na kódu generovaném překladači z jazyků vysoké úrovně, odráží to do určité míry omezení používaných překladačů.

Užitečný vedlejší účinek

Některé architektury instrukčních sad, jako jsou Intel x86 a IBM/360 a její nástupci, mají instrukci adres efektivně načtenou. To provede výpočet efektivní adresy operandu, ale místo toho, aby působilo na toto místo v paměti, načte adresu, ke které by bylo přistupováno do registru. To může být užitečné při předávání adresy prvku pole podprogramu. Může to být také mírně záludný způsob, jak v jedné instrukci provést více výpočtů, než je obvyklé; například použití takové instrukce s režimem adresování „base+index+offset“ (podrobně níže) umožňuje přidat do jedné instrukce dva registry a konstantu.

Jednoduché režimy adresování kódu

Absolutní nebo přímé

   +----+------------------------------+
   |jump|           address            |
   +----+------------------------------+

   (Effective PC address = address)

Efektivní adresa pro absolutní adresu instrukce je samotný parametr adresy bez úprav.

Příbuzný s PC

   +----+------------------------------+
   |jump|           offset             |    jump relative
   +----+------------------------------+

   (Effective PC address = next instruction address + offset, offset may be negative)

Efektivní adresa pro adresu relativní instrukce pro PC je parametr offsetu přidaný k adrese další instrukce. Tento offset je obvykle podepsán, aby umožňoval odkaz na kód před i po instrukci.

To je zvláště užitečné ve spojení se skoky, protože typické skoky jsou instrukce v blízkosti (v jazyce na vysoké úrovni jsou většinou příkazy if nebo while přiměřeně krátké). Měření skutečných programů naznačuje, že 8 nebo 10 bitový offset je dostatečně velký na přibližně 90% podmíněných skoků (zhruba ± 128 nebo ± 512 bytů).

Další výhodou adresování relativního k počítači je, že kód může být nezávislý na poloze , tj. Lze jej načíst kamkoli do paměti, aniž by bylo nutné upravovat jakékoli adresy.

Některé verze tohoto režimu adresování mohou být podmíněné odkazem na dva registry ("skok, pokud reg1 = reg2"), jeden registr ("skok, pokud reg1 = 0") nebo žádné registry, implicitně odkazující na nějaký dříve nastavený bit ve stavovém registru . Viz také podmíněné provedení níže.

Zaregistrujte se nepřímo

   +-------+-----+
   |jumpVia| reg |
   +-------+-----+

   (Effective PC address = contents of register 'reg')

Efektivní adresa pro nepřímý pokyn Registrovat je adresa v uvedeném registru. Například (A7) pro přístup k obsahu adresního registru A7.

Účinkem je přenos kontroly na instrukci, jejíž adresa je v uvedeném registru.

Mnoho strojů RISC, stejně jako CISC IBM System/360 a následníci, mají pokyny pro volání podprogramu, které umísťují zpáteční adresu do adresního registru-pro návrat z tohoto podprogramového volání se používá režim nepřímého adresování registru.

Režimy sekvenčního adresování

Sekvenční provedení

   +------+
   | nop  |              execute the following instruction
   +------+

   (Effective PC address = next instruction address)

CPU po provedení sekvenční instrukce okamžitě provede následující instrukci.

Sekvenční spuštění není na některých počítačích považováno za režim adresování.

Většina instrukcí na většině architektur CPU jsou sekvenční instrukce. Protože většina instrukcí je sekvenční instrukce, návrháři CPU často přidávají funkce, které záměrně obětují výkon ostatním instrukcím - instrukcím větví - aby tyto sekvenční instrukce běžely rychleji.

Podmíněné větve načítají počítač s jedním ze 2 možných výsledků, v závislosti na podmínkách - většina architektur CPU používá nějaký jiný režim adresování pro větev „převzato“ a sekvenční spuštění pro větev „nepřijato“.

Mnoho funkcí v moderních CPU- předběžné načtení instrukcí a složitější potrubí , provádění mimo pořadí atd. -udržuje iluzi, že každá instrukce skončí dříve, než začne další, což dává stejné konečné výsledky, přestože se to interně neděje .

Každý „ základní blok “ takových sekvenčních instrukcí ukazuje jak časovou, tak prostorovou referenční lokalitu .

CPU, které nepoužívají sekvenční spouštění

CPU, které nepoužívají sekvenční spouštění s čítačem programů, jsou extrémně vzácné. V některých CPU každá instrukce vždy určuje adresu další instrukce. Takové CPU mají ukazatel instrukce, který uchovává zadanou adresu; nejedná se o programový čítač, protože neexistuje žádné ustanovení pro jeho zvýšení. Mezi takové CPU patří některé počítače s bicí pamětí , například IBM 650 , stroj SECD a RTX 32P.

Jiné výpočetní architektury jdou mnohem dále a pokoušejí se obejít úzké místo von Neumanna pomocí různých alternativ k programovému čítači .

Podmíněné provedení

Některé počítačové architektury mají podmíněné instrukce (například ARM , ale již ne pro všechny instrukce v 64bitovém režimu) nebo instrukce podmíněného načtení (například x86), což může v některých případech způsobit, že podmíněné větve nebudou nutné a zabrání se vypláchnutí kanálu instrukcí . K nastavení stavového kódu se používá instrukce, jako je „porovnat“ , a následné pokyny obsahují test na tento stavový kód, aby se zjistilo, zda jsou uposlechnuty nebo ignorovány.

Přeskočit

   +------+-----+-----+
   |skipEQ| reg1| reg2|      skip the next instruction if reg1=reg2
   +------+-----+-----+

   (Effective PC address = next instruction address + 1)

Přeskočení adresování lze považovat za speciální druh režimu adresování relativního pro PC s pevným offsetem „+1“. Stejně jako adresování relativní k PC mají některé CPU verze tohoto režimu adresování, které odkazují pouze na jeden registr („přeskočit, pokud reg1 = 0“) nebo žádné registry, implicitně odkazující na nějaký dříve nastavený bit ve stavovém registru . Jiné CPU mají verzi, která vybere konkrétní bit v konkrétním bajtu k testování („přeskočit, pokud bit 7 reg12 je 0“).

Na rozdíl od všech ostatních podmíněných větví instrukce „přeskočit“ nikdy nemusí vypláchnout kanál instrukcí , i když může být nutné způsobit ignorování další instrukce.

Jednoduché režimy adresování dat

Zaregistrujte se (nebo se zaregistrujte přímo)

   +------+-----+-----+-----+
   | mul  | reg1| reg2| reg3|      reg1 := reg2 * reg3;
   +------+-----+-----+-----+

Tento „režim adresování“ nemá efektivní adresu a na některých počítačích není považován za režim adresování.

V tomto případě jsou všechny operandy v registrech a výsledek je umístěn do registru.

Základna plus offset a variace

Někdy se tomu říká „základna plus výtlak“

   +------+-----+-----+----------------+
   | load | reg | base|     offset     |  reg := RAM[base + offset]
   +------+-----+-----+----------------+

   (Effective address = offset + contents of specified base register)

Offset je obvykle 16 bitové hodnoty (ačkoli 80386 rozšířila do 32 bitů).

Pokud je offset nula, stane se to příkladem nepřímého adresování registru ; efektivní adresa je pouze hodnota v základním registru.

Na mnoha počítačích RISC je registr 0 pevně nastaven na hodnotu nula. Pokud se jako základní registr použije registr 0, stane se to příkladem absolutního adresování . Lze však přistupovat pouze k malé části paměti (64 kilobajtů , pokud je offset 16 bitů).

16bitový offset se může zdát velmi malý v poměru k velikosti současných počítačových pamětí (proto jej 80386 rozšířil na 32bitový). Mohlo by to být horší: Sálové počítače IBM System/360 mají pouze nepodepsaný 12bitový offset. Platí však zásada lokality odkazu : v krátkém časovém období je většina datových položek, ke kterým chce mít program přístup, poměrně blízko sebe.

Tento režim adresování úzce souvisí s režimem indexovaného absolutního adresování.

Příklad 1 : V rámci podprogramu se programátor bude zajímat hlavně o parametry a lokální proměnné, které zřídka překročí 64 KB , na což stačí jeden základní registr ( ukazatel rámce ). Pokud je tato rutina třídní metodou v objektově orientovaném jazyce, je zapotřebí druhý základní registr, který ukazuje na atributy aktuálního objektu ( v některých jazycích vyšší úrovně toto nebo ).

Příklad 2 : Pokud základní registr obsahuje adresu složeného typu (záznam nebo struktura), lze pomocí offsetu vybrat pole z tohoto záznamu (většina záznamů/struktur má velikost menší než 32 kB).

Okamžité/doslovné

   +------+-----+-----+----------------+
   | add  | reg1| reg2|    constant    |    reg1 := reg2 + constant;
   +------+-----+-----+----------------+

Tento „režim adresování“ nemá efektivní adresu a na některých počítačích není považován za režim adresování.

Konstanta může být podepsaná nebo nepodepsaná. Například move.l #$FEEDABBA, D0přesunout okamžitou hexadecimální hodnotu „FEEDABBA“ do registru D0.

Namísto použití operandu z paměti je hodnota operandu držena v samotné instrukci. Na stroji DEC VAX mohly být doslovné velikosti operandů dlouhé 6, 8, 16 nebo 32 bitů.

Andrew Tanenbaum ukázal, že 98% všech konstant v programu by se vešlo do 13 bitů (viz filozofie designu RISC ).

Implicitní

   +-----------------+
   | clear carry bit |
   +-----------------+

   +-------------------+
   | clear Accumulator |
   +-------------------+

Implicitní režim adresování, nazývaný také implicitní režim adresování ( jazyk sestavení x86 ), výslovně neurčuje efektivní adresu pro zdroj ani cíl (nebo někdy pro oba).

Operační kód implikuje buď zdrojovou (pokud existuje), nebo efektivní adresu určení (nebo někdy obojí).

Implikované adresování bylo na starších počítačích zcela běžné (až do poloviny 70. let). Takové počítače měly obvykle pouze jeden registr, ve kterém bylo možné provádět aritmetiku - akumulátor. Takové stroje s akumulátory implicitně odkazují na tento akumulátor téměř v každé instrukci. Například operace <a: = b + c; > lze provést pomocí sekvence <load b; přidat c; uložit a; > - cíl (akumulátor) je obsažen v každé instrukci „načíst“ a „přidat“; zdroj (akumulátor) je obsažen v každé instrukci „store“.

Pozdější počítače obecně měly více než jeden obecný registr nebo umístění RAM, které mohlo být zdrojem nebo cílem nebo obojí pro aritmetiku-a proto počítače později potřebují nějaký jiný režim adresování, aby určily zdroj a cíl aritmetiky.

Mezi instrukcemi x86 někteří používají implicitní registry pro jeden z operandů nebo výsledků (násobení, dělení, počítání podmíněného skoku).

Mnoho počítačů (například x86 a AVR) má jeden speciální registr nazývaný ukazatel zásobníku, který se implicitně zvyšuje nebo snižuje při tlačení nebo vyskakování dat ze zásobníku, a efektivní zdrojová nebo cílová adresa je (implicitně) adresa uložená v ukazatel zásobníku.

Mnoho 32bitových počítačů (například 68000, ARM nebo PowerPC) má více než jeden registr, který lze použít jako ukazatel zásobníku-a proto použijte režim adresování „nepřímý automatický přírůstek registru“ k určení, který z těchto registrů by měl být použit při tlačení nebo vyskakování dat ze zásobníku.

Některé současné počítačové architektury (např. IBM/390 a Intel Pentium) obsahují některé pokyny s implicitními operandy, aby byla zachována zpětná kompatibilita s předchozími návrhy.

Na mnoha počítačích pokyny, které převracejí bit režimu uživatele/systému, bit umožňující přerušení atd. Implicitně specifikují speciální registr, který tyto bity uchovává. To zjednodušuje hardware potřebný k zachycení těchto instrukcí, aby byly splněny požadavky na virtualizaci Popek a Goldberg - v takovém systému logika pasti nemusí hledat žádný operand (nebo konečnou efektivní adresu), ale pouze operační kód .

Bylo navrženo několik CPU, kde je každý operand vždy implicitně uveden v každé instrukci - CPU s nulovým operandem .

Jiné režimy adresování kódu nebo dat

Absolutní/přímé

   +------+-----+--------------------------------------+
   | load | reg |         address                      |
   +------+-----+--------------------------------------+

   (Effective address = address as given in instruction)

To vyžaduje místo v instrukci pro poměrně velkou adresu. Často je k dispozici na počítačích CISC, které mají pokyny s proměnnou délkou, například x86 .

Některé stroje RISC mají speciální instrukci Load Upper Literal, která umístí 16 nebo 20bitovou konstantu do horní poloviny registru. To pak může být použito jako základní registr v režimu adresování se základnou plus offset, který dodává 16 nebo 12 bitů nižšího řádu. Tato kombinace umožňuje úplnou 32bitovou adresu.

Indexováno absolutně

   +------+-----+-----+--------------------------------+
   | load | reg |index|         address                |
   +------+-----+-----+--------------------------------+

   (Effective address = address + contents of specified index register)

To také vyžaduje místo v instrukci pro poměrně velkou adresu. Adresa může být začátkem pole nebo vektoru a index by mohl vybrat konkrétní požadovaný prvek pole. Procesor může škálovat indexový registr, aby umožňoval velikost každého prvku pole .

Všimněte si, že je to víceméně stejné jako v režimu adresování se základnou a offsetem, až na to, že offset je v tomto případě dostatečně velký na to, aby adresoval jakékoli umístění v paměti.

Příklad 1 : V rámci podprogramu může programátor definovat řetězec jako lokální konstantu nebo statickou proměnnou . Adresa řetězce je uložena v doslovné adrese v instrukci. Ofset - jaký znak řetězce použít při této iteraci smyčky - je uložen v rejstříku indexů.

Příklad 2 : Programátor může definovat několik velkých polí jako globální nebo jako proměnné třídy . Začátek pole je uložen na doslovnou adresu (možná upravenou v době načítání programu přemístěním zavaděče ) instrukce, která na něj odkazuje. Offset - kterou položku z pole použít při této iteraci smyčky - je uložen v rejstříku indexů. Pokyny ve smyčce často znovu používají stejný registr pro čítač smyček a offsety několika polí.

Základní plus index

   +------+-----+-----+-----+
   | load | reg | base|index|
   +------+-----+-----+-----+

   (Effective address = contents of specified base register + contents of specified index register)

Základní registr může obsahovat počáteční adresu pole nebo vektoru a index by mohl vybrat konkrétní požadovaný prvek pole. Procesor může škálovat indexový registr, aby umožňoval velikost každého prvku pole . Toho lze využít pro přístup k prvkům pole předaného jako parametr.

Základ plus index plus offset

   +------+-----+-----+-----+----------------+
   | load | reg | base|index|         offset |
   +------+-----+-----+-----+----------------+

   (Effective address = offset + contents of specified base register + contents of specified index register)

Základní registr by mohl obsahovat počáteční adresu pole nebo vektoru záznamů, index by mohl vybrat konkrétní požadovaný záznam a ofset by mohl vybrat pole v tomto záznamu. Procesor může škálovat indexový registr, aby umožňoval velikost každého prvku pole .

Zmenšen

   +------+-----+-----+-----+
   | load | reg | base|index|
   +------+-----+-----+-----+

   (Effective address = contents of specified base register + scaled contents of specified index register)

Základní registr by mohl obsahovat počáteční adresu pole nebo vektorové datové struktury a index by mohl obsahovat ofset jednoho konkrétního požadovaného prvku pole.

Tento režim adresování dynamicky škáluje hodnotu v rejstříku rejstříku, aby byla zohledněna velikost každého prvku pole, např. Pokud jsou prvky pole dvojitá přesnost s plovoucí desetinnou čárkou, která zabírá každý 8 bajtů, pak se hodnota v rejstříku vynásobí 8, než se používá se při výpočtu efektivní adresy. Faktor měřítka je obvykle omezen na mocninu dvou , takže lze použít spíše řazení než násobení.

Zaregistrujte se nepřímo

   +------+------+-----+
   | load | reg1 | base|
   +------+------+-----+
 
   (Effective address = contents of base register)

Několik počítačů to má jako odlišný režim adresování. Mnoho počítačů používá pouze základnu plus offset s hodnotou offsetu 0. Například (A7)

Zaregistrujte nepřímý automatický přírůstek

   +------+-----+-------+
   | load | reg | base  |
   +------+-----+-------+

   (Effective address = contents of base register)

Po určení efektivní adresy se hodnota v základním registru zvýší o velikost datové položky, ke které se má přistupovat. Například (A7)+ by přistupovalo k obsahu adresního registru A7, poté by zvýšilo ukazatel adresy A7 o 1 (obvykle 1 slovo). V rámci smyčky lze tento režim adresování použít k procházení všemi prvky pole nebo vektoru.

V jazycích na vysoké úrovni se často považuje za dobrý nápad, že funkce, které vracejí výsledek, by neměly mít vedlejší účinky (nedostatek vedlejších účinků značně usnadňuje porozumění a validaci programu). Tento režim adresování má vedlejší účinek v tom, že je změněn základní registr. Pokud následný přístup do paměti způsobí chybu (např. Porucha stránky, chyba sběrnice, chyba adresy) vedoucí k přerušení, restartování instrukce se stane mnohem problematičtějším, protože jeden nebo více registrů může být nutné nastavit zpět do stavu, ve kterém byly dříve instrukce původně začala.

Byly nejméně dvě počítačové architektury, které měly problémy s implementací s ohledem na obnovu z přerušení, když je použit tento režim adresování:

  • Motorola 68000 (adresa je uvedena ve 24 bitech). Může mít jeden nebo dva operandy registru autoincrement. 68010 + vyřešit problém tím, že šetří vnitřní stav procesoru na autobusových chyby nebo adresy.
  • DEC VAX. Může mít až 6 operandů automatického přírůstku registru. Každý přístup k operandu by mohl způsobit dvě chyby stránky (pokud by se operandy rozkročily na hranici stránky). Samotná instrukce může mít samozřejmě více než 50 bajtů a může se pohybovat i na hranici stránky!

Zaregistrujte autodekrement nepřímo

   +------+-----+-----+
   | load | reg | base|
   +------+-----+-----+

   (Effective address = new contents of base register)

Před určením efektivní adresy se hodnota v základním registru sníží o velikost datové položky, ke které se má přistupovat.

V rámci smyčky lze tento režim adresování použít pro krok zpět přes všechny prvky pole nebo vektoru. Zásobník lze implementovat pomocí tohoto režimu ve spojení s předchozím režimem adresování (autoincrement).

Viz diskuse o vedlejších účincích v režimu adresování s automatickým přírůstkem .

Nepřímá paměť

Kterýkoli z režimů adresování uvedených v tomto článku by mohl mít další bit pro indikaci nepřímého adresování, tj. Adresa vypočítaná pomocí nějakého režimu je ve skutečnosti adresa místa (obvykle úplné slovo ), které obsahuje skutečnou efektivní adresu.

Pro kód nebo data lze použít nepřímé adresování. Může to značně usnadnit implementaci ukazatelů , odkazů nebo úchytů a také usnadnit volání podprogramů, které nejsou jinak adresovatelné. Nepřímé adresování má za následek výkonnostní trest kvůli dodatečnému přístupu k paměti.

Některé rané minipočítače (např. DEC PDP-8 , Data General Nova ) měly jen několik registrů a pouze omezený rozsah adres (8 bitů). Proto bylo použití nepřímého adresování paměti téměř jediným způsobem, jak odkazovat na jakékoli významné množství paměti.

Příbuzný s PC

   +------+------+---------+----------------+
   | load | reg1 | base=PC |     offset     |
   +------+------+---------+----------------+

   reg1 := RAM[PC + offset]
   (Effective address = PC + offset)

Režim adresování relativní k počítači lze použít k načtení registru s hodnotou uloženou v paměti programu kousek od aktuální instrukce. Může to být viděno jako zvláštní případ adresovacího režimu „base plus offset“, který vybere jako „základní registr“ čítač programů (PC).

Existuje několik procesorů, které podporují odkazy na data související s počítačem. Mezi takové CPU patří:

MOS 6502 a její deriváty používá relativní adresování pro všechny instrukce větvení . Pouze tyto instrukce používaly tento režim, skoky používaly řadu dalších režimů adresování.

Architektura x86-64 a 64bitová architektura ARMv8-A mají režimy adresování relativní k počítači, v x86-64 nazývané „relativní vůči RIP“ a v ARMv8-A „doslovné“. Motorola 6809 také podporuje režim adresování PC-příbuzný.

Architektura PDP-11, architektura VAX a 32bitové architektury ARM podporují adresování relativní k počítači tím, že je počítač v souboru registru.

IBM z / Architecture obsahuje specifické instrukce např zatížení Relativní dlouhý, s PC-relativní adresování, je-li aktivní všeobecné pokyny-Extension Facility.

Když se použije tento režim adresování, kompilátor obvykle umístí konstanty do doslovného fondu bezprostředně před nebo bezprostředně po podprogram, který je používá, aby se zabránilo nechtěnému spuštění těchto konstant jako pokynů.

Tento režim adresování, který vždy načítá data z paměti nebo ukládá data do paměti a poté postupně propadá, aby provedl další instrukci (efektivní adresní body k datům), by neměl být zaměňován s „pobočkou relativní k počítači“, která data nenačítá z nebo ukládat data do paměti, ale místo toho se větví na jinou instrukci v daném offsetu (efektivní adresa ukazuje na spustitelnou instrukci).

Zastaralé režimy adresování

Zde uvedené režimy adresování byly použity v období 1950–1980, ale na většině současných počítačů již nejsou k dispozici. Tento seznam není v žádném případě úplný; čas od času bylo použito mnoho dalších zajímavých a zvláštních režimů adresování, např. absolutní-minus-logický-NEBO dvou nebo tří indexových registrů.

Víceúrovňová paměť nepřímá

Pokud je velikost slova větší než adresa, pak by slovo odkazované na adresování nepřímé z paměti mohlo mít samo nastavený nepřímý příznak, který by indikoval další paměťový nepřímý cyklus. Tento příznak se označuje jako indirection bit a výsledný ukazatel je tagovaný ukazatel , bit indirection označující, zda se jedná o přímý ukazatel nebo nepřímý ukazatel. Je třeba zajistit, aby řetězec nepřímých adres neodkazoval na sebe; pokud ano, při pokusu o vyřešení adresy lze získat nekonečnou smyčku .

IBM 1620 se údaje Všeobecné Nova , že HP 2100 series, a NAR 2 každá má paměť jako multi-level nepřímý, a mohl vstoupit do takové nekonečné výpočtu adresy smyčky. Režim nepřímého adresování paměti na Nova ovlivnil vynález nepřímého závitového kódu .

Počítač DEC PDP-10 s 18bitovými adresami a 36bitovými slovy umožňoval víceúrovňové nepřímé adresování s možností použití indexového registru také v každé fázi. Před dekódováním každého adresního slova byl dotazován systém prioritního přerušení. Smyčka nepřímé adresy by tedy nebránila provádění rutin služby zařízení, včetně jakéhokoli preemptivního obslužného programu časového rozvrhu plánovače víceúlohového plánovače. Instrukce opakování by byla považována za jakoukoli jinou úlohu vázanou na výpočet.

Registry mapované v paměti

Na některých počítačích byly registry považovány za zabírající prvních 8 nebo 16 slov paměti (např. ICL 1900 , DEC PDP-10). To znamenalo, že nebyla potřeba samostatná instrukce „přidat registr k registraci“ - bylo možné použít instrukci „přidat paměť k registraci“.

V případě raných modelů PDP-10, které neměly žádnou mezipaměť, těsná vnitřní smyčka načtená do prvních několika slov paměti (kde byly rychlé registry adresovatelné, pokud byly nainstalovány) běžela mnohem rychleji, než by měla v paměť magnetického jádra.

Pozdější modely řady DEC PDP-11 mapovaly registry na adresy ve vstupní/výstupní oblasti, ale toto bylo primárně určeno k umožnění vzdálené diagnostiky. 16bitové registry byly zmateně mapovány na po sobě jdoucí 8bitové bajtové adresy.

Nepřímá paměť a automatické zvyšování

Minipočítač DEC PDP-8 měl osm speciálních umístění (na adresách 8 až 15). Při přístupu prostřednictvím nepřímého adresování paměti se tato umístění po použití automaticky zvýší. Díky tomu bylo snadné procházet pamětí ve smyčce, aniž byste ke zpracování kroků museli používat jakékoli registry.

Data Všeobecné Nova minipočítač měl 16 speciálních paměťových míst na adresách 16 až 31. Při přístupu přes paměť nepřímé adresování, 16 až 23 by automaticky zvyšovat před použitím, a 24 až 31 by automaticky decrement před použitím.

Nulová stránka

Dat General Nova , Motorola 6800 rodina, a MOS Technology 6502 Rodina procesorů jen velmi málo vnitřní registry. Aritmetické a logické instrukce byly většinou prováděny proti hodnotám v paměti, na rozdíl od vnitřních registrů. V důsledku toho mnoho instrukcí vyžadovalo dvoubajtové (16bitové) umístění do paměti. Vzhledem k tomu, že operační kódy na těchto procesorech byly pouze jeden bajt (8 bitů), mohly adresy paměti tvořit významnou část velikosti kódu.

Návrháři těchto procesorů zahrnovali částečnou nápravu známou jako adresování „nulové stránky“. K počátečním 256 bajtům paměti ($ 0000-$ 00FF; alias stránka „0“) bylo možné přistupovat pomocí jednobajtové absolutní nebo indexované adresy paměti. Tím se zkrátila doba provádění instrukce o jeden hodinový cyklus a délka instrukce o jeden bajt. Ukládáním často používaných dat v této oblasti by mohly být programy menší a rychlejší.

V důsledku toho byla nulová stránka použita podobně jako soubor registru. V mnoha systémech to však vedlo k vysokému využití oblasti paměti s nulovou stránkou operačním systémem a uživatelskými programy, což omezovalo jeho použití, protože volné místo bylo omezené.

Přímá stránka

Režim adresy nulové stránky byl vylepšen v několika pozdních modelech 8bitových procesorů, včetně WDC 65816 , CSG 65CE02 a Motorola 6809 . Nový režim, známý jako adresování „přímé stránky“, přidal možnost přesunout 256bitové okno paměti nulové stránky ze začátku paměti (adresa offsetu $ 0000) do nového umístění v rámci prvních 64 kB paměti.

CSG 65CE02 umožnil přesunutí přímé stránky na libovolnou hranici 256 bajtů v rámci prvních 64 kB paměti uložením 8bitové hodnoty offsetu do nového registru základní stránky (B). To samé by mohla udělat Motorola 6809 s registrem přímé stránky (DP). WDC 65816 šel ještě o krok dále a umožnil přesunout přímou stránku na jakékoli místo v rámci prvních 64 kB paměti uložením 16bitové offsetové hodnoty do nového přímého (D) registru.

Výsledkem bylo, že větší počet programů bylo schopno využívat vylepšený režim přímého adresování stránky oproti starším procesorům, které zahrnovaly pouze režim adresování nulové stránky.

Škálovaný index s kontrolou mezí

Je to podobné jako při zmenšeném adresování indexu, kromě toho, že instrukce má dva další operandy (obvykle konstanty) a hardware kontroluje, zda je hodnota indexu mezi těmito hranicemi.

Další variace používá vektorové deskriptory k udržení hranic; díky tomu je snadné implementovat dynamicky přidělená pole a stále mít úplnou kontrolu mezí.

Nepřímo do bitového pole ve slově

Některé počítače měly speciální režimy nepřímého adresování pro podpolí ve slovech.

GE / Honeywell série 600 postava řeší nepřímou slovo uvedeno buď 6-bit nebo 9-bitové znakové pole v rámci své 36-bitového slova.

DEC PDP-10 , také 36bitový, měl speciální instrukce, které umožňovaly, aby paměť byla považována za posloupnost bitových polí pevné velikosti nebo bajtů libovolné velikosti od 1 do 36 bitů. Jednoslovný popisovač sekvence v paměti, nazývaný „ukazatel bytu“, obsahoval aktuální adresu slova v sekvenci, bitovou pozici ve slově a velikost každého bajtu.

Existovaly instrukce pro načtení a uložení bytů prostřednictvím tohoto deskriptoru a pro zvýšení deskriptoru tak, aby ukazoval na další byte (bajty nebyly rozděleny přes hranice slov). Většina softwaru DEC používala pět 7bitových bytů na slovo (prosté znaky ASCII), přičemž jeden bit na slovo nebyl použit. Implementace jazyka C musely použít čtyři 9bitové bajty na slovo, protože funkce „malloc“ v jazyce C předpokládá, že velikost int je několikanásobkem velikosti znaku ; skutečný násobek je určen velikostí operátora času kompilace závislého na systému .

Index další instrukce

Elliott 503 je Elliott 803 , a Apollo Guidance Computer používat pouze absolutní adresování, a neměli žádné indexové registry. Nepřímé skoky neboli skoky přes registry tedy nebyly v instrukční sadě podporovány. Místo toho by mohlo být instruováno přidat obsah aktuálního paměťového slova do další instrukce . Přidání malé hodnoty do další prováděné instrukce by mohlo například změnit a JUMP 0na a JUMP 20, čímž se vytvoří efekt indexovaného skoku. Všimněte si, že instrukce je upravována za běhu a zůstává v paměti beze změny, tj. Nejedná se o kód , který by se sám upravoval . Pokud byla hodnota přidávaná do další instrukce dostatečně velká, mohla by změnit operační kód dané instrukce i adresu nebo místo ní.

Glosář

Nepřímý
Data odkazovaná prostřednictvím ukazatele nebo adresy .
Bezprostřední
Data vložená přímo do seznamu instrukcí nebo příkazů.
Index
Dynamický posun, obvykle uložený v rejstříku rejstříku , případně zmenšený podle velikosti objektu.
Ofset
Okamžitá přidaná hodnota k adrese; například odpovídající přístup struktura pole v C programovací jazyk .
Relativní
Adresa vytvořená relativně k jiné adrese.
Přírůstek příspěvku
Krokování použitých dat adresy, podobně jako *p++v programovacím jazyce C , používané pro operace pop pop .
Před snížením
Snížení adresy před použitím, podobně jako *--pv programovacím jazyce C , používané pro operace odesílání zásobníku .

Viz také

Reference

externí odkazy