Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Instrukcje AVR

D E F I J

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

DECDecrement – Zmniejszenie o 1

Opis

Odejmuje jeden od zawartości rejestru Rd i wynik umieszcza w tym samym rejestrze Rd.

Znacznik C w SREG nie jest zmieniany przez tę operację, co pozwala używać instrukcję DEC jako licznik pętli w obliczeniach wielo-precyzyjnych.

Gdy operacja dotyczy wartości bezznakowych, to tylko instrukcje skoków względnych BREQ i BRNE mogą być wykorzystywane spójnie z jej wynikiem. Gdy operacja dotyczy liczb ze znakiem w kodzie U2, to wszystkie skoki znakowe są do dyspozycji.

Działanie

                 
Rd ← Rd - 1        

Składnia

 

Argumenty

 

Licznik rozkazów

DEC Rd   0 ≤ d ≤ 31   PC ← PC + 1

16-bitowy kod instrukcji

1001
010d
dddd
1010

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X X X X
S: N obrazek V
Dla testów liczb ze znakiem w kodzie U2
V: R7•R6•R5•R4•R3•R2•R1•R0
Ustawiany, jeśli w wyniku operacji powstał nadmiar U2, inaczej zerowany. Nadmiar U2 powstaje wtedy i tylko wtedy, gdy przed operacją rejestr Rd miał wartość 0x80 (-128U2).
N: R7
Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; w przeciwnym razie zerowany
Z: R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy Rd.

Przykładowy kod:

      ldi r17,0x10 ; Załaduj stałą do r17
loop: add r1,r2   ; Dodaj r2 do r1
      dec r17     ; Zmniejsz o 1 r17
      brne loop   ; Skocz, jeśli r17<>0
      nop         ; Kontynuuj (nic nie rób) 

Liczba słów: 1 (2 bajty)

Cykle: 1

Na początek:  podrozdziału   strony 

EICALLExtended Indirect Call to Subroutine – Rozszerzone wywołanie pośrednie podprogramu

Opis

Pośrednie wywołanie podprogramu wskazanego przez rejestr wskaźnikowy Z (16-bitowy) w zestawie rejestrów oraz rejestr EIND w obszarze we/wy. Instrukcja ta pozwala wywoływać podprogram umieszczony w dowolnym miejscu całej przestrzeni pamięci programu. Podczas wywołania EICALL rejestr stosu stosuje schemat postdekrementacji.

Instrukcja ta nie jest implementowana na mikrokontrolerach z 2 bajtowym rejestrem licznika rozkazów PC, Zobacz na ICALL. Sprawdź w zestawie rozkazów twojego mikrokontrolera.

Działanie

                          
PC(15:0) ← Z(15:0)
PC(21:16) ← EIND

Składnia

 

Argumenty

 

Licznik rozkazów

 

Stos:

EICALL   brak   Zobacz na działanie   STACK ← PC + 1
SP ← SP - 3 (3 bajty, 22 bity)

16-bitowy kod instrukcji

1001
0101
0001
1001

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

ldi r16,0x05 ; Ustaw EIND i wskaźnik-Z
out EIND,r16
ldi r30,0x00
ldi r31,0x10
eicall      ; Wywołaj podprogram pod adresem 0x051000

Liczba słów: 1 (2 bajty)

Cykle: 4 (zaimplementowane tylko w mikrokontrolerach z 22-bitowym PC)

Na początek:  podrozdziału   strony 

EIJMPExtended Indirect Jump – Rozszerzony skok pośredni

Opis

Pośrednie skok do miejsca w programie wskazanego przez rejestr wskaźnikowy Z (16-bitowy) w zestawie rejestrów oraz rejestr EIND w obszarze we/wy. Instrukcja ta pozwala skoczyć do dowolnego miejsca w całej przestrzeni pamięci programu.

Instrukcja ta nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w zestawie rozkazów twojego mikrokontrolera.

Działanie

                          
PC(15:0) ← Z(15:0)
PC(21:16) ← EIND

Składnia

 

Argumenty

 

Licznik rozkazów

 

Stos:

EIJMP   brak   Zobacz na działanie   nie zmieniany

16-bitowy kod instrukcji

1001
0100
0001
1001

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

