Instrukce 8080 – adresní módy a registry

Jak instrukce ví, kde má vzít data, se kterými pracuje?

Některé instrukce (jako už zmíněný NOP) nevyžadují žádné parametry a nepracují s žádnými daty. Tam je to jasné. Ovšem většina instrukcí něco dělá, to znamená, že potřebuje odněkud vzít nějaké údaje, někam je uložit atd. Procesor 8080 má čtyři různé způsoby, jak říct, kde se data nacházejí.

Přímý operand

Tímto způsobem zapíšeme přímo hodnotu do kódu a procesor ji použije. S přímým operandem pracuje např. instrukce MVI, kterou jsme si ukázali v minulé kapitole, Součástí instrukce je přímo hodnota, která je použita.

Přímé adresování

Je podobné předchozímu. I v tomto případě je součástí instrukce hodnota, která ale není použita tak, jak je, ale je brána jako adresa (v paměti nebo vstupně-výstupní brány). Například instrukce „LDA 554Ah“ používá právě tento typ adresování. Procesor udělá to, že hodnotu 554Ah vezme jako adresu místa v paměti, přečte z něj jeden bajt a ten uloží do registru A.

Adresování registrem

Součástí instrukce je jméno registru, registrového páru nebo dvojice registrů, se kterými se operace provádí.

Nepřímé adresování registrem

Instrukce bere hodnotu v dvojici registrů (BC, DE, HL) nebo v registru SP jako adresu do paměti. Pracuje pak s obsahem na této adrese.

Některé instrukce pracují s tzv. „implicitním operandem“, což znamená, že operand (jeden z operandů) je daný už samotnou instrukcí. Například zmíněná instrukce ADD používá dva operandy – jeden je vždy A a druhý je určen parametrem.

Registry

U osmibitových instrukcí můžeme použít libovolný osmibitový registr – tedy A (akumulátor), B, C, D, E, H, L a M.

Moment! Registr M? Nikde jsem se o něm nezmínil… Není to nějaký renonc?

Není. „Registr M“ (memory) je ve skutečnosti buňka v paměti na adrese, která je uložena v registrech H a L. Pokud je v registru H hodnota 12h a v registru L hodnota 34h, bude instrukce, která pracuje s „registrem M“, pracovat ve skutečnosti s obsahem paměti na adrese 1234h. Instrukce ADD M přičte k obsahu registru A hodnotu z paměti na adrese 1234h.

Všimněte si, že nelze přímo přistupovat k registru F. Ono to většinou není k ničemu dobré, ale kdybyste opravdu potřebovali znát jeho hodnotu, dá se to obejít takovým trikem, který si popíšeme později.

Pokud instrukce pracuje s šestnáctibitovou hodnotou, využívá šestnáctibitový registr SP nebo dvojice registrů B, D, H. „Dvojregistr“ B  jsou vlastně registry B a C, v B je vyšší bajt, v C nižší. Obdobně pro D a H. Instrukce pro práci se zásobníkem používají „šestnáctibitový registr“ PSW, což je ve skutečnosti dvojice registrů A a F (A vyšší byte, F nižší).

Malý Indián

Procesory Intel, Zilog Z80 i 6502 používají zápis vícebytových čísel ve formátu „Little Endian“. Znamená to, že na nižší adrese je méně významná část čísla. Příklad: Na adresu 0100h uložíme naši obligátní hodnotu 1234h. Paměť je organizovaná po bajtech, hodnota je dvoubajtová (16 bitů), jak to tedy uložit? Použijeme dvě buňky paměti, 0100h a 0101h. Na tu nižší přijde nižší část čísla (34h), na tu vyšší zase vyšší část (12h). V paměti to tedy bude vypadat nějak takto:

0100h: 34h
0101h: 12h

Některé procesory (z těch známějších především procesory od Motoroly) používají opačný způsob („Big Endian“), kdy se části čísla zapisují do paměti od nejvýznamnějšího bajtu.

Líbil se vám článek? Podpořte autora na Patreonu
Příspěvek byl publikován v rubrice 8080. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *