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 Report

Transcript 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).