Blog:Programovanie v assembleri i8080 pre PMD 85 (6)
Z PMD 85 Infoserver
Obsah |
Inštrukčná sada mikroprocesora i8080 (pokračovanie)
Inštrukcie pre prácu so zásobníkom
Zásobník (stack) je údajová štruktúra typu LIFO (Last In First Out), čo znamená, že položka, ktorá bola vložená do zásobníka naposledy sa bude vyberať ako prvá. Pri zásobníku sa hovorí o vrchole zásobníka, alebo položke na vrchole zásobníka. Na túto položku ukazuje ukazateľ zásobníka, v našom prípade je to register SP - Stack Pointer.
Nasledujúca skupina inštrukcií umožňuje ukladať a vyberať 16 bitové položky do/z zásobníka, meniť hodnotu na vrchole zásobníka a nastavovať adresu zásobníka. Ako už bolo spomenuté skôr, register SP obsahuje adresu vrcholu zásobníka. Pri vložení údaja do zásobníka sa jeho adresa zníži o 2 a pri vyberaní údaja zo zásobníka sa jeho adresa naopak zvýši o 2. Pri nastavovaní adresy zásobníka sa teda táto adresa nastavuje za koniec oblasti určenej pre zásobník.
Pri ukladaní údajov na zásobník je potrebné byť veľmi obozretný, hlavne v prípade podprogramov. Keďže návrat z podprogramu je vlastne výber jednej položky z vrcholu zásobníka, stav (adresa) zásobníka pred návratom z podprogramu musí byť rovnaký, ako pri vstupe do podprogramu. Najčastejším zdrojom nepochopiteľného správania programu je prípad, kedy sa v podprograme uložia na zásobník nejaké údaje, ale po rôznom vetvení sa na niektorom mieste robí návrat z podprogramu bez výberu alebo s neúplným výberom hodnôt na zásobníku (ošetrenie/vyrovnanie zásobníka) a tak sa návrat urobí "niekam inam". Program potom nepochopiteľne niekedy funguje a niekedy nie. Údaje na zásobníku sú proste 16 bitové čísla, nie je nijako rozlíšené, či sa jedná o vloženú hodnotu pomocou inštrukcie push rp, alebo je to návratová adresa, ktorá sa tam vložila po vykonaní inštrukcie volania podprogramu call NN, či rst N.
Okrem ďalej popísaných inštrukcií už boli v predošlých kapitolách uvedené inštrukcie, ktoré so zásobníkom majú súvis.
- LXI sp,NN - nastavenie adresy zásobníka priamou hodnotou
- INX sp - inkrementácia adresy zásobníka
- DCX sp - dekrementácia adresy zásobníka
- DAD sp - pripočítanie adresy zásobníka k registru HL
- CALL NN, Cc NN, rst N - volanie podprogramu
- RET, Rc - návrat z podprogramu
PUSH rp (Push into Stack)
Operácia: SP <-- SP - 2 : (SP) <-- rp
Príznaky: žiadne
Inštrukcia PUSH zníži adresu zásobníka SP o 2 a na túto adresu (nový vrchol zásobníka) uloží jednu položku (2 byty) a teda hodnotu registrového páru rp.
Uloženie údaja na zásobník (1 byte / 11T) | |||
---|---|---|---|
push b | push d | push h | push psw |
POP rp (Pop from Stack)
Operácia: rp <-- (SP) : SP <-- SP + 2
Príznaky: žiadne; v prípade PSW všetky
Inštrukcia POP vyberie zo zásobníka jednu položku (2 byty), ktorú vloží do registrového páru rp a zvýši adresu zásobníka SP o 2. V prípade registrového páru PSW (registre A a F) sa samozrejme môžu ovplyvniť/ovplyvnia všetky príznaky. Zároveň, bez ohľadu na hodnotu daného bytu v pamäti, zostanú bity F1=1, F3=0 a F5=0.
Výber zo zásobníka (1 byty / 10T) | ||||||
---|---|---|---|---|---|---|
pop b | pop d | pop h | pop psw |
XTHL (Exchange stack top with HL)
Operácia: (SP) <--> HL
Príznaky: žiadne
Inštrukcia XTHL zamení hodnotu na vrchole zásobníka s hodnotou registra HL. To znamená, že hodnota, ktorá bola na vrchole zásobníka bude v HL a hodnota, ktorá bola v HL bude na vrchole zásobníka.
Zámena hodnoty na vrchole zásobníka s HL (1 byte / 18T) | |
---|---|
xthl |
SPHL (Move HL to SP)
Operácia: SP <-- HL
Príznaky: žiadne
Inštrukcia SPHL nastaví adresu zásobníka SP na hodnotu registra HL.
Nastavenie adresy zásobníka (1 byte / 5T) | ||||||
---|---|---|---|---|---|---|
sphl |
Inštrukcie vstupu a výstupu
Mikroprocesor i8080 môže komunikovať s okolitými perifériami prostredníctvom vstupno/výstupných portov, ktorých môže byť 256 vstupných a 256 výstupných. Na PMD 85 je obsadenie vstupno/výstupných portov uvedené v tejto tabuľke.
IN p (Input from port)
Operácia: A <-- (p)
Príznaky: žiadne
Inštrukcia IN prečíta hodnotu z portu s adresou p do akumulátora A.
Vstup z portu (1 byte / 10T) | ||||||
---|---|---|---|---|---|---|
in p |
OUT p (Output to port)
Operácia: (p) <-- A
Príznaky: žiadne
Inštrukcia OUT zapíše na port p hodnotu z akumulátora A.
Výstup na port (1 byte / 10T) | ||||||
---|---|---|---|---|---|---|
out p |
Inštrukcie riadenia prerušenia
Prerušenie je proces, kedy je vykonávanie hlavného programu prerušené nejakou vonkajšou udalosťou a riadenie je predané na obsluhu prerušenia. K i8080 sa požíval radič prerušenia i3214, ktorý po akceptovaní prerušenia od jedného z ôsmych zdrojov prerušení vnútil na dátovú zbernicu operačný kód príslušnej jednobytovej inštrukcie RST N, čím sa vyvolal príslušný podprogram pre obsluhu prerušenia. V PMD 85 nie je radič prioritného prerušenia použitý a budič zbernice i8228 napevno poskytuje iba jednu úroveň prerušenia RST 7 - obslužná rutina musí byť na adrese 0038h.
Niekedy nie je vhodné, aby bol hlavný program "vyrušovaný" pri svojom vykonávaní a preto je možné prerušenie zakázať alebo povoliť. Ak je prichádzajúce prerušenie akceptované, pred skokom na adresu obsluhy prerušenia sa prerušenie automaticky zakáže. V rutine obsluhy prerušenia je potrebné odpamätať všetky registre, ktoré bude rutina používať a pred ukončením obsluhy prerušenia je potrebné obnoviť všetky používané registre a prerušenie opäť povoliť.
EI (Enable interrupts)
Operácia: IFF <-- 1
Príznaky: IFF
Inštrukcia EI nastaví interný príznak IFF (Interrupt Flip/Flop flag) na 1, čím sa prerušenie povolí. Ku skutočnému povoleniu dôjde až po vykonaní inštrukcie nasledujúcej za inštrukciou EI.
Povolenie prerušenia (1 byte / 4T) | ||||||
---|---|---|---|---|---|---|
ei |
DI (Disable interrupts)
Operácia: IFF <-- 0
Príznaky: IFF
Inštrukcia DI vynuluje interný príznak IFF, čím sa prerušenie zakáže. Prerušenie sa zakáže ihneď po vykonaní inštrukcie DI.
Zakázanie prerušenia (1 byte / 4T) | ||||||
---|---|---|---|---|---|---|
di |
HLT (Halt)
Operácia: -
Príznaky: žiadne
Inštrukcia HLT spôsobí zastavenie procesora a ten zostáva v stave Halt, kým nepríde prerušenie alebo sa neprevedie Reset mikroprocesora. Ak je prerušenie zakázané, stav Halt ukončí iba Reset.
Čakanie na prerušenie (1 byte / 7T) | ||||||
---|---|---|---|---|---|---|
hlt |
Prázdna inštrukcia
Je to neuveriteľné, ale mikroprocesor má aj inštrukciu, ktorá nič nerobí... A vlastne nie je jediná. Ak si spomeniete na inštrukcie MOV, kde je zdrojový aj cieľový register rovnaký, tak sa jedná tiež o inštrukcie, ktoré prakticky nič neurobia, ale trvajú 5T a môžu sa využiť na časové zdržania.
NOP (No operation)
Operácia: -
Príznaky: žiadne
Inštrukcia NOP nerobí nič a je vhodná na vkladanie malých časových zdržaní do kódu - jej vykonanie trvá 4T.
Bez operácie (1 byte / 4T) | ||||||
---|---|---|---|---|---|---|
nop |
Tabuľka vplyvu inštrukcií na príznaky
V nasledujúcej tabuľke je zosumarizovaný zoznam inštrukcií, ktoré ovplyvňujú príznaky (podmienky, za akých sú príznaky nastavené).
Vysvetlivky:
- A - akumulátor (pred vykonaním operácie)
- OP - operand (pred vykonaním operácie)
- V - výsledok (po vykonaní operácie)
- - - príznak sa nezmení
- ! - príznak je nastavený podľa výsledku
- 0 - príznak je vynulovaný
- 1 - príznak je nastavený
Inštrukcia | Sign | Zero | Parity | Carry | Auxilliary Carry | Poznámka |
---|---|---|---|---|---|---|
add r, add m, adi N | V7=1 | V=0 | ! | V>255 | (A3=1 a OP3=1) alebo (A3=1 a V3=0) alebo (OP3=1 a V3=0) | Aritmetické inštrukcie |
adc r, adc m, aci N | V7=1 | V=0 | ! | V>255 | ||
sub r, sub m, sui N | V7=1 | V=0 | ! | A<OP | (A3=1 a OP3=0) alebo (A3=1 a V3=0) alebo (OP3=0 a V3=0) | |
sbb r, sbb m, sbi N | V7=1 | V=0 | ! | A<OP+CY | ||
cmp r, cmp m, cpi N | V7=1 | A=OP | ! | A<OP | ||
ana r, ana m, ani N | V7=1 | V=0 | ! | 0 | A3=1 alebo OP3=1 | Logické inštrukcie |
ora r, ora m, ori N | V7=1 | V=0 | ! | 0 | 0 | |
xra r, xra m, xri N | V7=1 | V=0 | ! | 0 | 0 | |
inr r, inr m | V7=1 | V=0 | ! | - | V3-0=0 | Inkrement |
dcr r, dcr m | V7=1 | V=0 | ! | - | A3-0>0 | Dekrement |
dad rp | - | - | - | V>65535 | - | 16 bitové sčítanie |
rlc, ral | - | - | - | A7=1 | - | Rotácie |
rrc, rar | - | - | - | A0=1 | - | |
stc | - | - | - | 1 | - | Nastavenie CY |
cmc | - | - | - | not CY | - | Prevrátenie CY |
daa | V7=1 | V=0 | ! | ! (*) | ! (*) | Desiatková korekcia |
(*) Viď aj popis inštrukcie DAA.
<< Inštrukčná sada mikroprocesora - Inštrukcie skokov Príprava projektu a nástrojov na editáciu zdrojového textu a jeho kompilovanie >>