ldi r16,0x05 ; Ustaw EIND i wskaźnik-Z
out EIND,r16
ldi r30,0x00
ldi r31,0x10
eijmp       ; Skocz do adresu 0x051000

Liczba słów: 1 (2 bajty)

Cykle: 2

Na początek:  podrozdziału   strony 

ELPMExtended Load Program Memory – Rozszerzone pobranie z pamięci programu

Opis

Pobiera jeden bajt wskazywany przez rejestr Z i rejstr RAMPZ w przestrzeni we/wy, i umieszcza ten bajt w rejestrze docelowym Rd. Instrukcja ta w 100% nadaje się do efektywnej inicjalizacji stałej lub pobrania stałych danych. Pamięć programu zorganizowana  jest w 16-bitowe słowa, natomiast wskaźnik Z jest adresem bajtu. W ten sposób najmniej znaczący bit wskaźnika Z wybiera albo młodszy bajt (ZLSB = 0), albo starszy (ZLSB = 1). Instrukcja potrafi zaadresować całą przestrzeń pamięci programu.
Rejestr wskaźnika Z może być albo pozostawiony bez zmian po operacji, albo zwiększony o 1. To zwiększenie odnosi się do całego 24-bitowego złączenia rejestru RAMPZ z rejestrem wskaźnika Z.

Mikrokontrolery z możliwością samoprogramowania mogą używać instrukcji ELPM do odczytu wartości bitu bezpiecznikowego i bitu blokady. Szczegółowy opis znajdziesz w dokumentacji mikrokontrolera.
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.

Wynik tej kombinacji jest nieokreślony:

ELPM r30, Z+
ELPM r31, Z+
 

Działanie

               

Komentarz

(i)
(ii)
(iii)
R0 ← (RAMPZ:Z)
Rd ← (RAMPZ:Z)
Rd ← (RAMPZ:Z) (RAMPZ:Z) ← (RAMPZ:Z) + 1
RAMPZ:Z: niezmieniane, rejestr R0 jako rejestr docelowy
RAMPZ:Z: niezmieniane
RAMPZ:Z: postinkrementacja
 

Składnia

 

Argumenty

 

Licznik rozkazów

(i)
(ii)
(iii)
ELPM
ELPM Rd, Z
ELPM Rd, Z+
  brak, implikowany R0
0 ≤ d ≤ 31
0 ≤ d ≤ 31
  PC ← PC + 1
PC ← PC + 1
PC ← PC + 1

16-bitowy kod instrukcji

(i)
1001
0101
0001
1001
(ii)
1001
000d
dddd
0110
(iii)
1001
000d
dddd
0111

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

    ldi ZL, byte3(Table_1<<1) ; Inicjuj wskaźnik Z
    out RAMPZ, ZL
    ldi ZH, byte2(Table_1<<1)
    ldi ZL, byte1(Table_1<<1)
    elpm r16, Z+              ; Załaduj stałą z pamięci programu
                              ; wskazywanej przez RAMPZ:Z (Z to r31:r30)
                              ; i zwiększ RAMPZ:Z o 1
    ...
Table_1:
    .dw 0x3738                ; 0x38 jest adresowane, gdy ZLSB = 0
                              ; 0x37 jest adresowane, gdy ZLSB = 1

Liczba słów: 1 (2 bajty)

Cykle: 3

Na początek:  podrozdziału   strony 

EORExclusive OR – Różnica symetryczna

Opis

Wykonuje bitową operację sumy symetrycznej pomiędzy zawartością rejestru Rd a zawartością rejestru Rr i umieszcza wynik w rejestrze docelowym Rd.

Działanie

                 
Rd ← Rd obrazek Rr  

Składnia

 

Argumenty

 

Licznik rozkazów

EOR Rd,Rr   0 ≤ d ≤ 31, 0 ≤ r ≤ 31   PC ← PC + 1

16-bitowy kod instrukcji

0010
01rd
dddd
rrrr

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X 0 X X
S: N obrazek V
Dla testów liczb ze znakiem w kodzie U2
V: 0
Zerowany
N: R7
Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; w przeciwnym razie zerowany
Z: R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy Rd.

Przykładowy kod:

eor r4,r4  ; Zeruj r4
eor r0,r22 ; Bitowa suma symetryczna pomiędzy r0 i r22

