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.