Systemy wbudowane - instrukcje
Przepływ programu przebiega w sposób sekwencyjny, od jednej instrukcji do następnej, chyba że jest wykonywana sterująca instrukcja przekazu. Różne typy instrukcji transferu sterowania w języku asemblera obejmują skoki warunkowe lub bezwarunkowe i instrukcje wywołania.
Instrukcje pętli i skoku
Pętla w 8051
Powtarzanie sekwencji instrukcji określoną liczbę razy nazywa się a loop. InstrukcjaDJNZ reg, labelsłuży do wykonywania operacji w pętli. W tej instrukcji rejestr jest zmniejszany o 1; jeśli nie jest zerem, 8051 przeskakuje do adresu docelowego, do którego odnosi się etykieta.
Do rejestru ładowany jest licznik ilości powtórzeń przed rozpoczęciem pętli. W tej instrukcji zarówno dekrementacja rejestrów, jak i decyzja o skoku są połączone w jedną instrukcję. Rejestry mogą być dowolnymi rejestrami R0 – R7. Licznik może być również lokalizacją pamięci RAM.
Przykład
Multiply 25 by 10 using the technique of repeated addition.
Solution- Mnożenie można osiągnąć, dodając wielokrotnie mnożnik, tyle razy, ile jest mnożnik. Na przykład,
25 * 10 = 250 (FAH)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC
MOV R2,#10 ; the multiplier is replaced in R2
Add A,#25 ;add the multiplicand to the ACC
AGAIN:DJNZ R2,
AGAIN:repeat until R2 = 0 (10 times)
MOV R5 , A ;save A in R5 ;R5 (FAH)
Drawback in 8051 - Pętla z instrukcją DJNZ Reg labeljest ograniczona tylko do 256 iteracji. Jeśli nie zostanie wykonany skok warunkowy, wykonywana jest instrukcja następująca po skoku.
Pętla wewnątrz pętli
Kiedy używamy pętli wewnątrz innej pętli, nazywa się to a nested loop. Dwa rejestry są używane do przechowywania licznika, gdy maksymalna liczba jest ograniczona do 256. Więc używamy tej metody, aby powtórzyć akcję więcej razy niż 256.
Example
Napisz program do -
- Załaduj akumulator wartością 55H.
- Uzupełnij ACC 700 razy.
Solution- Ponieważ 700 jest większe niż 255 (maksymalna pojemność dowolnego rejestru), dwa rejestry są używane do przechowywania licznika. Poniższy kod pokazuje, jak używać dwóch rejestrów, R2 i R3, do zliczania.
MOV A,#55H ;A = 55H
NEXT: MOV R3,#10 ;R3 the outer loop counter
AGAIN:MOV R2,#70 ;R2 the inner loop counter
CPL A ;complement
Inne skoki warunkowe
Poniższa tabela zawiera listę skoków warunkowych używanych w 8051 -
Instrukcja | Akcja |
---|---|
J Z | Skocz, jeśli A = 0 |
JNZ | Skocz, jeśli A ≠ 0 |
DJNZ | Zmniejsz i przeskocz, jeśli rejestr ≠ 0 |
CJNE A, dane | Skocz, jeśli dane A ≠ |
CJNE reg, #data | Skocz, jeśli bajt ≠ dane |
JC | Skocz, jeśli CY = 1 |
JNC | Skocz, jeśli CY ≠ 1 |
JB | Skocz, jeśli bit = 1 |
JNB | Skocz, jeśli bit = 0 |
JBC | Skocz, jeśli bit = 1 i wyczyść bit |
JZ (jump if A = 0)- W tej instrukcji sprawdzana jest zawartość akumulatora. Jeśli jest zero, 8051 przeskakuje pod adres docelowy. Instrukcja JZ może być używana tylko dla akumulatora, nie dotyczy żadnego innego rejestru.
JNZ (jump if A is not equal to 0)- W tej instrukcji zawartość akumulatora jest sprawdzana jako niezerowa. Jeśli nie jest zerem, 8051 przeskakuje do adresu docelowego.
JNC (Jump if no carry, jumps if CY = 0)- Bit flagi przenoszenia w rejestrze flagi (lub PSW) jest używany do podjęcia decyzji, czy przeskoczyć, czy nie, z „etykiety JNC”. Procesor patrzy na flagę przeniesienia, aby sprawdzić, czy jest podniesiona (CY = 1). Jeśli nie zostanie podniesiony, CPU zaczyna pobierać i wykonywać instrukcje z adresu etykiety. Jeśli CY = 1, nie przeskoczy, ale wykona następną instrukcję poniżej JNC.
JC (Jump if carry, jumps if CY = 1) - Jeśli CY = 1, przeskakuje do adresu docelowego.
JB (jump if bit is high)
JNB (jump if bit is low)
Note - Należy zauważyć, że wszystkie skoki warunkowe są skokami krótkimi, tj. Adres celu musi znajdować się w zakresie od –128 do +127 bajtów zawartości licznika programu.
Bezwarunkowe instrukcje skoku
W 8051 są dwa bezwarunkowe skoki -
LJMP (long jump)- LJMP to 3-bajtowa instrukcja, w której pierwszy bajt reprezentuje kod operacji, a drugi i trzeci bajt reprezentują 16-bitowy adres lokalizacji docelowej. 2-bajtowy adres docelowy ma umożliwiać przejście do dowolnej lokalizacji pamięci od 0000 do FFFFH.
SJMP (short jump)- Jest to instrukcja 2-bajtowa, w której pierwszy bajt to kod operacji, a drugi bajt to adres względny lokalizacji docelowej. Względny adres mieści się w zakresie od 00H do FFH, który jest podzielony na skoki do przodu i do tyłu; to znaczy w zakresie od –128 do +127 bajtów pamięci w stosunku do adresu bieżącego komputera PC (licznik programu). W przypadku skoku do przodu adres docelowy może znajdować się w przestrzeni 127 bajtów od bieżącego komputera. W przypadku skoku wstecz, adres docelowy może znajdować się w granicach –128 bajtów od bieżącego komputera.
Obliczanie adresu krótkiego skoku
Wszystkie skoki warunkowe (JNC, JZ i DJNZ) są krótkimi skokami, ponieważ są to instrukcje 2-bajtowe. W tych instrukcjach pierwszy bajt reprezentuje kod operacji, a drugi bajt reprezentuje adres względny. Adres docelowy jest zawsze powiązany z wartością licznika programu. Aby obliczyć adres docelowy, drugi bajt jest dodawany do komputera PC instrukcji bezpośrednio pod skokiem. Spójrz na program podany poniżej -
Line PC Op-code Mnemonic Operand
1 0000 ORG 0000
2 0000 7800 MOV R0,#003
3 0002 7455 MOV A,#55H0
4 0004 6003 JZ NEXT
5 0006 08 INC R0
6 0007 04 AGAIN: INC A
7 0008 04 INC A
8 0009 2477 NEXT: ADD A, #77h
9 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0, A
12 000F F9 MOV R1, A
13 0010 FA MOV R2, A
14 0011 FB MOV R3, A
15 0012 2B OVER: ADD A, R3
16 0013 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 0017 END
Obliczanie adresu docelowego skoku wstecznego
W przypadku skoku do przodu wartość przesunięcia jest liczbą dodatnią z zakresu od 0 do 127 (od 00 do 7F w zapisie szesnastkowym). Jednak w przypadku skoku do tyłu przemieszczenie ma wartość ujemną od 0 do –128.
Instrukcje ZADZWOŃ
CALL służy do wywołania podprogramu lub metody. Podprogramy są używane do wykonywania operacji lub zadań, które muszą być wykonywane często. To sprawia, że program jest bardziej zorganizowany i oszczędza miejsce w pamięci. Istnieją dwie instrukcje - LCALL i ACALL.
LCALL (połączenie długie)
LCALL to 3-bajtowa instrukcja, w której pierwszy bajt reprezentuje kod operacji, a drugi i trzeci bajt są używane do podania adresu docelowej procedury. LCALL może być użyty do wywołania podprogramów, które są dostępne w 64-bajtowej przestrzeni adresowej 8051.
Aby pomyślnie wrócić do punktu po wykonaniu wywoływanego podprogramu, CPU zapisuje adres instrukcji bezpośrednio pod LCALL na stosie. Tak więc, kiedy wywoływany jest podprogram, sterowanie jest przenoszone do tego podprogramu, a procesor zapisuje komputer PC (licznik programu) na stosie i zaczyna pobierać instrukcje z nowej lokalizacji. Instrukcja RET (powrót) przekazuje sterowanie z powrotem do wywołującego po zakończeniu wykonywania podprogramu. Każdy podprogram używa RET jako ostatniej instrukcji.
ACALL (połączenie bezwzględne)
ACALL jest instrukcją 2-bajtową, w przeciwieństwie do LCALL, która ma 3 bajty. Docelowy adres podprogramu musi mieścić się w granicach 2 KB, ponieważ tylko 11 bitów z 2 bajtów jest używanych na adres. Różnica między ACALL i LCALL polega na tym, że adres docelowy dla LCALL może znajdować się w dowolnym miejscu w przestrzeni adresowej 64 kilobajtów 8051, podczas gdy adres docelowy CALL mieści się w zakresie 2 kilobajtów.