Liczba słów: 1 (2 bajty)

Cykle: 1

Na początek:  podrozdziału   strony 

FMULFractional Multiply Unsigned – Ułamkowe mnożenie liczb bez znaku

Opis

Instrukcja wykonuje mnożenie 8-bitowych liczb bez znaku. 16-bitowy wynik mnożenia jest przesuwany o jeden bit w lewo.

obrazek

Niech (N,Q) oznacza liczbę ułamkową z N cyframi dwójkowymi części całkowitej na lewo od przecinka i z Q cyframi dwójkowymi części ułamkowej na prawo od przecinka. Mnożenie dwóch liczb w formatach (N1,Q1) i (N2, Q2) daje w wyniku format ((N1+N2),(Q1+Q2)). Przy przetwarzaniu sygnałów format (1,7) jest szeroko wykorzystywany dla danych wejściowych, co daje wynikowy format iloczynu (2,14). Przesunięcie w lewo o jeden bit jest potrzebne, aby starszy bajt iloczynu był w tym samym formacie co dane wejściowe. Instrukcja  FMUL wykonuje operację przesuwu w tej samej liczbie cykli co  MUL.

Format (1,7) jest najczęściej używany dla liczb ze znakiem, natomiast FMUL wykonuje mnożenie bezznakowe. Instrukcja ta jest zatem najbardziej użyteczna przy obliczaniu jednego z częściowych iloczynów, gdy wykonuje się mnożenie ze znakiem na 16-bitowych danych wejściowych w formacie (1,15) otrzymując wynik w formacie (1,31). Uwaga: wynik operacji FMUL może ucierpieć przy nadmiarze U2, jeśli zostanie on zinterpretowany jako liczba w formacie (1,15). Pod uwagę należy wziąć najstarszy bit wyniku przed przesunięciem, a znajduje się on w bicie znacznika przeniesienia C. Zobacz na przykładowy kod.
Mnożna Rd i mnożnik Rr to dwa rejestry zawierające ułamkowe liczby bez znaku, gdzie przecinek znajduje się pomiędzy bitem 6 a bitem 7. 16-bitowy ułamkowy iloczyn bez znaku z przecinkiem pomiędzy bitem 14 a bitem 15 zostaje umieszczony w R1 (starszy bajt) i w R0 (młodszy bajt).

Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.

Działanie

                 
R1:R0 ← Rd × Rr (bez znaku (1,15) ← bez znaku (1,7) × bez znaku (1,7))  

Składnia

 

Argumenty

 

Licznik rozkazów

FMUL Rd,Rr   16 ≤ d ≤ 23, 16≤ r ≤ 23   PC ← PC + 1

16-bitowy kod instrukcji

0000
0011
0ddd
1rrr

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X X
Z: R15R14R13R12R11R10R9R8R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x0000; w przeciwnym razie zerowany
C: R16
Ustawiany, jeśli bit 15 iloczynu przed przesunięciem jest ustawiony; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy R1:R0.

Przykładowy kod:

;******************************************************************************
;* OPIS
;*Znakowe mnożenie ułamkowe dwóch 16-bitowych liczb z wynikiem 32-bitowym.
;* UŻYCIE
;*r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1
;******************************************************************************
fmuls16x16_32:
    clr r2
    fmuls r23, r21    ;((ze znakiem)ah * (ze znakiem)bh) << 1
    movw r19:r18, r1:r0
    fmul r22, r20     ;(al * bl) << 1
    adc r18, r2
    movw r17:r16, r1:r0
    fmulsu r23, r20   ;((ze znakiem)ah * bl) << 1
    sbc r19, r2
    add r17, r0
    adc r18, r1
    adc r19, r2
    fmulsu r21, r22   ;((ze znakiem)bh * al) << 1
    sbc r19, r2
    add r17, r0
    adc r18, r1
    adc r19, r2

Liczba słów: 1 (2 bajty)

Cykle: 2

Na początek:  podrozdziału   strony 

FMULSFractional Multiply Signed – Ułamkowe mnożenie liczb ze znakiem

Opis

Instrukcja wykonuje mnożenie 8-bitowych liczb ze znakiem. 16-bitowy wynik mnożenia jest przesuwany o jeden bit w lewo.

obrazek

