|
Wyjście Spis treści Wstecz Dalej
Autor artykułu |
©2026 mgr Jerzy Wałaszek
|

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:
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
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 |
1001 |
010d |
dddd |
1010 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | X | X | X | X | – |
| S: | N
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: |
R7•R6•R5•R4•R3•R2•R1•R0 Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
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)
|
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) |
|||
1001 |
0101 |
0001 |
1001 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
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 |
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 | |||
1001 |
0100 |
0001 |
1001 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
ldi r16,0x05 ; Ustaw EIND i wskaźnik-Z out EIND,r16 ldi r30,0x00 ldi r31,0x10 eijmp ; Skocz do adresu 0x051000 |
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 |
||
(i)
|
1001 |
0101 |
0001 |
1001 |
(ii)
|
1001 |
000d |
dddd |
0110 |
(iii)
|
1001 |
000d |
dddd |
0111 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
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 |
Działanie |
||||
| Rd ← Rd
|
||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| EOR Rd,Rr | 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | PC ← PC + 1 | ||
0010 |
01rd |
dddd |
rrrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | X | 0 | X | X | – |
| S: | N
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: |
R7•R6•R5•R4•R3•R2•R1•R0 Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
eor r4,r4 ; Zeruj r4 eor r0,r22 ; Bitowa suma symetryczna pomiędzy r0 i r22 |

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
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 | ||
0000 |
0011 |
0ddd |
1rrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | X | X |
| Z: |
R15•R14•R13•R12•R11•R10•R9•R8•R7•R6•R5•R4•R3•R2•R1•R0 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.
;****************************************************************************** ;* 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 |

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
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 | ||
0000 |
0011 |
1ddd |
0rrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | X | X |
| Z: |
R15•R14•R13•R12•R11•R10•R9•R8•R7•R6•R5•R4•R3•R2•R1•R0 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.
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 |

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
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 | ||
0000 |
0011 |
1ddd |
1rrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | X | X |
| Z: |
R15•R14•R13•R12•R11•R10•R9•R8•R7•R6•R5•R4•R3•R2•R1•R0 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.
;****************************************************************************** ;* 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 |
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) |
|||
1001 |
0101 |
0000 |
1001 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
mov r30,r0 ; Ustaw przesunięcie w tablicy wywołań icall ; Wywołaj podprogram wskazany przez r31:r30 |
Cykle: |
3 mikrokontrolery z 16-bitowym PC
|
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 | |||
1001 |
0100 |
0000 |
1001 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
mov r30,r0 ; Ustaw przesunięcie w tablicy skoków ijmp ; Skocz pod adres wskazany przez r31:r30 |
Działanie |
||||
| Rd ← I/O(A) | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| IN Rd,A |
0 ≤ d ≤ 31, 0 ≤ A ≤ 63 |
PC ← PC + 1 | ||
1011 |
0AAd |
dddd |
AAAA |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
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)
|
Działanie |
||||
| Rd ← Rd + 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| INC Rd |
0 ≤ d ≤ 31 | PC ← PC + 1 | ||
1001 |
010d |
dddd |
0011 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | X | X | X | X | – |
| S: | N
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. 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: |
R7•R6•R5•R4•R3•R2•R1•R0 Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
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)
|
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 | |||
1001 |
010k |
kkkk |
110k |
kkkk |
kkkk |
kkkk |
kkkk |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
mov r1,r0 ; Kopiuj r0 do r1
jmp farplc ; Skok bezwarunkowy
...
farplc: nop ; Miejsce docelowe skoku (nic nie rób)
|
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.