Professional Documents
Culture Documents
Asembler
Asembler
Asembler
Odpal rakietę
“Else”
Poczekaj jeszcze chwilkę
Osiąga się to przez instrukcje skoków i skoków warunkowych (czyli przez
przeniesienie sterowania oraz warunkowe przeniesienie sterowania)
Przeniesienie sterowania
Mamy do wykonania następujące zadanie: A = R1+R0
Wylicz R1 + R0 i zachowaj w A
Umieść 0 w R2 R2 = 0
“If” A = 0 “then”
Umieść 13 w R2 FALSE
A == 0
Instrukcja
JNZ rel
Jestpodobna do JZ rel, ale skok jest
wykonywany wtedy, gdy zawartość
akumulatora jest różna od zera
A = R1+R0 Przykład: JNZ rel
R2 = 0
MOV A,R0
FALSE
A == 0 ADD A,R1
TRUE
MOV R2,#0
JNZ next
R2 = 13 MOV R2,#13
next: MOV A,R2
ADD A,R3
R5 = R2 + R3
Przeniesienie sterowania:
JC rel
Instrukcja
JC rel
Skok jest wykonywany wtedy, gdy
zawartość flagi przeniesienia C jest równa 1.
Przeniesienie sterowania:
JNC rel
Instrukcja
JNC rel
Skok jest wykonywany wtedy, gdy
zawartość flagi przeniesienia C jest równa 0.
Przeniesienie sterowania:
JB bit,rel
Instrukcja
JB bit,rel
Skok jest wykonywany wtedy, gdy
bezpośrednio adresowany bit bit jest
równy 1.
Przeniesienie sterowania:
JNB bit,rel
Instrukcja
JNB bit,rel
Skok jest wykonywany wtedy, gdy
bezpośrednio adresowany bit bit jest
równy 0.
Przeniesienie sterowania:
JBC bit, rel
Instrukcja
JBC bit,rel
Skok jest wykonywany wtedy, gdy
bezpośrednio adresowany bit bit jest
równy 1.
Bit jest następnie ustawiany na 0.
(niezależnie czy skok jest wykonywany)
Przykład
Sum = 0
Count = 10
Policzyć
sumę liczb od 1 do 10 Sum = Sum +
Count
Rozwiązanie
Rysunek pokazuje pętlę Reduce Count by
1
Użyjemy rejestrów 8051
R2 do obliczenia sumy
FALSE
R1 jako licznik Is Count equal to 0
TRUE
Przykład
MOV A,R1
CLR C
Reduce R1 by 1 SUBB A,#1
MOV A,R1
FALSE FALSE
R1 == 0 JNZ loop
TRUE TRUE
Przykład (z DEC)
MOV R2,#0
MOV R1,#10 MOV R2,#0
Loop: MOV A,R2 MOV R1,#10
ADD A,R1 Loop: MOV A,R2
MOV R2,A ADD A,R1
MOV A,R1 MOV R2,A
CLR C DEC R1
SUBB A,#1 MOV A,R1
MOV R1,A JNZ Loop
JNZ Loop
Przeniesienie sterowania:
CJNE A,#data,rel
Nazwa instrukcji:
Compare & Jump if Not Equal (CJNE)
Elastyczniejsza niż JZ i JNZ, ale 3 ma bajty długości
Działanie:
Porównanie zawartości A ze stałą #data i gdy te
wielkości nie są równe rel jest dodawane do licznika
programu (PC).
Modyfikuje flagę C gdy (A) < #data.
Instrukcja CJNE
Możliwości:
Endtest:
Przeniesienie sterowania:
DJNZ Rn,rel
Następna uniwersalna i złożona instrukcja skoku:
Decrement & Jump if Not Zero (DJNZ)
Używana do wykonywania pętli z licznikiem
Zawartość rejestru Rn jest zmniejszana o 1, a
następnie jezeli wynik jest różny od zera licznik
programu (PC) jest modyfikowany – zostaje do
niego dodana wartość rel (czyli zostaje
wykonany skok).
Instrukcja DJNZ
Możliwe formaty
DJNZ Rn,rel
DJNZ direct,rel
Wskaźniki nie są modyfikowane
Obie instrukcje zmniejszają zawartość pierwszego
operandu i wykonują skok jeżeli się wyzerował.
> Pierwsza instrukcja dekrementuje i testuje Rn
» rozmiar 2 bajtów
> Druga instrukcja (mocna !) dekrementuje i testuje bezpośrednio
adresowaną komórkę pamięci
» rozmiar 3 bajtów
Przykład (z DJNZ)
MOV R2,#0
CLR A
MOV R1,#10
MOV R1,#10
Loop: MOV A,R2
Loop: ADD A,R1
ADD A,R1
DJNZ R1,Loop
MOV R2,A
MOV R2,A
MOV A,R1
CLR C
SUBB A,#1
MOV R1,A
JNZ Loop
Instrukcje skoków
Potrzebujemy
również instrukcji skoków
bezwarunkowych
Ładują
one adres do rejestru PC
Odpowiadają instrukcji goto języków wyższego poziomu
PC a a a a a a a a a a a
PC a a a a a a a a a a a a a a a a
s = start address
of string Przykład
FALSE
is value at s
not equal to 0
TRUE
Policz wystąpienia
liter 'e' i 'o' w
is value at s
TRUE
equal to 'e'
FALSE
łańcuchu
Increment is value at s
umieszczonym od
e_count
TRUE
equal to 'o'
FALSE
adresu 20h i
Increment zakończonym 00h.
o_count
Wyniki umieść w
R1 oraz R2
Increment s
Przykład: rozwiązanie
e_count = 0
o_count = 0
s = start address
of string MOV R1,#0
MOV R2,#0
FALSE
is value at s
not equal to 0
MOV R0,#20H
Loop: MOV A,@R0
TRUE
JZ Loopend
is value at s
equal to 'e'
TRUE FALSE
Increment
e_count
TRUE
is value at s
equal to 'o'
FALSE
CJNE @R0,#’e’,Testo
INC R1
Increment
o_count
JMP Fintest
Testo: CJNE @R0,#’o’,Fintest
Increment s
INC R2
Fintest: INC R0
JMP Loop
Pisanie w assemblerze Loopend:
raczej nie jest trywialne!
Skok pośredni
Specjalna wersja instrukcji skoku
JMP @A+DPTR
z użyciem 16 bitowego adresu, będącego sumą
zawartości DPTR i akumulatora.
umożliwia skoki wyliczane według tabeli
skoków.
Wywołanie podprogramów
Istnieją
2 instrukcje wywołania Przykład:
podprogramów ADD A,R1
ACALL addr11 ACALL proc
LCALL addr16 MOV R2,#0
Powrót z podprogramu .....
(procedury, funkcji) następuje po
wykonaniu instrukcji
proc: MOV R2,#13
MOV A,R2
RET
RET
Wywołanie podprogramu
Pierwsza (ACALL) instrukcja to Położenie startu
wywołanie podprogramu z podprogramu – w bloku 2047
użyciem adresu 11 bitowego bajtów.
(PC) <- (PC) + 2
PC czyli adres powrotu
(SP) <- (SP) + 1
(adres następnej instrukcji do
((SP)) <- (PC7..0) wykonania po zakończeniu
(SP) <- (SP) + 1 podprogramu) jest
((SP)) <- (PC15..8) zachowywany na stosie.
(PC10..0) <- addr11 Inne rejestry nie są
Rozmiar - 2 bajty zachowywane.
Wywołanie podprogramu
Druga (LCALL) instrukcja to Położenie startu
wywołanie podprogramu z podprogramu – w bloku 2047
użyciem adresu 16 bitowego bajtów.
(PC) <- (PC) + 2
PC czyli adres powrotu
(SP) <- (SP) + 1
(adres następnej instrukcji do
((SP)) <- (PC7..0) wykonania po zakończeniu
(SP) <- (SP) + 1 podprogramu) jest
((SP)) <- (PC15..8) zachowywany na stosie.
(PC15..0) <- addr16 Inne rejestry nie są
Rozmiar - 3 bajty zachowywane.
Wywołanie podprogramu
OK, są 2 instrukcje Przykład:
wywołania podprogramu.
Której użyć??? MOV A,#10
Odpowiedź: Pozwól CALL proc
zadecydować MOV R2,#0
assemblerowi... ......
Użyj “instrukcji” CALL
Assembler wybierze tą
właściwą proc: MOV R2,#13
... i zamieni CALL na
jedną z 2 instrukcji.
ADD A,R2
RET
Powrót z podprogramu
Instrukcja powrotu (RET)
ładuje do licznika programu Instrukcja znajduje
(PC) adres powrotu zastosowanie do powrotów z
zachowany na stosie podprogramów wywołanych
(PC15..8) <- ((SP)) zarówno długą, jak i któtką
(SP) <- (SP) - 1 instrukcją CALL.
(PC7..0) <- ((SP))
(SP) <- (SP) - 1
Operacje na stosie: PUSH
Umieść na stosie zawartość komórki pamięci
PUSH direct
do rejestrów SFR można się odwoływać poprzez
ich adresy w obszarze SFR (na przykład ACC)
adresowanie przez SP jest pośrednie – dotyczy do
256 bajtów wewnętrznej pamięci RAM
(SP) <- (SP) + 1
((SP)) <- direct
Operacje na stosie: POP
Pobierz ze stosu zawartość komórki pamięci
POP direct
do rejestrów SFR można się odwoływać poprzez
ich adresy w obszarze SFR (na przykład ACC)
adresowanie przez SP jest pośrednie – dotyczy do
256 bajtów wewnętrznej pamięci RAM
(direct) <- ((SP))
(SP) <- (SP) - 1
Operacje na bitach
CLR C
CLR bit
Instrukcjazeruje flagę C
lub bezpośrednio adresowany bit w obszarze
pamięci RAM adresowalnym bitowo.
Operacje na bitach: SETB
Instrukcje ustawiania jedynki
SETB C
SETB bit
CPL C
CPL bit
Instrukcjaneguje wskaźnik C
lub bezpośrednio adresowany bit w obszarze
pamięci RAM adresowalnym bitowo.
Operacje na bitach: ANL
Logiczny iloczyn
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
NOP