Niech (N,Q) oznacza liczbę ułamkową z N cyframi dwójkowymi części całkowitej na lewo od przecinka i z Q cyframi dwójkowymi części ułamkowej na prawo od przecinka. Mnożenie dwóch liczb w formatach (N1,Q1) i (N2, Q2) daje w wyniku format ((N1+N2),(Q1+Q2)). Przy przetwarzaniu sygnałów format (1,7) jest szeroko wykorzystywany dla danych wejściowych, co daje wynikowy format iloczynu (2,14). Przesunięcie w lewo o jeden bit jest potrzebne, aby starszy bajt iloczynu był w tym samym formacie co dane wejściowe. Instrukcja  FMULS wykonuje operację przesuwu w tej samej liczbie cykli co  MULS.
Mnożna Rd i mnożnik Rr to dwa rejestry zawierające ułamkowe liczby ze znakiem, gdzie przecinek znajduje się pomiędzy bitem 6 a bitem 7. 16-bitowy ułamkowy iloczyn ze znakiem z przecinkiem pomiędzy bitem 14 a bitem 15 zostaje umieszczony w R1 (starszy bajt) i w R0 (młodszy bajt).

Uwaga: gdy wykonywane jest mnożenie  0x80 (-1) przez 0x80 (-1), wynikiem operacji przesuwu jest 0x8000 (-1). W ten sposób operacja przesunięcia daje nadmiar U2. To musi zostać sprawdzone i obsłużone programowo.

Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.

Działanie

                 
R1:R0 ← Rd × Rr (ze znakiem(1,15) ← ze znakiem (1,7) × ze znakiem (1,7))  

Składnia

 

Argumenty

 

Licznik rozkazów

FMULS Rd,Rr   16 ≤ d ≤ 23, 16≤ r ≤ 23   PC ← PC + 1

16-bitowy kod instrukcji

0000
0011
1ddd
0rrr

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X X
Z: R15R14R13R12R11R10R9R8R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x0000; w przeciwnym razie zerowany
C: R16
Ustawiany, jeśli bit 15 iloczynu przed przesunięciem jest ustawiony; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy R1:R0.

Przykładowy kod:

fmuls r23,r22      ; Pomnóż ze znakiem r23 i r22 w formacie (1.7), wynik w formacie (1.15) 
movw r23:r22,r1:r0 ; Kopiuj wynik z powrotem do r23:r22

Liczba słów: 1 (2 bajty)

Cykle: 2

Na początek:  podrozdziału   strony 

FMULSUFractional Multiply Signed with Unsigned – Ułamkowe mnożenie liczby ze znakiem przez liczbę bez znaku

Opis

Instrukcja wykonuje mnożenie 8-bitowej liczby ze znakiem przez 8-bitową liczbę bez znaku. 16-bitowy wynik mnożenia jest przesuwany o jeden bit w lewo.

obrazek

Niech (N,Q) oznacza liczbę ułamkową z N cyframi dwójkowymi części całkowitej na lewo od przecinka i z Q cyframi dwójkowymi części ułamkowej na prawo od przecinka. Mnożenie dwóch liczb w formatach (N1,Q1) i (N2, Q2) daje w wyniku format ((N1+N2),(Q1+Q2)). Przy przetwarzaniu sygnałów format (1,7) jest szeroko wykorzystywany dla danych wejściowych, co daje wynikowy format iloczynu (2,14). Przesunięcie w lewo o jeden bit jest potrzebne, aby starszy bajt iloczynu był w tym samym formacie co dane wejściowe. Instrukcja  FMULS wykonuje operację przesuwu w tej samej liczbie cykli co  MULSU.

Format (1,7) jest najczęściej używany dla liczb ze znakiem, natomiast FMULSU wykonuje mnożenie liczby ze znakiem przez liczbę bez znaku. Instrukcja ta jest zatem najbardziej użyteczna przy obliczaniu jednego z częściowych iloczynów, gdy wykonuje się mnożenie ze znakiem na 16-bitowych danych wejściowych w formacie (1,15) otrzymując wynik w formacie (1,31). Uwaga: wynik operacji FMULSU może ucierpieć przy nadmiarze U2, jeśli zostanie on zinterpretowany jako liczba w formacie (1,15). Pod uwagę należy wziąć najstarszy bit wyniku przed przesunięciem, a znajduje się on w bicie znacznika przeniesienia C. Zobacz na przykładowy kod.

