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
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 ©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.