120 likes | 269 Views
Zásobník (LiFo). Vkládaná položka. Vyjímaná položka. Vrchol zásobníku. Dno zásobníku. Fronta (FiFo). Vyjímaná položka. Vkládaná položka. Konec fronty. Čelo fronty. Implementace zásobníku. 16-ti bitový registr SP (Stack Pointer) obsahuje aktuální adresu vrcholu zásobníku.
E N D
Zásobník (LiFo) Vkládaná položka Vyjímaná položka Vrchol zásobníku Dno zásobníku Fronta (FiFo) Vyjímaná položka Vkládaná položka Konec fronty Čelo fronty
Implementace zásobníku 16-ti bitový registr SP (Stack Pointer) obsahuje aktuální adresu vrcholu zásobníku Zásobník je umístěn v paměti Dno Pro práci se zásobníkem jsou speciální instrukce, které upravují hodnotu SP Nebývá účelné s oblastí zásobníku pracovat i jiným způsobem Vrchol SPH SPL Inicializací obsahu SP se zásobník umístí do paměti SP Další manipulace s SP nebývá účelná a může být nebezpečná Dno zásobníku má v paměti pevnou pozici Vrchol NE !
Instrukce procesoru pro práci se zásobníkem push X Instrukce zvýší obsah registru SP o jedna a uloží obsah operandu X do paměti, na adresu, která je hodnotou registru SP. push A push Rn push PSW pop X Instrukce zkopíruje byte z paměti na adrese, která je obsahem registru SP do operandu X, a sníží obsah registru SP o jedna. pop A pop Rn pop PSW
Podprogramy Podobně jako při skoku: voláním podprogramu se předává řízení instrukci na jiném místě v programu Na rozdíl od skoku: předpokládá se návrat do místa, odkud se řízení předávalo call Adresa16 call Instrukce uloží do zásobníku (jako push) nejprve nižší, pak vyšší byte adresy té instrukce, která následuje na za instrukcí call. Potom se provede skok na Adresa16. call ret Instrukce odebere ze zásobníku (jako pop) nejprve vyšší, pak nižší byte adresy instrukce, které předá řízení. ret
Podprogramy Každým zavoláním podprogramu se velikost zásobníku zvětší o dva Byty (uloží se návratová adresa) Každým návratem z podprogramu se velikost zásobníku zmenší o dva Byty (odebere se návratová adresa) call call ret call call ret ret Hlavní program Podprogram úroveň 1 Podprogram úroveň 2 Podprogram úroveň 3
Podprogramy Počet provedených instrukcí pop, by měl být stejný jako počet provedených instrukcí push Počet provedených instrukcí call, by měl být stejný jako počet provedených instrukci ret Uvnitř podprogramu nepoužívat instrukce skoku s cílem, mimo uvažovaný podprogram Vně podprogramu nepoužívat instrukce skoku s cílem uvnitř uvažovaného podprogramu
Příklady na podprogramy Př.: Pískání LOOP: mov A, #1 out 12, A mov R0, #0 djnz R0, $ mov A, #0 out 12, A mov R0, #0 djnz R0, $ jmp LOOP Př.: Pískání LOOP: mov A, #1 out 12, A call WAIT mov A, #0 out 12, A call WAIT jmp LOOP WAIT: mov R0, #0 djnz R0, $ ret
Příklady na podprogramy Př.: Blikání LOOP: mov A, #0 out 12, A mov R1, #0 W1: mov R0, #0 djnz R0, $ djnz R1, W1 mov A, #1 out 12, A mov R1, #0 W2: mov R0, #0 djnz R0, $ djnz R1, W2 jmp LOOP Př.: Blikání LOOP: mov A, #0 out 12, A call W mov A, #1 out 12, A call W jmp LOOP W: mov R1, #0 W1: mov R0, #0 djnz R0, $ djnz R1, W1 ret
Příklad podprogramu Př.: Podprogram-Displej DISPL: cjne R7, #0, D1 mov A, #00111111B jmp DISEND D1: cjne R7, #1, D2 mov A, #00000110B jmp DISEND D2: cjne R7, #2, D3 mov A, #01011011B jmp DISEND D3: cjne R7, #3, D4 mov A, #01001111B jmp DISEND D4: cjne R7, #4, D5 mov A, #01100100B jmp DISEND D5: cjne R7, #5, D6 mov A, #01101101B jmp DISEND D6: cjne R7, #6, D7 mov A, #01111101B jmp DISEND D7: cjne R7, #7, D8 mov A, #00000111B jmp DISEND D8: cjne R7, #8, D9 mov A, #01111111B jmp DISEND D9: cjne R7, #9, ERR mov A, #01101111B DISEND: out 12H, A ERR: ret Mikro- počítač a f b g e c h d P12.0 P12.1 P12.2 P12.3 P12.4 P12.4 P12.6 P12.7
Instrukční sada Instrukce přesunu dat mov X, Y Instrukce vstupu a výstupu in A, Adresa8 out Adresa8, A Logické instrukce cpl A anl A, X orl A, X xrl A, X Instrukce rotací rr A rrc A rl A rlc A Aritmetické instrukce inc X dec X add A, X addc A, X subb A, X Instrukce skoků jmp Adresa16 djnzRn,Adresa16 cjne A,#data8,Adresa16 cjne Rn,#data8,Adresa16 jz Adresa16 jnz Adresa16 jc Adresa16 jnc Adresa16 Práce se zásobníkem push X pop X Podprogramy call Adresa16 ret Prázdná instrukce nop
Přerušení Podnět pro přerušení přichází většinou z prostřední mimo procesor Podprogram pro obsluhu přerušení není spouštěn instrukcí call. Je aktivo- ván HW prostředky (řadič přerušení, procesor, …) Mikro- počítač Přeruší se právě vykonávaný program … … a začne se provádět připravený podprogram Při obsluze přerušení je ukládána do zásobníku návratová adresa, podprogram pro přerušení končí instrukcí ret. Po skončení podprogramu procesor pokračuje ve vykonávání přerušeného programu
Příklad na přerušení Generátor Impulsů (0.01s) Mikro- počítač Přerušení Dokud je obsah proměnné na adrese 0AAh větší než 0, je periodicky v taktu 0.01s snižován o jedničku. Hlavní program a ostatní podprogramy mohou (ale nemusí) tuto funkci použít pro řešení úloh Časování. Př.: Přerušení 0.01s IntT1: push A mov A, 0AAh jz IT1 dec A mov 0AAh, A IT1_1: pop A ret Ve složitějších aplikacích je možno podobných ČASOVAČŮ zřídit mnoho (každý na jiné adrese).