Mnożna Rd i mnożnik Rr to dwa rejestry zawierające ułamkowe liczby ze znakiem, gdzie przecinek znajduje się pomiędzy bitem 6 a bitem 7. 16-bitowy ułamkowy iloczyn ze znakiem z przecinkiem pomiędzy bitem 14 a bitem 15 zostaje umieszczony w R1 (starszy bajt) i w R0 (młodszy bajt).

Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.

Działanie

                 
R1:R0 ← Rd × Rr (ze znakiem(1,15) ← ze znakiem (1,7) × bez znaku (1,7))  

Składnia

 

Argumenty

 

Licznik rozkazów

FMULSU Rd,Rr   16 ≤ d ≤ 23, 16≤ r ≤ 23   PC ← PC + 1

16-bitowy kod instrukcji

0000
0011
1ddd
1rrr

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X X
Z: R15R14R13R12R11R10R9R8R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x0000; w przeciwnym razie zerowany
C: R16
Ustawiany, jeśli bit 15 iloczynu przed przesunięciem jest ustawiony; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy R1:R0.

Przykładowy kod:

;******************************************************************************
;* OPIS
;*Znakowe mnożenie ułamkowe dwóch 16-bitowych liczb z wynikiem 32-bitowym.
;* UŻYCIE
;*r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1
;******************************************************************************
fmuls16x16_32:
    clr r2
    fmuls r23, r21    ;((ze znakiem)ah * (ze znakiem)bh) << 1
    movw r19:r18, r1:r0
    fmul r22, r20     ;(al * bl) << 1
    adc r18, r2
    movw r17:r16, r1:r0
    fmulsu r23, r20   ;((ze znakiem)ah * bl) << 1
    sbc r19, r2
    add r17, r0
    adc r18, r1
    adc r19, r2
    fmulsu r21, r22   ;((ze znakiem)bh * al) << 1
    sbc r19, r2
    add r17, r0
    adc r18, r1
    adc r19, r2

Liczba słów: 1 (2 bajty)

Cykle: 2

Na początek:  podrozdziału   strony 

ICALLIndirect Call to Subroutine – Pośrednie wywołanie podprogramu

Opis

Pośrednie wywołanie podprogramu wskazywanego przez rejestr indeksowy Z (16 bitów) w zestawie rejestrów. Rejestr indeksowy Z ma długość 16 bitów i pozwala wywołać podprogram w najniższym obszarze 64K słów (128KB) przestrzeni pamięci programu. Wskaźnik stosu stosuje schemat postdekrementacji w czasie wykonywania się instrukcji ICALL.

Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.

 

Działanie

                     
(i)
(ii)
PC(15:0) ← Z(15:0) mikrokontrolery z 16-bitowym PC, 128KB pamięci programu maksimum.
PC(15:0) ← Z(15:0) mikrokontrolery z 22-bitowym PC, 8MB pamięci programu maksimum,
PC(21:16) ← 0
 

Składnia

 

Argumenty

 

Licznik rozkazów

       

Stos

(i) ICALL
  brak
  Zobacz na działanie   STACK ← PC + 1
SP ← SP - 2 (2 bajty, 16 bitów)
(ii) ICALL   brak   Zobacz na działanie   STACK ← PC + 1
SP ← SP - 3 (3 bajty, 22 bity)

16-bitowy kod instrukcji

1001
0101
0000
1001

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

mov r30,r0 ; Ustaw przesunięcie w tablicy wywołań
icall      ; Wywołaj podprogram wskazany przez r31:r30

Liczba słów: 1 (2 bajty)

Cykle:

3 mikrokontrolery z 16-bitowym PC
4 mikrokontrolery z 22-bitowym PC

Na początek:  podrozdziału   strony 

IJMPIndirect Jump – Skok pośredni

Opis

Skok pośredni do miejsca w programie wskazywanego przez rejestr indeksowy Z (16 bitów) w zestawie rejestrów. Rejestr indeksowy Z ma długość 16 bitów i pozwala skoczyć pod adres w najniższym obszarze 64K słów (128KB) przestrzeni pamięci programu.

Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.

 

