150 likes | 280 Views
Instrukce procesoru pro skoky v programu (JMP, JZ, JNZ, JC, JNC). Instrukce zajistí, že jako další se bude provádět instrukce na uvedené adrese. Instrukce nepodmíněného skoku. jmp Adresa16.
E N D
Instrukce procesoru pro skoky v programu (JMP, JZ, JNZ, JC, JNC) Instrukce zajistí, že jako další se bude provádět instrukce na uvedené adrese. Instrukce nepodmíněného skoku. jmp Adresa16 Místo uvedení číselné hodnoty adresy se doporučuje používat adresu symbolickou (návěští). Návěští je definováno uvedením před vybranou instrukcí v programu (návěští je od instrukce odděleno dvojtečkou). Návěští může být definováno v jednom programu nejvýše jednou. Př.: dynamický STOP mov A, #55H LOOP: jmp LOOP Př.: nekonečná smyčka mov A, #0 LOOP: inc A out 0AAH jmp LOOP Př.: dynamický STOP mov A, #55H jmp $
Instrukce procesoru pro skoky v programu (JMP, JZ, JNZ, JC, JNC) Instrukce podmíněných skoků: jz Adresa16 Je-li Z=1 chová se instrukce jako jmp, jinak jako nop jnz Adresa16 Je-li Z=0 chová se instrukce jako jmp, jinak jako nop jc Adresa16 Je-li C=1 chová se instrukce jako jmp, jinak jako nop jnc Adresa16 Je-li C=0 chová se instrukce jako jmp, jinak jako nop Instrukce porovná obsah akumulátoru A, s daty. Je-li A<>data8, provede se skok na adresu, jinak se pokračuje další instrukcí. Je-li A<data8, nastaví se jednobitový registr C na 1, jinak na 0. cjne A,#data8,Adresa16 Stejně, ale místo s A pracuje s registrem Rn cjne Rn,#data8,Adresa16
Cykly řízené proměnnou Př.: … počet průchodů smyčkou ... mov R0, #100 LOOP: decR0 mov A, #1 out 01H, A nop nop nop mov A, #0 out 01H, A mov A, R0 jnz LOOP ... R0 100 R0 R0-1 Registr R0 použit jako počítadlo průchodů opakovaně prováděná část programu R0<>0 ANO NE Instrukce nejprve dekrementuje obsah registru. Je-li výsledek různý od nuly provede se skok na adresu, jinak se pokračuje další instrukcí. djnzRn,Adresa16
Cykly řízené proměnnou R0 100 Př.: … počet průchodů smyčkou ... mov R0, #100 LOOP: mov A, #1 out 01H, A nop nop nop mov A, #0 out 01H, A djnz R0, LOOP ... TĚLO CYKLU Registr R0 použit jako počítadlo průchodů R0 R0-1 R0<>0 ANO NE Uvniř těla cyklu s instrukcí DJNZ neměnit hodnotu proměnné, která cyklus řídí !!! Neskákat do a z těla cyklu
Příklad (paměť 1) Cyklem je to lepší Sestavte program, který, vynuluje oblast paměti mezi adresami AAh a BBh (včetně). Z mov R0,#0AAh mov A, #0 L1:mov @R0, A inc R0 cjne R0,#0BCh,L1 jmp $ Má se nulovat jen 17 bytů. Šlo by to i „ručně“: mov A, #0, mov 0AAh, A mov 0ABh, A mov 0ACh, A … mov 0BBh, A R0První adresa A0 Zapiš A do paměti na adresu, která je uložena v R0 R0 Další adresa Je v R0 číslo o 1 větší než poslední adresa? K
Vnořené cykly R0 100 R0 100 R1 10 TĚLO CYKLU TĚLO CYKLU R1 10 R0 R0-1 R1 R1-1 TĚLO CYKLU R0<>0 R1<>0 ANO ANO R1 R1-1 NE NE R1<>0 ANO NE R0 R0-1 R0<>0 ANO NE
Z Příklad (paměť 2) mov R7,#0 mov R0,#0AAh L1: mov A,@R0 rrc A jc L2 inc R7 L2: inc R0 cjne R0,#0BCh,L1 jmp $ Počítadlo 0 Sestavte program, který zjistí, kolik bytů uložených v paměti Mezi adresami AAh a BBh splňuje tu podmínku, že představuje ve standardním binárním váhovém kódování sudé číslo. Výsledek uložit do registrů procesoru. R0První adresa Do A přečti byte z adresy, která je uložena v R0 Je v A sudé číslo? NE ANO Počítadlo Počítadlo + 1 Jak se pozná sudé číslo? R0 Další adresa Je v R0 číslo o 1 větší než poslední adresa? NE Jak veliký může být výsledek ? Vejde se mi do jednoho registru? Co když ne? ANO Výsledek je v R7 ! K
Z Příklad (paměť 3) mov R7,#0 mov DPTR,#0AAEEh L1: mov A,@DPTR rrc A jnc L2 inc R7 L2: inc DPTR mov A, DPH cjne A,#0ABh,L1 mov A, DPL cjne A,#0BCh,L1 jmp $ Počítadlo 0 Sestavte program, který zjistí, kolik bytů uložených v paměti Mezi adresami AAEEh a ABBBh splňuje tu podmínku, že představuje ve standardním binárním váhovém kódování liché číslo. Výsledek uložit do registrů procesoru. DPTRPrvní adresa Do A přečti byte z adresy, která je uložena v DPTR Je v A liché číslo? NE ANO Počítadlo Počítadlo + 1 Pomocí osmibitového registru lze adresovat jen v intervalu adres 00H..FFH. Musí se zde použít DPTR. DPTR Další adresa Je v DPTR číslo o 1 větší než poslední adresa? NE Vejde se výsledek do jednoho registru? ANO K
Z Příklad (paměť 4) mov R7,#0 mov R6,#0 mov DPTR,#0AAEEh L1: mov A,@DPTR rlc A jc L2 inc R7 mov A, R7 jnz L2 inc R6 L2: inc DPTR mov A, DPH cjne A,#0ABh,L1 mov A, DPL cjne A,#0BCh,L1 jmp $ Počítadlo 0 Sestavte program, který zjistí, kolik bytů uložených v paměti Mezi adresami AAAAh a BBBBh splňuje tu podmínku, že představuje ve standardním binárním váhovém kódování Číslomenší než 128. Výsledek uložit do registrů procesoru. DPTRPrvní adresa Do A přečti byte z adresy, která je uložena v DPTR A<128 NE ANO Počítadlo Počítadlo + 1 Pomocí osmibitového registru lze adresovat jen v intervalu adres 00H..FFH. Musí se zde použít DPTR. DPTR Další adresa Je v DPTR číslo o 1 větší než poslední adresa? NE Vejde se výsledek do jednoho registru? ANO K
mov R7,#0 mov R6,#0 mov DPTR,#0A000h L1: mov A,@DPTR inc DPTR mov A,@DPTR rlc A jnc L2 inc R7 mov A, R7 jnz L2 inc R6 L2: inc DPTR mov A, DPH cjne A,#0B0h,L1 mov A, DPL cjne A,#000h,L1 jmp $ Příklad (paměť 5) Z Sestavte program, který zjistí, kolik čísel ve formátu Integer uložených v paměti mezi adresami 0A000h a 0AFFFh je záporných. Počítadlo 0 DPTRPrvní adresa oblasti Do A přečti byte z adresy, která je uložena v DPTR DPTR Další adresa Každé číslo je uloženo na dvou po sobě jdoucích bytech. Do A přečti byte z adresy, která je uložena v DPTR NE Nejvyšší bit A = 0 O znaménku čísla rozhoduje nejvyšší bit druhého bytu. ANO Je v DPTR číslo o 1 větší než poslední adresa? NE Počítadlo Počítadlo + 1 DPTR Další adresa ANO K
Cykly řízené podmínkou Př.: … čekání na stav … ... LOOP:in A,02H anl A, #01H add A, #0 jz LOOP ... A port 02 A A and 00000001B Mikro- počítač A=0 ANO NE P2.0 A port 02 Př.: … jiné řešení … ... LOOP:in A,02H rrc A jnc LOOP ... Tlačítko Stisknuto 1 Rozepnuto 0 Rotace A,C doprava C=1 NE ANO
Příklady na cykly Mikro- počítač Z 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 Vyslat 0 P12.0 Počkat Vyslat 1 Reproduktor 0 – 1 – 0 – 1 – 0 …. Počkat Jaká je FREKVENCE výstupního tónu?
Příklady na cykly Mikro- počítač 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 Z Zhasni P12.0 Počkat Rozsviť Žárovka 0 – nesvítí 1 - svítí Počkat Jaká je PERIODA blikání?
Příklad Z Př.: Blikat, kdyz tlačítko LOOP: mov A, #0 out 12, A mov R1, #0 W1: mov R0, #0 djnz R0, $ djnz R1, W1 TLAC: in A, 2 anl A, #01 add A, #0 jz TLAC mov A, #1 out 12, A mov R1, #0 W2: mov R0, #0 djnz R0, $ djnz R1, W2 jmp LOOP Sestavte program, který bliká žárovkou, pokud je stisknuto tlačítko. Připojení žárovky a tlačítka, viz obrázek. Zhasni Počkat Stisknuto? Mikro- počítač NE ANO Rozsviť P12.0 Počkat P2.0
Příklad (tlačítko 1) Z Sestavte program, který v registru R7 udržuje počet stisků tlačítka. Počítadlo 0 mov R7, #0 B1: in A, 2 rrc A jnc B1 B2: in A, 2 rrc A jc B2 inc R7 jmp B1 Stisknuto? NE ANO ANO Stisknuto? Mikro- počítač NE Počítadlo Počítadlo + 1 P2.0 Po 256 stiscích je registr vynulován a čítání probíhá znovu od nuly