|
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 ← Rd - Rr - C | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBC Rd,Rr | 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | PC ← PC + 1 | ||
0000 |
10rd |
dddd |
rrrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | X | X | X | X | X | X |
| H: |
Rd3•Rr3+Rr3•R3+R3•Rd3 Ustawiany, jeśli była pożyczka z bitu 3; w przeciwnym razie zerowany |
| S: | N
Dla testów liczb ze znakiem w kodzie U2 |
| V: | Rd7•Rr7•R7+Rd7•Rr7•R7 Ustawiane, jeśli operacja doprowadza do przepełnienia U2; w przeciwnym razie 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 |
| C: |
Rd7•Rr7+Rr7•R7+R7•Rd7 Ustawiany, jeśli wartość bezwzględna zawartości Rr plus poprzednie przeniesienie jest większa niż wartość bezwzględna Rd; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
; Odejmij r1:r0 od r3:r2 sub r2,r0 ; Odejmij dolny bajt sbc r3,r1 ; Odejmij z przeniesieniem górny bajt |
Działanie |
||||
| Rd ← Rd - K - C | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBCI Rd,K | 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 | PC ← PC + 1 | ||
0100 |
KKKK |
dddd |
KKKK |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | X | X | X | X | X | X |
| H: |
Rd3•K3+K3•R3+R3•Rd3 Ustawiany, jeśli była pożyczka z bitu 3; w przeciwnym razie zerowany |
| S: | N
Dla testów liczb ze znakiem w kodzie U2 |
| V: | Rd7•K7•R7+Rd7•K7•R7 Ustawiane, jeśli operacja doprowadza do przepełnienia U2; w przeciwnym razie 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 |
| C: |
Rd7•K7+K7•R7+R7•Rd7 Ustawiany, jeśli wartość bezwzględna stałej plus poprzednie przeniesienie jest większa niż wartość bezwzględna Rd; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
; Odejmij 0x4F23 od r17:r16 subi r16,0x23 ; Odejmij dolny bajt sbci r17,0x4F ; Odejmij z przeniesieniem górny bajt |
Działanie |
||||
| I/O(A,b) ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBI A,b | 0 ≤ A ≤ 31, 0 ≤ b ≤7 | PC ← PC + 1 | ||
1001 |
1010 |
AAAA |
Abbb |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
out 0x1E,r0 ; Zapisz adres EEPROM sbi 0x1C,0 ; Ustaw bit odczytu w EECR in r1,0x1D ; Odczytaj dane z EEPROM |
Działanie |
||||
| Jeśli I/O(A,b) = 0, to PC ← PC + 2 (lub 3), inaczej PC ← PC + 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBIC A,b | 0 ≤ A ≤ 31, 0 ≤ b ≤7 | PC ← PC + 1, warunek fałszywy - bez
pominięcia PC ← PC + 2, pominięcie instrukcji o długości słowa PC ← PC + 3, pominięcie instrukcji o długości dwóch słów |
||
1001 |
1001 |
AAAA |
Abbb |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
e2wait: sbic 0x1C,1 ; Pomiń następną instrukcję, jeśli EEWE wyzerowane
rjmp e2wait ; zapis do EEPROM nie ukończony
nop ; Kontynuuj (nic nie rób)
|
Cykle: |
1, jeśli warunek niespełniony
(brak
pominięcia)
|
Działanie |
||||
| Jeśli I/O(A,b) = 1, to PC ← PC + 2 (lub 3), inaczej PC ← PC + 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBIS A,b | 0 ≤ A ≤ 31, 0 ≤ b ≤7 | PC ← PC + 1, warunek fałszywy - bez
pominięcia PC ← PC + 2, pominięcie instrukcji o długości słowa PC ← PC + 3, pominięcie instrukcji o długości dwóch słów |
||
1001 |
1011 |
AAAA |
Abbb |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
waitset: sbis 0x10,0 ; Pomiń następną instrukcję, jeśli bit 0 w porcie D jest ustawiony
rjmp waitset ; Bit nie jest ustawiony
nop ; Kontynuuj (nic nie rób)
|
Cykle: |
1, jeśli warunek niespełniony
(brak
pominięcia)
|
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach. Sprawdź w danych technicznych swojego urządzenia.
Działanie |
||||
| Rd+1:Rd ← Rd+1:Rd - K | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBIW Rd+1:Rd,K | d
|
PC ← PC + 1 | ||
1001 |
0111 |
KKdd |
KKKK |
| 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: | Rdh7•R15 Ustawiany, jeśli operacja doprowadza do przepełnienia U2; w przeciwnym razie zerowany |
| N: | R15 Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; w przeciwnym razie zerowany |
| 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• Rdh7 Ustawiany, jeśli wartość bezwzględna stałej K jest większa niż wartość bezwzględna Rd; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rdh:Rdl (Rdh7-Rdh0 = R15-R8, Rdl7-Rdl0=R7-R0).
sbiw r25:r24,1 ; Odejmij 1 od r25:r24
sbiw YH:YL,63 ; Odejmij 63 od wskaźnika Y (r29:r28)
|
Działanie |
||||
| Rd ← Rd v K | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBR Rd,K | 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 | PC ← PC + 1 | ||
0110 |
KKKK |
ddd |
KKKK |
| 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.
sbr r16,3 ; Ustaw bity 0 i 1 w r16 sbr r17,0xF0 ; Ustaw 4 górne bity w r17 |
Działanie |
||||
| Jeśli Rr(b) = 0, to PC ← PC + 2 (lub 3), inaczej PC ← PC + 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBRC Rr,b | 0 ≤ r ≤ 31, 0 ≤ b ≤7 | PC ← PC + 1, warunek fałszywy - bez
pominięcia PC ← PC + 2, pominięcie instrukcji o długości słowa PC ← PC + 3, pominięcie instrukcji o długości dwóch słów |
||
1111 |
110r |
rrrr |
0bbb |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
sub r0,r1 ; Odejmij r1 od r0
sbrc r0,7 ; Pomiń, jeśli bit 7 w r0 wyzerowany
sub r0,r1 ; Wykonywane tylko wtedy, gdy bit 7 w r0 nie jest wyzerowany
nop ; Kontynuuj (nic nie rób)
|
Cykle: |
1, jeśli warunek niespełniony
(brak
pominięcia)
|
Działanie |
||||
| Jeśli Rr(b) = 1, to PC ← PC + 2 (lub 3), inaczej PC ← PC + 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SBRS Rr,b | 0 ≤ r ≤ 31, 0 ≤ b ≤7 | PC ← PC + 1, warunek fałszywy - bez
pominięcia PC ← PC + 2, pominięcie instrukcji o długości słowa PC ← PC + 3, pominięcie instrukcji o długości dwóch słów |
||
1111 |
111r |
rrrr |
0bbb |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
sub r0,r1 ; Odejmij r1 od r0
sbrs r0,7 ; Pomiń, jeśli bit 7 w r0 ustawiony
neg r0 ; Wykonywane tylko wtedy, gdy bit 7 w r0 nie jest ustawiony
nop ; Kontynuuj (nic nie rób)
|
Cykle: |
1, jeśli warunek niespełniony
(brak
pominięcia)
|
Działanie |
||||
| C ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SEC | brak | PC ← PC + 1 | ||
1001 |
0100 |
0000 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | 1 |
| C: | 1 Ustawiany |
sec ; Ustaw znacznik przeniesienia adc r0,r1 ; r0=r0+r1+1 |
Działanie |
||||
| H ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SEH | brak | PC ← PC + 1 | ||
1001 |
0100 |
0101 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | 1 | – | – | – | – | – |
| H: | 1 Ustawiany |
seh ; Ustaw znacznik przeniesienia połówkowego |
Działanie |
||||
| I ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SEI | brak | PC ← PC + 1 | ||
1001 |
0100 |
0111 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| 1 | – | – | – | – | – | – | – |
| I: | 1 Ustawiany |
sei ; włącz globalnie przerwania
sleep ; wejdź w tryb uśpienia, oczekując na przerwanie
; uwaga: tryb uśpienia zostanie uaktywniony przed oczekującymi przerwaniami
|
Działanie |
||||
| N ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SEN | brak | PC ← PC + 1 | ||
1001 |
0100 |
0010 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | 1 | – | – |
| N: | 1 Ustawiany |
add r2,r19 ; Dodaj r19 do r2 sen ; Ustaw znacznik ujemnego wyniku |
Działanie |
||||
| Rd ← 0xFF | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SER Rd | 16 ≤ d ≤ 31 | PC ← PC + 1 | ||
1110 |
1111 |
dddd |
1111 |
| 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 ; Opóźnienie (nic nie rób)
out 0x18,r17 ; Zapisz jedynki do portu B
|
Działanie |
||||
| S ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SES | brak | PC ← PC + 1 | ||
1001 |
0100 |
0100 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | 1 | – | – | – | – |
| S: | 1 Ustawiany |
add r2,r19 ; Dodaj r19 do r2 ses ; Ustaw znacznik znaku |
Działanie |
||||
| T ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SET | brak | PC ← PC + 1 | ||
1001 |
0100 |
0110 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | 1 | – | – | – | – | – | – |
| T: | 1 Ustawiany |
set ; Ustaw znacznik T |
Działanie |
||||
| V ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SEV | brak | PC ← PC + 1 | ||
1001 |
0100 |
0011 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | 1 | – | – | – |
| V: | 1 Ustawiany |
add r2,r19 ; Dodaj r19 do r2 sev ; Ustaw znacznik nadmiaru |
Działanie |
||||
| Z ← 1 | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SEZ | brak | PC ← PC + 1 | ||
1001 |
0100 |
0001 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | 1 | – |
| Z: | 1 Ustawiany |
add r2,r19 ; Dodaj r19 do r2 sez ; Ustaw znacznik zera |
Działanie |
||||
| W dokumentacji mikrokontrolera
znajdziesz dokładny opis dostępnych trybów uśpienia |
||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SLEEP | brak | PC ← PC + 1 | ||
1001 |
0101 |
1000 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
mov r0,r11 ; Kopiuj r11 do r0
ldi r16,(1<<SE) ; Włącz tryb uśpienia
out MCUCR, r16
sleep ; Wprowadź mikrokontroler w tryb uśpienia
|
W dokumentacji swojego mikrokontrolera znajdziesz szczegółowy opis użycia SPM. Ta instrukcja może adresować całą pamięć programu.
Instrukcja nie jest dostępna na wszystkich mikrokontrolerach AVR. Sprawdź w ich danych technicznych.
(1) R1 określa górny bajt instrukcji, a R0 określa dolny bajt instrukcji.
Działanie |
Komentarz |
||||
| (i) (ii) (iii) (iv) (v) |
(RAMPZ:Z) ← 0xffff (RAMPZ:Z) ← R1:R0 (RAMPZ:Z) ← R1:R0 (RAMPZ:Z) ← TEMP BLBITS ← R1:R0 |
Wymazanie strony pamięci programu Zapis słowa pamięci programu Zapis do tymczasowego bufora strony Zapis tymczasowego bufora strony do pamięci programu Ustawienie bitów blokujących bootloadera |
|||
Składnia |
Argumenty |
Licznik rozkazów |
|||
| (i)...(v) | SPM | brak | PC ← PC + 1 | ||
1001 |
0101 |
1110 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
;Ten przykład pokazuje zapis za pomocą SPM jednej strony dla mikrokontrolerów ;z zapisem stron ;- procedura zapisuje jedną stronę danych z RAM do FLASH ; pierwsza komórka danych w RAM jest wskazywana przez wskaźnik Y ; pierwsza komórka danych we FLASH jest wskazywana przez wskaźnik Z ;- obsługa błędów nie jest dołączona ;- procedura musi być umieszczona wewnątrz obszaru bootowania ;- Używane rejestry: r0, r1, temp1, temp2, looplo, loophi, spmcrval ; (temp1, temp2, looplo, loophi, spmcrval muszą być zdefiniowane przez użytkownika) ; zachowywanie i odtwarzanie rejestrów nie jest dołączone do procedury ; użycie rejestrów można zoptymalizować kosztem rozmiaru kodu .equ PAGESIZEB = PAGESIZE*2 ;PAGESIZEB jest rozmiarem strony w bajtach, nie w słowach .org SMALLBOOTSTART write_page: ;wymazanie strony ldi spmcrval, (1<<PGERS) + (1<<SPMEN) call do_spm ;przenoszenie danych z RAM do bufora strony FLASH ldi looplo, low(PAGESIZEB) ;inicjuj zmienną pętli ldi loophi, high(PAGESIZEB);nie jest wymagane dla PAGESIZEB<=256 wrloop: ld r0, Y+ ld r1, Y+ ldi spmcrval, (1<<SPMEN) call do_spm adiw ZH:ZL, 2 sbiw loophi:looplo, 2;użyj subi dla PAGESIZEB<=256 brne wrloop ;wykonanie zapisu strony subi ZL, low(PAGESIZEB) ;odtwórz wskaźnik sbci ZH, high(PAGESIZEB);nie jest wymagane dla PAGESIZEB<=256 ldi spmcrval, (1<<PGWRT) + (1<<SPMEN) call do_spm ;odczyt z powrotem i sprawdzenie, opcjonalnie ldi looplo, low(PAGESIZEB) ;inicjuj zmienną pętli ldi loophi, high(PAGESIZEB);nie jest wymagane dla PAGESIZEB<=256 subi YL, low(PAGESIZEB) ;odtwórz wskaźnik sbci YH, high(PAGESIZEB) rdloop: lpm r0, Z+ ld r1, Y+ cpse r0, r1 jmp error sbiw loophi:looplo, 2 ;użyj subi dla PAGESIZEB<=256 brne rdloop ret do_spm: ;wejście: spmcrval określa działanie SPM ;wyłącz przerwania, jeśli są włączone, zachowaj rejestr stanu in temp2, SREG cli ;sprawdź zakończenie poprzedniej SPM wait: in temp1, SPMCR sbrc temp1, SPMEN rjmp wait ;czasowa sekwencja SPM out SPMCR, spmcrval spm ;odtwórz SREG (aby włączyć przerwania, jeśli pierwotnie były włączone) out SREG, temp2 ret |
Komórka danych jest wskazywana przez rejestr wskaźnikowy X (16 bitów) w zestawie rejestrów. Dostęp do pamięci ograniczony jest do bieżącego segmentu danych o rozmiarze 64KB. Aby otrzymać dostęp do innego segmentu danych na mikrokontrolerach z przestrzenią danych większą od 64 KB, należy zmienić zawartość rejestru RAMPX w obszarze we/wy.
Rejestr wskaźnikowy X może albo pozostać niezmieniony przez tę operację, albo może on być postinkrementowany (zwiększany o 1 po operacji) lub predekrementowany (zmniejszany o 1 przed operacją).
Te cechy są szczególnie przydatne przy dostępie do ciągów, tablic oraz używania rejestru X w charakterze wskaźnika stosu. Zwróć uwagę, iż na mikrokontrolerach z przestrzenią danych nie większą niż 256 bajtów modyfikowany jest tylko dolny bajt wskaźnika X. Takie mikrokontrolery nie wykorzystują górnego bajta w tej instrukcji i można go wykorzystać do innych celów. Rejestr RAMPX w obszarze we/wy jest modyfikowany w mikrokontrolerach z przestrzenią danych lub z pamięcią programu większą niż 64KB, a zwiększanie/zmniejszanie odnosi się do całego 24-bitowego adresu.
Nie wszystkie warianty tej instrukcji są dostępne we wszystkich mikrokontrolerach. Sprawdź w spisie rozkazów swojego mikrokontrolera, który znajdziesz w jego danych technicznych.
Wynik poniższych kombinacji argumentów jest nieokreślony:
ST X+, r26 ST X+, r27 ST -X, r26 ST -X, r27 |
Działanie |
Komentarz |
||||
| (i) (ii) (iii) |
(X) ← Rr (X) ← Rr X ← X+1 X ← X - 1 (X) ← Rr |
X: bez zmian X: postinkrementowany X: predekrementowany |
|||
Składnia |
Argumenty |
Licznik rozkazów |
|||
| (i) (ii) (iii) |
ST X, Rr ST X+, Rr ST -X, Rr |
0 ≤ r ≤ 31 0 ≤ r ≤ 31 0 ≤ r ≤ 31 |
PC ← PC + 1 PC ← PC + 1 PC ← PC + 1 |
||
(i)
|
1001 |
001r |
rrrr |
1100 |
(ii)
|
1001 |
001r |
rrrr |
1101 |
(iii)
|
1001 |
001r |
rrrr |
1110 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
clr r27 ; Zeruj górny bajt indeksu X ldi r26,0x60 ; Ustaw dolny bajt indeksu X na 0x60 st X+,r0 ; Umieść r0 w komórce danych o adresie 0x60(X postinkrementowany) st X,r1 ; Umieść r1 w komórce danych o adresie 0x61 ldi r26,0x63 ; Ustaw dolny bajt indeksu X na 0x63 st X,r2 ; Umieść r2 w komórce danych o adresie 0x63 st -X,r3 ; Umieść r3 w komórce danych o adresie 0x62(X predekrementowany) |
Komórka danych jest wskazywana przez rejestr wskaźnikowy Y (16 bitów) w zestawie rejestrów. Dostęp do pamięci ograniczony jest do bieżącego segmentu danych o rozmiarze 64KB. Aby otrzymać dostęp do innego segmentu danych na mikrokontrolerach z przestrzenią danych większą od 64 KB, należy zmienić zawartość rejestru RAMPY w obszarze we/wy.
Rejestr wskaźnikowy Y może albo pozostać niezmieniony przez tę operację, albo może on być postinkrementowany (zwiększany o 1 po operacji) lub predekrementowany (zmniejszany o 1 przed operacją).
Te cechy są szczególnie przydatne przy dostępie do ciągów, tablic oraz używania rejestru Y w charakterze wskaźnika stosu. Zwróć uwagę, iż na mikrokontrolerach z przestrzenią danych nie większą niż 256 bajtów modyfikowany jest tylko dolny bajt wskaźnika Y. Takie mikrokontrolery nie wykorzystują górnego bajta w tej instrukcji i można go wykorzystać do innych celów. Rejestr RAMPY w obszarze we/wy jest modyfikowany w mikrokontrolerach z przestrzenią danych lub z pamięcią programu większą niż 64KB, a zwiększanie/zmniejszanie odnosi się do całego 24-bitowego adresu.
Nie wszystkie warianty tej instrukcji są dostępne we wszystkich mikrokontrolerach. Sprawdź w spisie rozkazów swojego mikrokontrolera, który znajdziesz w jego danych technicznych.
Wynik poniższych kombinacji argumentów jest nieokreślony:
ST Y+, r28 ST Y+, r29 ST -Y, r28 ST -Y, r29 |
Działanie |
Komentarz |
||||
| (i) (ii) (iii) (iiii) |
(Y) ← Rr (Y) ← Rr Y ← Y+1 Y ← Y - 1 (Y) ← Rr (Y+q) ← Rr |
Y: bez zmian Y: postinkrementowany Y: predekrementowany Y: bez zmian, q: przesunięcie |
|||
Składnia |
Argumenty |
Licznik rozkazów |
|||
| (i) (ii) (iii) (iiii) |
ST Y, Rr ST Y+, Rr ST -Y, Rr STD Y+q, Rr |
0 ≤ r ≤ 31 0 ≤ r ≤ 31 0 ≤ r ≤ 31 0 ≤ r ≤ 31, 0 ≤ q ≤ 63 |
PC ← PC + 1 PC ← PC + 1 PC ← PC + 1 PC ← PC + 1 |
||
(i)
|
1001 |
001r |
rrrr |
1100 |
(ii)
|
1001 |
001r |
rrrr |
1101 |
(iii)
|
1001 |
001r |
rrrr |
1110 |
(iiii)
|
10q0 |
qq1r |
rrrr |
1qqq |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
clr r29 ; Zeruj górny bajt indeksu Y ldi r28,0x60 ; Ustaw dolny bajt indeksu Y na 0x60 st Y+,r0 ; Umieść r0 w komórce danych o adresie 0x60(Y postinkrementowany) st Y,r1 ; Umieść r1 w komórce danych o adresie 0x61 ldi r28,0x63 ; Ustaw dolny bajt indeksu Y na 0x63 st Y,r2 ; Umieść r2 w komórce danych o adresie 0x63 st -Y,r3 ; Umieść r3 w komórce danych o adresie 0x62(Y predekrementowany) std Y+2,r4 ; Umieść r4 w komórce danych o adresie 0x64 |
Komórka danych jest wskazywana przez rejestr wskaźnikowy Z (16 bitów) w zestawie rejestrów. Dostęp do pamięci ograniczony jest do bieżącego segmentu danych o rozmiarze 64KB. Aby otrzymać dostęp do innego segmentu danych na mikrokontrolerach z przestrzenią danych większą od 64 KB, należy zmienić zawartość rejestru RAMPZ w obszarze we/wy.
Rejestr wskaźnikowy Z może albo pozostać niezmieniony przez tę operację, albo może on być postinkrementowany (zwiększany o 1 po operacji) lub predekrementowany (zmniejszany o 1 przed operacją).
Te cechy są szczególnie przydatne przy dostępie do ciągów, tablic oraz używania rejestru Z w charakterze wskaźnika stosu. Zwróć uwagę, iż na mikrokontrolerach z przestrzenią danych nie większą niż 256 bajtów modyfikowany jest tylko dolny bajt wskaźnika Z. Takie mikrokontrolery nie wykorzystują górnego bajta w tej instrukcji i można go wykorzystać do innych celów. Rejestr RAMPZ w obszarze we/wy jest modyfikowany w mikrokontrolerach z przestrzenią danych lub z pamięcią programu większą niż 64KB, a zwiększanie/zmniejszanie odnosi się do całego 24-bitowego adresu.
Nie wszystkie warianty tej instrukcji są dostępne we wszystkich mikrokontrolerach. Sprawdź w spisie rozkazów swojego mikrokontrolera, który znajdziesz w jego danych technicznych.
Wynik poniższych kombinacji argumentów jest nieokreślony:
ST Z+, r30 ST Z+, r31 ST -Z, r30 ST -Z, r31 |
Działanie |
Komentarz |
||||
| (i) (ii) (iii) (iiii) |
(Z) ← Rr (Z) ← Rr Z ← Z+1 Z ← Z - 1 (Z) ← Rr (Z+q) ← Rr |
Z: bez zmian Z: postinkrementowany Z: predekrementowany Z: bez zmian, q: przesunięcie |
|||
Składnia |
Argumenty |
Licznik rozkazów |
|||
| (i) (ii) (iii) (iiii) |
ST Y, Rr ST Y+, Rr ST -Y, Rr STD Y+q, Rr |
0 ≤ r ≤ 31 0 ≤ r ≤ 31 0 ≤ r ≤ 31 0 ≤ r ≤ 31, 0 ≤ q ≤ 63 |
PC ← PC + 1 PC ← PC + 1 PC ← PC + 1 PC ← PC + 1 |
||
(i)
|
1000 |
001r |
rrrr |
0000 |
(ii)
|
1001 |
001r |
rrrr |
0001 |
(iii)
|
1001 |
001r |
rrrr |
0010 |
(iiii)
|
10q0 |
qq1r |
rrrr |
0qqq |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
clr r31 ; Zeruj górny bajt indeksu Z ldi r30,0x60 ; Ustaw dolny bajt indeksu Z na 0x60 st Z+,r0 ; Umieść r0 w komórce danych o adresie 0x60(Z postinkrementowany) st Z,r1 ; Umieść r1 w komórce danych o adresie 0x61 ldi r30,0x63 ; Ustaw dolny bajt indeksu Z na 0x63 st Z,r2 ; Umieść r2 w komórce danych o adresie 0x63 st -Z,r3 ; Umieść r3 w komórce danych o adresie 0x62(Z predekrementowany) std Z+2,r4 ; Umieść r4 w komórce danych o adresie 0x64 |
Musi być dostarczony 16-bitowy adres. Dostęp do pamięci jest ograniczony do bieżącego segmentu danych o rozmiarze 64KB. Instrukcja STS wykorzystuje rejestr RAMPD w obszarze we/wy, zatem dostęp do innych partii pamięci wymaga zmiany zawartości tego rejestru.
Ta instrukcja nie jest dostępna dla wszystkich mikrokontrolerów. Sprawdź listę instrukcji konkretnego modelu.
Działanie |
||||
| (k) ← Rr | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| STS k,Rr | 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535 | PC ← PC + 1 | ||
1001 |
001d |
dddd |
0000 |
kkkk |
kkkk |
kkkk |
kkkk |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
lds r2,0xFF00 ; Załaduj r2 zawartością komórki danych o adresie 0xFF00 add r2,r1 ; dodaj r1 do r2 sts 0xFF00,r2 ; Zapisz z powrotem w pamięci danych |
Działanie |
||||
| Rd ← Rd - Rr | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SUB Rd,Rr | 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | PC ← PC + 1 | ||
0001 |
10rd |
dddd |
rrrr |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | X | X | X | X | X | X |
| H: |
Rd3•Rr3+Rr3•R3+R3•Rd3 Ustawiany, jeśli była pożyczka z bitu 3; w przeciwnym razie zerowany |
| S: | N
Dla testów liczb ze znakiem w kodzie U2 |
| V: | Rd7•Rr7•R7+Rd7•Rr7•R7 Ustawiany, jeśli operacja spowodowała nadmiar U2; w przeciwnym razie 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 |
| C: |
Rd7•Rr7+Rr7•R7+R7•Rd7 Ustawiany, jeśli wartość bezwzględna Rr jest większa od wartości bezwzględnej Rd; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
sub r13,r12 ; Odejmij r12 od r13
brne noteq ; Skocz, jeśli r12<>r13
...
noteq: nop ; Miejsce docelowe skoku (nic nie rób)
|
Działanie |
||||
| Rd ← Rd - K | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SUBI Rd,K | 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 | PC ← PC + 1 | ||
0101 |
KKKK |
dddd |
KKKK |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | X | X | X | X | X | X |
| H: |
Rd3•K3+K3•R3+R3•Rd3 Ustawiany, jeśli była pożyczka z bitu 3; w przeciwnym razie zerowany |
| S: | N
Dla testów liczb ze znakiem w kodzie U2 |
| V: | Rd7•K7•R7+Rd7•K7•R7 Ustawiany, jeśli operacja spowodowała nadmiar U2; w przeciwnym razie 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 |
| C: |
Rd7•K7+K7•R7+R7•Rd7 Ustawiany, jeśli wartość bezwzględna stałej K jest większa od wartości bezwzględnej Rd; w przeciwnym razie zerowany |
Wynik R (ang. Result) po operacji jest równy Rd.
sub r22,0x11 ; Odejmij 0x11 od r22
brne noteq ; Skocz, jeśli r22<>0x11
...
noteq: nop ; Miejsce docelowe skoku (nic nie rób)
|
Działanie |
||||
| R(7:4) ← Rd(3:0), R(3:0) ← Rd(7:4) | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| SWAP Rd | 0 ≤ d ≤ 31 | PC ← PC + 1 | ||
1001 |
010d |
dddd |
0010 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
Wynik R (ang. Result) po operacji jest równy Rd.
inc r1 ; Zwiększ r1 o 1 swap r1 ; Zamień ze sobą 4 górne i 4 dolne bity rejestru r1 inc r1 ; Zwiększ 0 1 4 górne bity rejestru r1 swap r1 ; Zamień z powrotem |
Działanie |
||||
| Rd ← Rd • Rd | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| TST Rd | 0 ≤ d ≤ 31 | PC ← PC + 1 | ||
0010 |
00dd |
dddd |
dddd |
| 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.
tst r0 ; Testuj r0
breq zero ; Skocz, jeśli r0=0
...
zero: nop ; Miejsce docelowe skoku (nic nie rób)
|
Działanie |
||||
| Restart licznika zegarowego | ||||
Składnia |
Argumenty |
Licznik rozkazów |
||
| WDR | brak | PC ← PC + 1 | ||
1001 |
0101 |
1010 |
1000 |
| I | T | H | S | V | N | Z | C |
|---|---|---|---|---|---|---|---|
| – | – | – | – | – | – | – | – |
wdr ; Resetuj licznik zegarowy |
![]() |
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.