|
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
Działanie |
||||
| Rd ← Rr | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| MOV Rd,Rr | x0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | PC ← PC + 1 | ||
0010 |
11rd |
dddd |
rrrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
mov r16,r0 ; Kopiuj r0 do r16
call check ; Wywołaj podprogram
...
check: cpi r16,0x11 ; Porównaj r16 z 0x11
...
ret ; Wróć z podprogramu
|
Instrukcja nie jest dostępna we wszystkich mikrokontrolerach. Sprawdź listę instrukcji swojego modelu.
Działanie |
||||
| Rd+1:Rd ← Rr+1:Rr | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| MOVW Rd+1:Rd,Rr+1Rr | d
|
PC ← PC + 1 | ||
0000 |
0001 |
dddd |
rrrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
movw r17:16,r1:r0 ; Kopiuj r1:r0 do r17:r16
call check ; Wywołaj podprogram
...
check: cpi r16,0x11 ; Porównaj r16 z 0x11
...
cpi r17,0x32 ; Porównaj r17 z 0x32
...
ret ; Wróć z podprogramu
|

Mnożna Rd i mnożnik Rr są dwoma rejestrami zawierającymi liczby bez znaku. 16-bitowy iloczyn bez znaku jest umieszczany w R1 (górny bajt, MSB) i R0 (dolny bajt, LSB). Zwróć uwagę, że jeśli mnożna lub mnożnik zostaną wybrane z R0 lub R1, to wynik mnożenia nadpisze zawartość tych rejestrów.
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.
Działanie |
||||
| R1:R0 ← Rd × Rr (bez znaku ← bez znaku × bez znaku) | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| MUL Rd,Rr | 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | PC ← PC + 1 | ||
1001 |
11rd |
dddd |
rrrr |
| 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: |
R15 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.
mul r5,r4 ; Pomnóż bezznakowo r5 i r4 movw r4,r0 ; Skopiuj wynik z powrotem do r5:r4 |

Mnożna Rd i mnożnik Rr są dwoma rejestrami zawierającymi liczby ze znakiem. 16-bitowy iloczyn ze znakiem jest umieszczany w R1 (górny bajt, MSB) i R0 (dolny bajt, LSB).
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.
Działanie |
||||
| R1:R0 ← Rd × Rr (ze znakiem ← ze znakiem × ze znakiem) | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| MULS Rd,Rr | 16 ≤ d ≤ 31, 16 ≤ r ≤ 31 | PC ← PC + 1 | ||
0000 |
0010 |
dddd |
rrrr |
| 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: |
R15 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.
muls r21,r20 ; Pomnóż bezznakowo r21 i r20 movw r20,r0 ; Skopiuj wynik z powrotem do r21:r20 |