Działanie

                     
(i)
(ii)
PC(15:0) ← Z(15:0) mikrokontrolery z 16-bitowym PC, 128KB pamięci programu maksimum.
PC(15:0) ← Z(15:0) mikrokontrolery z 22-bitowym PC, 8MB pamięci programu maksimum,
PC(21:16) ← 0
 

Składnia

 

Argumenty

 

Licznik rozkazów

       

Stos

(i),(ii) IJMP
  brak
  Zobacz na działanie   Niezmieniany

16-bitowy kod instrukcji

1001
0100
0000
1001

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

mov r30,r0 ; Ustaw przesunięcie w tablicy skoków
ijmp       ; Skocz pod adres wskazany przez r31:r30

Liczba słów: 1 (2 bajty)

Cykle: 2

Na początek:  podrozdziału   strony 

INLoad an I/O Location to Register – Ładowanie komórki we/we do rejestru

Opis

Odczytuje dane z przestrzeni we/wy (porty, timery, rejestry konfiguracyjne, itp.) do rejestru Rd w zestawie rejestrów.

Działanie

                 
Rd ← I/O(A)

Składnia

 

Argumenty

 

Licznik rozkazów

IN Rd,A
  0 ≤ d ≤ 31, 0 ≤ A ≤ 63
  PC ← PC + 1

16-bitowy kod instrukcji

1011
0AAd
dddd
AAAA

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

      in r25,0x16 ; Czytaj Port B
      cpi r25,4  ; Porównaj odczytaną wartość ze stałą
      breq exit  ; Skocz, jeśli r25=4
      ...
exit: nop        ; Miejsce docelowe skoku (nic nie rób) 

Liczba słów: 1 (2 bajty)

Cykle: 1

Na początek:  podrozdziału   strony 

INCIncrement – Zwiększanie o 1

Opis

Dodaje 1 do zawartości rejestru  Rd i umieszcza wynik z powrotem w rejestrze docelowym Rd.
Znacznik C w SREG nie jest zmieniany przez tę operację, co pozwala na używanie instrukcji INC w liczniku pętli przy obliczeniach o zwielokrotnionej precyzji.
Gdy działanie wykonywane jest na liczbach bez znaku, tylko skoki względne BREQ i BRNE będą działać spójnie z wynikiem. Gdy działanie dotyczy liczb ze znakiem, wszystkie skoki znakowe są do dyspozycji.

Działanie

                 
Rd ← Rd + 1

Składnia

 

Argumenty

 

Licznik rozkazów

INC Rd
  0 ≤ d ≤ 31   PC ← PC + 1

16-bitowy kod instrukcji

1001
010d
dddd
0011

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X X X X
S: N obrazek V
Dla testów liczb ze znakiem w kodzie U2
V: R7•R6R5R4R3R2R1R0
Ustawiany, jeśli w wyniku operacji powstał nadmiar U2. Nadmiar U2 powstaje wtedy i tylko wtedy, gdy przed operacją rejestr Rd miał wartość 0x7F.
N: R7
Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; w przeciwnym razie zerowany
Z: R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy Rd.

Przykładowy kod:

      clr r22     ; Zeruj r22
loop: inc r22     ; Zwiększ o 1 r22
      ...
      cpi r22,0x4F ; Porównaj r22 z 0x4f
      brne loop   ; Skocz, jeśli różne
      nop         ; Kontynuuje (nic nie rób) 

Liczba słów: 1 (2 bajty)

Cykle: 1

Na początek:  podrozdziału   strony 

JMPJump – Skok

Opis

Skok pod adres w obrębie całej pamięci programu (4M słów, 8MB). Zobacz również na RJMP.

Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.

Działanie

                          
PC ← k

Składnia

 

Argumenty

 

Licznik rozkazów

 

Stos

JMP k
  0 ≤ k < 4M   PC ← k   Niezmieniany

16-bitowy kod instrukcji

1001
010k
kkkk
110k
kkkk
kkkk
kkkk
kkkk

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

        mov r1,r0  ; Kopiuj r0 do r1
        jmp farplc ; Skok bezwarunkowy
        ...
farplc: nop        ; Miejsce docelowe skoku (nic nie rób) 

Liczba słów: 2 (4 bajty)

Cykle: 3

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2023 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.