Zásobník (LiFo) Vkládaná položka Vrchol zásobníku Vyjímaná položka Dno zásobníku Fronta (FiFo) Vkládaná položka Vyjímaná 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 Vrchol SPH SPL SP Pro práci.
Download ReportTranscript Zásobník (LiFo) Vkládaná položka Vrchol zásobníku Vyjímaná položka Dno zásobníku Fronta (FiFo) Vkládaná položka Vyjímaná 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 Vrchol SPH SPL SP Pro práci.
Zásobník (LiFo) Vkládaná položka Vrchol zásobníku Vyjímaná položka Dno zásobníku Fronta (FiFo) Vkládaná položka Vyjímaná 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 Vrchol SPH SPL SP 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 Inicializací obsahu SP se zásobník umístí do paměti 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 push A push Rn Instrukce zvýší obsah registru SP o jedna a uloží obsah operandu X do paměti, na adresu, která je hodnotou registru SP. push PSW pop X pop A pop Rn pop PSW Instrukce zkopíruje byte z paměti na adrese, která je obsahem registru SP do operandu X, a sníží obsah registru SP o jedna. 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 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. ret ret Instrukce odebere ze zásobníku (jako pop) nejprve vyšší, pak nižší byte adresy instrukce, které předá řízení. 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 Hlavní program ret call call ret ret 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í Př.: Pískání LOOP: 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 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říklady na podprogramy Př.: Blikání Př.: Blikání LOOP: LOOP: mov A, #0 out 12, A call W mov A, #1 out 12, A call W jmp LOOP W: W1: mov R1, #0 mov R0, #0 djnz R0, $ djnz R1, W1 ret W1: W2: mov A, #0 out 12, A mov R1, #0 mov R0, #0 djnz R0, $ djnz R1, W1 mov A, #1 out 12, A mov R1, #0 mov R0, #0 djnz R0, $ djnz R1, W2 jmp LOOP Příklad podprogramu Př.: Podprogram-Displej DISPL: a f DISEND: cjne R7, #0, D1 mov A, #00111111B jmp DISEND cjne R7, #1, D2 mov A, #00000110B jmp DISEND cjne R7, #2, D3 mov A, #01011011B jmp DISEND cjne R7, #3, D4 mov A, #01001111B jmp DISEND cjne R7, #4, D5 mov A, #01100100B jmp DISEND cjne R7, #5, D6 mov A, #01101101B jmp DISEND cjne R7, #6, D7 mov A, #01111101B jmp DISEND cjne R7, #7, D8 mov A, #00000111B jmp DISEND cjne R7, #8, D9 mov A, #01111111B jmp DISEND cjne R7, #9, ERR mov A, #01101111B out 12H, A ERR: ret D1: b D2: g e Mikropočítač P12.0 P12.1 P12.2 P12.3 P12.4 P12.4 P12.6 P12.7 D3: c d h D4: D5: D6: D7: D8: D9: Instrukční sada Instrukce přesunu dat Instrukce vstupu a výstupu mov X, Y in A, Adresa8 Logické instrukce cpl A Instrukce rotací rr A rrc A Aritmetické instrukce inc X dec X anl A, X add A, X Instrukce skoků Podprogramy Prázdná instrukce orl A, X rl A addc A, X jmp Adresa16 cjne A,#data8,Adresa16 Práce se zásobníkem out Adresa8, A rlc A subb A, X djnz Rn,Adresa16 cjne Rn,#data8,Adresa16 jz Adresa16 jnz Adresa16 jc Adresa16 jnc Adresa16 push X pop X call Adresa16 nop xrl A, X ret Přerušení Podnět pro přerušení přichází většinou z prostřední mimo procesor Přeruší se právě vykonávaný program … Mikropočítač … a začne se provádět připravený podprogram Po skončení podprogramu procesor pokračuje ve vykonávání přerušeného programu Podprogram pro obsluhu přerušení není spouštěn instrukcí call. Je aktivován HW prostředky (řadič přerušení, procesor, …) 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. Příklad na přerušení Generátor Impulsů (0.01s) Přerušení Mikropočítač Př.: Přerušení 0.01s IntT1: push A mov A, 0AAh jz IT1 dec A mov 0AAh, A IT1_1: pop A ret 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í. Ve složitějších aplikacích je možno podobných ČASOVAČŮ zřídit mnoho (každý na jiné adrese).