Mnożna Rd i mnożnik Rr są dwoma rejestrami. Mnożna Rd jest 8-bitową liczbą ze znakiem w kodzie U2, a mnożnik Rr jest 8-bitową liczbą bez znaku. 16-bitowy iloczyn ze znakiem jest umieszczany w R1 (górny bajt, MSB) i R0 (dolny bajt, LSB).
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.
Działanie |
||||
| R1:R0 ← Rd × Rr (ze znakiem ← ze znakiem × bez znaku) | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| MULSU Rd,Rr | 16 ≤ d ≤ 23, 16 ≤ r ≤ 23 | PC ← PC + 1 | ||
0000 |
0011 |
0ddd |
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: |
R15 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 dwóch 16-bitowych liczb z 32-bitowym wynikiem
;* UŻYCIE
;*r19:r18:r17:r16 = r23:r22 * r21:r20
;******************************************************************************
muls16x16_32:
clr r2
muls r23, r21 ; (ze znakiem)ah * (ze znakiem)bh
movw r19:r18, r1:r0
mul r22, r20; al * bl
movw r17:r16, r1:r0
mulsu r23, r20 ; (ze znakiem)ah * bl
sbc r19, r2
add r17, r0
adc r18, r1
adc r19, r2
mulsu r21, r22 ; (ze znakiem)bh * al
sbc r19, r2
add r17, r0
adc r18, r1
adc r19, r2
ret
|
Działanie |
||||
| Rd ← 0x00 - Rd | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| NEG Rd | 0 ≤ d ≤ 31 | PC ← PC + 1 | ||
1001 |
010d |
0ddd |
0001 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | X | X | X | X | X | X |
| H: |
R3+Rd3 Ustawiany, jeśli była pożyczka z bitu 3; zerowany w przypadku przeciwnym. |
| S: |
N
Dla testów liczb ze znakiem |
| V: |
R7•R6•R5•R4•R3•R2•R1•R0 Ustawiany, jeśli powstanie nadmiar U2 z implikowanego odejmowania od zera; zerowany w przypadku przeciwnym.. Nadmiar U2 wystąpi tylko wtedy, gdy zawartość rejestru po operacji będzie równa 0x80. |
| N: |
R7 Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; zerowany w przypadku przeciwnym. |
| Z: |
R7•R6•R5•R4•R3•R2•R1•R0 Ustawiany, jeśli wynikiem jest 0x00; zerowany w przypadku przeciwnym. |
| C: |
R7 + R6 + R5 + R4 + R3 + R2 + R1 + R0 Ustawiany, jeśli wystąpi pożyczka z implikowanego odejmowania od zera; zerowany w przypadku przeciwnym. Znacznik C będzie ustawiony we wszystkich przypadkach z wyjątkiem zawartości rejestru po operacji równej 0x00. |
Wynik R (ang. Result) po operacji jest równy Rd.
sub r11,r0 ; Odejmij r0 od r11
brpl positive ; Skocz, jeśli wynik dodatni
neg r11 ; Zaneguj arytmetycznie r11
positive: nop ; Miejsce docelowe skoku (nic nie rób)
|
Działanie |
||||
| brak | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| NOP | brak | PC ← PC + 1 | ||
0000 |
0000 |
0000 |
0000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
clr r16 ; Zeruj r16
ser r17 ; Ustaw r17
out 0x18,r16 ; Zapisz zera do portu B
nop ; Czekaj 1 cykl (nic nie rób)
out 0x18,r17 ; Zapisz jedynki do portu B
|
Działanie |
||||
| Rd ← Rd v Rr | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| OR Rd,Rr | 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | PC ← PC + 1 | ||
0010 |
10rd |
dddd |
rrrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | X | 0 | X | X | – |
| S: |
N
Dla testów liczb ze znakiem |
| V: |
0 Zerowany |
| N: |
R7 Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; zerowany w przypadku przeciwnym. |
| Z: |
R7•R6•R5•R4•R3•R2•R1•R0 Ustawiany, jeśli wynikiem jest 0x00; zerowany w przypadku przeciwnym. |
Wynik R (ang. Result) po operacji jest równy Rd.
or r15,r16 ; Wykonaj bitową alternatywę pomiędzy rejestrami
bst r15,6 ; Zachowaj bit 6 z r15 w znaczniku T
brts ok ; Skocz, jeśli znacznik T jest ustawiony
...
ok: nop ; Miejsce docelowe skoku (nic nie rób)
|
Działanie |
||||
| Rd ← Rd v K | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| OR Rd,K | 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 | PC ← PC + 1 | ||
0110 |
KKKK |
dddd |
KKKK |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | X | 0 | X | X | – |
| S: |
N
Dla testów liczb ze znakiem |
| V: |
0 Zerowany |
| N: |
R7 Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; zerowany w przypadku przeciwnym. |
| Z: |
R7•R6•R5•R4•R3•R2•R1•R0 Ustawiany, jeśli wynikiem jest 0x00; zerowany w przypadku przeciwnym. |
Wynik R (ang. Result) po operacji jest równy Rd.
ori r16,0xF0 ; Ustaw górne 4 bity w r16 ori r17,1 ; Ustaw bit 0 w r17 |
Działanie |
||||
| I/O(A) ← Rr | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| OUT A,Rr | 0 ≤ r ≤ 31, 0 ≤ A ≤ 63 | PC ← PC + 1 | ||
1011 |
1AAr |
rrrr |
AAAA |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
clr r16 ; Zeruj r16
ser r17 ; Ustaw r17
out 0x18,r16 ; Zapisz zera do portu B
nop ; Czekaj 1 cykl (nic nie rób)
out 0x18,r17 ; Zapisz jedynki do portu B
|
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.
Działanie |
||||||
| Rd ← STACK | ||||||
Składnia |
Argumenty |
Licznik rozkazów |
Wskaźnik stosu |
|||
| POP Rd | 0 ≤ d ≤ 31 | PC ← PC + 1 | SP ← SP + 1 | |||
1001 |
000d |
dddd |
1111 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
call routine ; Wywołaj podprogram
...
routine: push r14 ; Zapamiętaj r14 na stosie
push r13 ; Zapamiętaj r13 na stosie
...
pop r13 ; Przywróć r13
pop r14 ; Przywróć r14
ret ; Wróć z podprogramu
|
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.
Działanie |
||||||
| STACK ← Rr | ||||||
Składnia |
Argumenty |
Licznik rozkazów |
Wskaźnik stosu |
|||
| PUSH Rr | 0 ≤ r ≤ 31 | PC ← PC + 1 | SP ← SP - 1 | |||
1001 |
001r |
rrrr |
1111 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
call routine ; Wywołaj podprogram
...
routine: push r14 ; Zapamiętaj r14 na stosie
push r13 ; Zapamiętaj r13 na stosie
...
pop r13 ; Przywróć r13
pop r14 ; Przywróć r14
ret ; Wróć z podprogramu
|
Działanie |
|||||||
| (i) (ii) |
PC ← PC + k + 1 Mikrokontrolery z
16-bitowym PC, maksymalnie 128KB pamięci programu PC ← PC + k + 1 Mikrokontrolery z 22-bitowym PC, maksymalnie 8MB pamięci programu |
||||||
Składnia |
Argumenty |
Licznik rozkazów |
Wskaźnik stosu |
||||
| (i) (ii) |
RCALL k RCALL k |
-2K ≤ k < 2K -2K ≤ k < 2K |
PC ← PC + k + 1 PC ← PC + k + 1 |
STACK ← PC + 1 SP ← SP - 2 (2 bajty, 16 bitów) STACK ← PC + 1 SP ← SP - 3 (3 bajty, 22 bity) |
|||
1101 |
kkkk |
kkkk |
kkkk |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
rcall routine ; Wywołaj podprogram
...
routine: push r14 ; Zachowaj r14 na stosie
...
pop r14 ; Przywróć r14
ret ; Powróć z podprogramu
|
Cykle: |
3 Mikrokontrolery z 16-bitowymi PC
|
Działanie |
|||||||
| (i) (ii) |
PC(15:0) ← STACK Mikrokontrolery z
16-bitowymi PC, 128KB pamięci programu maksimum PC(21:0) ← STACK Mikrokontrolery z 22-bitowymi PC, 8MB pamięci programu maksimum |
||||||
Składnia |
Argumenty |
Licznik rozkazów |
Wskaźnik stosu |
||||
| (i) (ii) |
RET RET |
brak brak |
Zobacz na działanie Zobacz na działanie |
SP ← SP + 2 (2 bajty, 16 bitów) SP ← SP + 3 (3 bajty, 22 bity) |
|||
1001 |
0101 |
0000 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
call routine ; Wywołaj podprogram
...
routine: push r14 ; Zachowaj r14 na stosie
...
pop r14 ; Przywróć r14
ret ; Powróć z podprogramu
|
Cykle: |
4 Mikrokontrolery z 16-bitowymi PC
|
Zwróć uwagę, iż rejestr stanu nie zostaje automatycznie zachowany przy wejściu do procedury obsługi przerwania, a również nie jest on odtwarzany przy powrocie z tej procedury. Musi to być wykonywane przez program aplikacji. Wskaźnik stosu używa schematu preinkrementacji (wcześniejszego zwiększenia o 1) podczas RETI.
Działanie |
|||||||
| (i) (ii) |
PC(15:0) ← STACK Mikrokontrolery z
16-bitowymi PC, 128KB pamięci programu maksimum PC(21:0) ← STACK Mikrokontrolery z 22-bitowymi PC, 8MB pamięci programu maksimum |
||||||
Składnia |
Argumenty |
Licznik rozkazów |
Wskaźnik stosu |
||||
| (i) (ii) |
RETI RETI |
brak brak |
Zobacz na działanie Zobacz na działanie |
SP ← SP + 2 (2 bajty, 16 bitów) SP ← SP + 3 (3 bajty, 22 bity) |
|||
1001 |
0101 |
0001 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| 1 | – | – | – | – | – | – | – |
| I: |
1 Ustawiany |
...
extint: push r0 ; Zachowaj r0 na stosie
...
pop r0 ; Odtwórz r0
reti ; Wróć i uaktywnij przerwania
|
Cykle: |
4 Mikrokontrolery z 16-bitowymi PC
|
Działanie |
||||||
| PC ← PC + k + 1 | ||||||
Składnia |
Argumenty |
Licznik rozkazów |
Wskaźnik stosu |
|||
| RJMP k | -2K ≤ k < 2K | PC ← PC + k + 1 | nie zmieniany | |||
1100 |
kkkk |
kkkk |
kkkk |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
cpi r16,0x42 ; Porównaj r16 z 0x42
brne error ; Skocz, jeśli r16 <> 0x42
rjmp ok ; Skok bezwarunkowy
error: add r16,r17 ; Dodaj r17 do r16
inc r16 ; Zwiększ o 1 r16
ok: nop ; Miejsce docelowe dla for rjmp (nic nie rób)
|
Działanie |
||||
![]() |
||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| ROL Rd | 0 ≤ d ≤ 31 | PC ← PC + k + 1 | ||
0001 |
11dd |
dddd |
dddd |
(Zobacz na ADC Rd,Rd)
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | X | X | X | X | X | X |
| H: | Rd3 |
| S: | N
Dla testów liczb ze znakiem w kodzie U2 |
| V: | N
(Dla N i C po wykonaniu przesunięcia) |
| 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 |
| C: | Rd7 Ustawiany, jeśli przed przesunięciem najstarszy bit Rd był ustawiony; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
lsl r18 ; Pomnóż r19:r18 przez dwa
rol r19 ; r19:r18 jest liczbą całkowitą ze znakiem lub bez znaku
brcs oneenc ; Skocz, jeśli ustawione przeniesienie
...
oneenc: nop ; Miejsce docelowe skoku (nic nie rób)
|
Działanie |
||||
![]() |
||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| ROR Rd | 0 ≤ d ≤ 31 | PC ← PC + k + 1 | ||
1001 |
010d |
dddd |
0111 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | X | X | X | X | X |
| S: | N
Dla testów liczb ze znakiem w kodzie U2 |
| V: | N
(Dla N i C po wykonaniu przesunięcia) |
| 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 |
| C: | Rd0 Ustawiany, jeśli przed przesunięciem najmłodszy bit Rd był ustawiony; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
lsr r19 ; Podziel r19:r18 przez dwa
ror r18 ; r19:r18 jest dwubajtową liczbą całkowitą bez znaku
brcc zeroenc1 ; Skocz, jeśli przeniesienie wyzerowane
asr r17 ; Podziel r17:r16 przez dwa
ror r16 ; r17:r16 jest dwubajtową liczbą całkowitą ze znakiem
brcc zeroenc2 ; Skocz, jeśli przeniesienie wyzerowane
...
zeroenc1: nop ; Miejsce docelowe skoku (nic nie rób)
...
zeroenc2: 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.