Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy
Wałaszek |
©2023 mgr Jerzy Wałaszek
|
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 ©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.