Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
SPIS TREŚCI |
Podrozdziały |
Model | Pamięć programu | Pamięć danych | Porty we/wy |
Przetwornik A/C 10 bitów |
MSPP | USART | Inne | CPP/ PWM |
Timery 8/16-bitowe |
Obudowy | Końcówki | ||
Typ | Rozmiar | RAM | EEPROM | ||||||||||
PIC18F1220 | FLASH | 4K | 256B | 256 B | 16 | 7 | — | 1 | 6x PMM | 1 | 1/3 | DIP, SOIC, SSOP, QFN | 18 |
PIC18F1320 | FLASH | 8K | 256B | 256B | 16 | 7 | — | 1 | 6x PMM | 1 | 1/3 | DIP, SOIC, SSOP, QFN | 18 |
PIC18F2220 | FLASH | 4K | 512B | 256B | 23 | 10 | I2C/SPI | 1 | 6x PMM | 2 | 1/3 | DIP, SOIC | 28 |
PIC18F2320 | FLASH | 8K | 512B | 256B | 23 | 10 | I2C/SPI | 1 | 6x PMM | 2 | 1/3 | DIP, SOIC | 28 |
PIC18C242 | OTP | 16K | 512B | — | 23 | 5 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, SOIC | 28 |
PIC18C252 | OTP | 32K | 1536 | — | 23 | 5 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, SOIC | 28 |
PIC18F242 | FLASH | 16K | 512B | 256B | 23 | 5 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, SOIC, SSOP | 28 |
PIC18F252 | FLASH | 32K | 1536B | 256B | 23 | 5 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, SOIC, SSOP | 28 |
PIC18F258 | FLASH | 32K | 1536B | 256B | 22 | 5 | I2C/SPI | 1 | CAN 2.0B | 1 | 1/3 | DIP, SOIC | 28 |
PIC18F4220 | FLASH | 4K | 512B | 256B | 34 | 13 | I2C/SPI | 1 | 6xPMM | 2 | 1/3 | DIP, TQFP, QFN | 40/44 |
PIC18F4320 | FLASH | 8K | 512B | 256B | 34 | 13 | I2C/SPI | 1 | 6x PMM | 2 | 1/3 | DIP, TQFP, QFN | 40/44 |
PIC18C442 | OTP | 16K | 512B | — | 34 | 8 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, PLCC, TQFP | 40/44 |
PIC18C452 | OTP | 32K | 1536B | — | 34 | 8 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, PLCC, TQFP | 40/44 |
PIC18F442 | FLASH | 16K | 512B | 256B | 34 | 8 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, PLCC, TQFP | 40/44 |
PIC18F452 | FLASH | 32K | 1536B | 256B | 34 | 8 | I2C/SPI | 1 | — | 2 | 1/3 | DIP, PLCC, TQFP | 40/44 |
PIC18F458 | FLASH | 32K | 1536B | 256B | 33 | 5 | I2C/SPI | 1 | CAN 2.0B | 1 | 1/3 | DIP, PLCC, TQFP | 40/44 |
PIC18C601 | — | bez ROM | 1536B | — | 31 | 8 | I2C/SPI | 1 | — | 2 | 1/3 | PLCC, TQFP | 64/68 |
PIC18C658 | OTP | 32K | 1536B | — | 52 | 12 | I2C/SPI | 1 | CAN 2.0B | 2 | 1/3 | PLCC, TQFP | 64/68 |
PIC18F6520 | FLASH | 32K | 2048B | 1024B | 52 | 12 | I2C/SPI | 2 | — | 5 | 2/3 | TQFP | 64 |
PIC18F6620 | FLASH | 64K | 3840B | 1024B | 52 | 12 | I2C/SPI | 2 | — | 5 | 2/3 | TQFP | 64 |
PIC18F6720 | FLASH | 128K | 3840B | 1024B | 52 | 12 | I2C/SPI | 2 | — | 5 | 2/3 | TQFP | 64 |
PIC18C801 | — | bez ROM | 1536B | — | 42 | 12 | I2C/SPI | 1 | — | 2 | 1/3 | PLCC, TQFP | 80/84 |
PIC18C858 | OTP | 32K | 1536B | — | 68 | 16 | I2C/SPI | 1 | CAN 2.0B | 2 | 1/3 | PLCC, TQFP | 80/84 |
PIC18F8520 | FLASH | 32K | 2048B | 1024B | 68 | 16 | I2C/SPI | 2 | EMA | 5 | 2/3 | TQFP | 80 |
PIC18F8620 | FLASH | 64K | 3840B | 1024B | 68 | 16 | I2C/SPI | 2 | EMA | 5 | 2/3 | TQFP | 80 |
PIC18F8720 | FLASH | 128K | 3840B | 1024B | 68 | 16 | I2C/SPI | 2 | EMA | 5 | 2/3 | TQFP | 80 |
Z powyższego rysunku wynika, iż magistrala adresowa pamięci programu ma szerokość 21 bitów, co pozwala zaadresować 221 bajtów, czyli 2MB. Ponieważ prawie wszystkie instrukcje mikrokontrolera PIC18 mają długość 16 bitów, to w celu zapewnienia ich pobrania w jednym takcie zegarowym magistrala instrukcji ma szerokość 16 bitów.
W przypadku pamięci danych magistrala adresowa ma szerokość 12 bitów, co umożliwia zaadresowanie 212 = 4096 komórek, zwanych tutaj rejestrami. Magistrala danych jest 8-bitowa, zatem mikrokontroler PIC18 jest układem 8-bitowym.
Komórki pamięci danych nazywane są rejestrami, rejestrami pliku (ang. file registers), lub rejestrami ogólnego przeznaczenia (ang. General Purpose Registers, GPR). W obszarze pliku rejestrów umieszczone są również rejestry o specjalnych funkcjach (ang. Special Function Registers, SFR). Rejestry te umożliwiają mikrokontrolerowi sterowanie modułami peryferyjnymi. Z powodu ograniczeń nałożonych na rozmiar instrukcji, adresy rejestrów są zwykle 8-bitowe, co umożliwia zaadresowanie 256 rejestrów (00h...FFh). Aby zatem zaadresować całą pamięć RAM, została ona podzielona na 16 banków, po 256 rejestrów w każdym. Wybór banku dokonywany jest przy pomocy rejestru BSR (ang. Bank Select Register). Jest to rejestr 4 bitowy i może on przechowywać numery banków od 0h do Fh. Wszystkie rejestry funkcji specjalnych SFR są obecne na końcu obszaru pamięci w banku 15, co umożliwia równoległy dostęp również do rejestrów ogólnych GPR. Poniższy rysunek przedstawia typową organizację obszaru pamięci danych w PIC18:
Bank dostępowy (ang. Access Bank) jest zawsze dostępny dla procesora i zawiera 128 rejestrów GPR z samego początku pamięci oraz 128 rejestrów SFR z końca pamięci danych.
Więcej informacji na ten temat znajdziesz w instrukcjach konkretnych mikrokontrolerów PIC.
Instrukcje PIC18 dzielą się na pięć głównych typów:
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod operacji | d | a | 8-bitowy adres rejestru |
Instrukcja ma długość 16 bitów, z których 8 bitów przeznaczone jest na adres argumentu w pamięci danych, jeden bit określający bank pamięci oraz jeden bit określający miejsce docelowe wyniku operacji. Pozostałe sześć bitów określa rodzaj operacji do wykonania.
d = 0: wynik będzie umieszczony w rejestrze roboczym WREG
(akumulator)
d = 1: wynik zostanie umieszczony w rejestrze w pamięci danych
a = 0: będzie wymuszony bank dostępowy (ang. access bank)
a = 1: do wyboru banku zostanie użyty rejestr BSR (ang. Bank
Select Register)
Tylko jedna instrukcja wykorzystuje ten format (MOVFF f1, f2). Instrukcja ma długość 32 bitów, w których zawarte są dwa pełne 12 bitowe adresy rejestrów w pamięci danych oraz 4-bitowy kod operacji:
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod op. | 12-bitowy adres rejestru źródłowego |
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
1 | 1 | 1 | 1 | 12-bitowy adres rejestru docelowego |
Instrukcja używa 8 bitów na adres rejestru, jeden bit do określenia używanego banku, 3 bity do określenia numeru bitu, którego dotyczy operacja oraz pozostałych 4 bitów na kod operacji.
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod op. | b | a | 8-bitowy adres rejestru |
b = 0...7: numer bitu w rejestrze
a = 0: będzie wymuszony bank dostępowy (ang. access bank)
a = 1: do wyboru banku zostanie użyty rejestr BSR (ang. Bank
Select Register)
W tych instrukcjach argument określony jest bezpośrednio jako stała 8-bitowa.
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod operacji | 8-bitowa stała |
W tej grupie znajdują się instrukcje skoków oraz pozostałe instrukcje, których nie da się zaliczyć do powyższych grup.
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod operacji | 20-bitowa stała adresu | ||||||||||||||
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
1 | 1 | 1 | 1 | 20-bitowa stała adresu |
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod operacji | S | 20-bitowa stała adresu | |||||||||||||
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
1 | 1 | 1 | 1 | 20-bitowa stała adresu |
S = 1: zostają zapamiętane w rejestrach pomocniczych rejestry: WREG, STATUS i
BSR, co pozwala przywrócić ich zawartość przy powrocie z podprogramu.
S = 0: żadne rejestry nie są zapamiętywane.
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod operacji | 11-bitowa stała ze znakiem |
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod operacji | 8-bitowa stała ze znakiem |
15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
kod operacji |
Mikrokontroler PIC18 posiada 77 instrukcji, z których 4 jest 32-bitowe, a wszystkie pozostałe są 16-bitowe. W poniższej tabelce umieszczone są wszystkie instrukcje maszynowe PIC18.
Mnemonik | arg | Opis | Cykle roz. |
16-bitowe słowo instrukcji | Znaczniki | Uwagi | |
Operacje bajtowe na rejestrach | |||||||
ADDWF | f,d,a | Dodanie WREG do f | 1 | 0010 01da ffff ffff |
C, DC, Z, OV, N | 1, 2 | |
ADDWFC | f,d,a | Dodanie WREG i C do f | 1 | 0010 00da ffff ffff |
C, DC, Z, OV, N | 1, 2 | |
ANDWF | f,d,a | Koniunkcja WREG z f | 1 | 0001 01da ffff ffff |
Z, N | 1, 2 | |
CLRF | f,a | Zerowanie f | 1 | 0110 101a ffff ffff |
Z | 2 | |
COMF | f,d,a | Zanegowanie f | 1 | 0001 11da ffff ffff |
Z, N | 1, 2 | |
CPFSEQ | f,a | Porównanie f z WREG, pominięcie przy = | 1 (2 lub 3) | 0110 001a ffff ffff |
Żaden | 4 | |
CPFSGT | f,a | Porównanie f z WREG, pominięcie przy > | 1 (2 lub 3) | 0110 010a ffff ffff |
Żaden | 4 | |
CPFSLT | f,a | Porównanie f z WREG, pominięcie przy < | 1 (2 lub 3) | 0110 000a ffff ffff |
Żaden | 1, 2 | |
DECF | f,d,a | Zmniejszenie f o 1 | 1 | 0000 01da ffff ffff |
C, DC, Z, OV, N | 1, 2, 3, 4 | |
DECFSZ | f,d,a | Zmniejszenie f o 1, pominięcie przy zerze | 1 (2 lub 3) | 0010 11da ffff ffff |
Żaden | 1, 2, 3, 4 | |
DECSNZ | f,d,a | Zmniejszenie f o 1, pominięcie przy nie zerze | 1 (2 lub 3) | 0100 11da ffff ffff |
Żaden | 1, 2 | |
INCF | f,d,a | Zwiększenie f o 1 | 1 | 0010 10da ffff ffff |
C, DC, Z, OV, N | 1, 2, 3, 4 | |
INCFSZ | f,d,a | Zwiększenie f o 1, pominięcie przy 0 | 1 (2 lub 3) | 0011 11da ffff ffff |
Żaden | 4 | |
INFSNZ | f,d,a | Zwiększenie f o 1, pominięcie przy ≠ 0 | 1 (2 lub 3) | 0100 10da ffff ffff |
Żaden | 1, 2 | |
IORWF | f,d,a | Alternatywa WREG z f | 1 | 0001 00da ffff ffff |
Z, N | 1, 2 | |
MOVF | f,d,a | Skopiowanie f | 1 | 0101 00da ffff ffff |
Z, N | 1 | |
MOVFF | fs,fd | Skopiowanie fs do fd | Słowo 1 (fs) | 2 | 1100 ffff ffff ffff |
Żaden | |
Słowo 2 (fd) | 1111 ffff ffff ffff |
||||||
MOVWF | f,a | Skopiowanie WREG do f | 1 | 0110 111a ffff ffff |
Żaden | ||
MULWF | f,a | Mnożenie WREG przez f | 1 | 0000 001a ffff ffff |
Żaden | ||
NEGF | f,a | Negacja f | 1 | 0110 110a ffff ffff |
C, DC, Z, OV, N | 1, 2 | |
RLCF | f,d,a | Obrót w lewo f poprzez przeniesienie C | 1 | 0011 01da ffff ffff |
C, Z, N | ||
RLNCF | f,d,a | Obrót w lewo f bez przeniesienia C | 1 | 0100 01da ffff ffff |
Z, N | 1, 2 | |
RRCF | f,d,a | Obrót w prawo f poprzez przeniesienie C | 1 | 0011 00da ffff ffff |
C, Z, N | ||
RRNCF | f,d,a | Obrót w prawo f bez przeniesienia C | 1 | 0100 00da ffff ffff |
Z, N | ||
SETF | f,a | Ustawienie f na FFh | 1 | 0110 100a ffff ffff |
Żaden | ||
SUBFWB | f,d,a | Odjęcie f od WREG z pożyczką | 1 | 0101 01da ffff ffff |
C, DC, Z, OV, N | 1, 2 | |
SUBWF | f,d,a | Odjęcie WREG od f | 1 | 0101 11da ffff ffff |
C, DC, Z, OV, N | ||
SUBWFB | f,d,a | Odjęcie WREG od f z pożyczką | 1 | 0101 10da ffff ffff |
C, DC, Z, OV, N | 1, 2 | |
SWAPF | f,d,a | Zamiana miejscami połówek f | 1 | 0011 10da ffff ffff |
Żaden | 4 | |
TSTFSZ | f,a | Testowanie f, pominięcie przy zerze | 1 (2 lub 3) | 0110 011a ffff ffff |
Żaden | 1, 2 | |
XORWF | f,d,a | Różnica symetryczna WREG z f | 1 | 0001 10da ffff ffff |
Z, N | ||
Operacje bitowe na rejestrach | |||||||
BCF | f,b,a | Zerowanie bitu b w f | 1 | 1001 bbba ffff ffff |
Żaden | 1, 2 | |
BSF | f,b,a | Ustawianie bitu b w f | 1 | 1000 bbba ffff ffff |
Żaden | 1, 2 | |
BTFSC | f,b,a | Testowanie bitu b w f, pominięcie przy 0 | 1 (2 lub 3) | 1011 bbba ffff ffff |
Żaden | 3, 4 | |
BTFSS | f,b,a | Testowanie bitu b w f, pominięcie przy 1 | 1 (2 lub 3) | 1010 bbba ffff ffff |
Żaden | 3, 4 | |
BTG | f,b,a | Zmiana bitu b w f na przeciwny | 1 | 0111 bbba ffff ffff |
Żaden | 1, 2 | |
Operacje sterujące | |||||||
BC | n | Odgałęzienie przy przeniesieniu | 1 (2) | 1110 0010 nnnn nnnn |
Żaden | ||
BN | n | Odgałęzienie przy minusie | 1 (2) | 1110 0110 nnnn nnnn |
Żaden | ||
BNC | n | Odgałęzienie przy braku przeniesienia | 1 (2) | 1110 0011 nnnn nnnn |
Żaden | ||
BNN | n | Odgałęzienie przy nieujemnym | 1 (2) | 1110 0111 nnnn nnnn |
Żaden | ||
BNOV | n | Odgałęzienie przy braku nadmiaru | 1 (2) | 1110 0101 nnnn nnnn |
Żaden | ||
BNZ | n | Odgałęzienie przy braku zera | 2 | 1110 0001 nnnn nnnn |
Żaden | ||
BOV | n | Odgałęzienie przy nadmiarze | 1 (2) | 1110 0100 nnnn nnnn |
Żaden | ||
BRA | n | Odgałęzienie bezwarunkowe | 1 (2) | 1101 0nnn nnnn nnnn |
Żaden | ||
BZ | n | Odgałęzienie przy zerze | 1 (2) | 1110 0000 nnnn nnnn |
Żaden | ||
CALL | k, s | Wywołanie podprogramu | Słowo 1 | 2 | 1110 110s kkkk kkkk |
Żaden | |
Słowo 2 | 1111 kkkk kkkk kkkk |
||||||
CLRWDT | — | Zerowanie licznika zegarowego | 1 | 0000 0000 0000 0100 |
TO, PD | ||
DAW | — | Poprawka dziesiętna WREG | 1 | 0000 0000 0000 0111 |
C | ||
GOTO | k | Skok do adresu k | Słowo 1 | 2 | 1110 1111 kkkk kkkk |
Żaden | |
Słowo 2 | 1111 kkkk kkkk kkkk |
||||||
NOP | — | Operacja pusta | 1 | 0000 0000 0000 0000 |
Żaden | ||
NOP | — | Operacja pusta | 1 | 1111 xxxx xxxx xxxx |
Żaden | ||
POP | — | Usunięcie ze szczytu stosu (TOS) | 1 | 0000 0000 0000 0110 |
Żaden | ||
PUSH | — | Przesłanie PC+2 na szczyt stosu (TOS) | 1 | 0000 0000 0000 0101 |
Żaden | ||
RCALL | n | Względne wywołanie podprogramu | 2 | 1101 1nnn nnnn nnnn |
Żaden | ||
RESET | Reset programowy | 1 | 0000 0000 1111 1111 |
Wszystkie | |||
RETFIE | s | Powrót z przerwania z włączeniem przerwań | 2 | 0000 0000 0001 000s |
GIE/GIEH, PEIE/GIEL | ||
RETLW | k | Powrót z podprogramu z k w WREG | 2 | 0000 1100 kkkk kkkk |
Żaden | ||
RETURN | s | Powrót z podprogramu | 2 | 0000 0000 0001 001s |
Żaden | ||
SLEEP | — | Wejście w tryb uśpienia | 1 | 0000 0000 0000 0011 |
TO, PD | ||
Operacje ze stałymi | |||||||
ADDLW | k | Dodanie stałej k i WREG | 1 | 0000 1111 kkkk kkkk |
C, DC, Z, OV, N | ||
ANDLW | k | Koniunkcja stałej k i WREG | 1 | 0000 1011 kkkk kkkk |
Z, N | ||
IORLW | k | Alternatywa stałej k i WREG | 1 | 0000 1001 kkkk kkkk |
Z, N | ||
LFSR | f,k | Przesłanie stałej k do FSRf | Słowo 1 | 2 | 1110 1110 00ff kkkk |
Żaden | |
Słowo 2 | 1111 0000 kkkk kkkk |
||||||
MOVLB | k | Przesłanie stałej k do BSR[3:0] | 1 | 0000 0001 kkkk kkkk |
Żaden | ||
MOVLW | k | Przesłanie stałej k do WREG | 1 | 0000 0111 kkkk kkkk |
Żaden | ||
MULLW | k | Iloczyn stałej k z WREG | 1 | 0000 1101 kkkk kkkk |
Żaden | ||
RETLW | k | Powrót z podprogramu ze stałą k w WREG | 2 | 0000 1100 kkkk kkkk |
Żaden | ||
SUBLW | k | Odjęcie WREG od stałej k | 1 | 0000 1000 kkkk kkkk |
C, DC, Z, OV, N | ||
XORLW | k | Różnica symetryczna stałej k i WREG | 1 | 0000 1010 kkkk kkkk |
Z, N | ||
Operacje pomiędzy pamięcią danych a pamięcią programu | |||||||
TBLRD * | Odczyt tablicy | 2 | 0000 0000 0000 1000 |
Żaden | |||
TBLRD *+ | Odczyt tablicy z postinkrementacją | 2 | 0000 0000 0000 1001 |
Żaden | |||
TBLRD *- | Odczyt tablicy z postdekrementacją | 2 | 0000 0000 0000 1010 |
Żaden | |||
TBLRD +* | Odczyt tablicy z preinkrementacją | 2 | 0000 0000 0000 1011 |
Żaden | |||
TBLWT * | Zapis tablicy | 2 | 0000 0000 0000 1100 |
Żaden | 5 | ||
TBLWT *+ | Zapis tablicy z postinkrementacją | 2 | 0000 0000 0000 1101 |
Żaden | 5 | ||
TBLWT *- | Zapis tablicy z postdekrementacją | 2 | 0000 0000 0000 1110 |
Żaden | 5 | ||
TBLWT +* | Zapis tablicy z preinkrementacją | 2 | 0000 0000 0000 1111 |
Żaden | 5 |
Opis używanych symboli
Symbol | Opis |
a | Bit dostępu do pamięci RAM: a = 0: rejestr w banku dostępowym RAM (rejestr wyboru banku BSR jest ignorowany) a = 1: rejestr w banku RAM określanym przez rejestr BSR. |
bbb | Adrees bitu w 8-bitowym rejestrze pliku (0...7). |
BSR | Rejestr wyboru banku RAM (ang. Bank Select Register), używany do wyboru bieżącego banku w RAM. |
d | Bit wyboru rejestru docelowego operacji (ang.
Destination select bit): d = 0: wynik trafi do rejestru roboczego WREG d = 1: wynik trafi do rejestru pliku f. |
dest | Miejsce docelowe jest albo rejestrem WREG, albo określonym rejestrem pliku w pamięci RAM. |
f | Adres 8-bitowego rejestru pliku w RAM (0x00...0xFF). |
fs | 12-bitowy adres rejestru źródłowego w RAM (0x000...0xFFF). |
fd | 12-bitowy adres rejestru docelowego w RAM (0x000...0xFFF). |
k | Pole stałej (może być wartością 8-bitową, 12-bitową lub 20-bitową). |
mm | Tryb pracy rejestru wskaźnika TBLPTR używany przy operacjach
odczytu lub zapisu do pamięci:* Wskaźnik pozostaje niezmieniony*+ Po operacji wskaźnik jest zwiększany o 1 i
wskazuje następną komórkę (postinkrementacja)*- Po operacji wskaźnik jest zmniejszany o 1 i
wskazuje poprzednią komórkę (postdekrementacja)+ * Przed operacją wskaźnik jest
zwiększany o 1 i operacja zostanie wykonana na następnej komórce
(preinkrementacja) |
n | Adres względny (liczba całkowita ze znakiem w kodzie U2) używany w instrukcjach skoków względnych lub adres bezpośredni dla instrukcji CALL/ BRA i RETURN. |
PRODH | Górny bajt wyniku mnożenia. |
PRODL | Dolny bajt wyniku mnożenia. |
s | Bit wyboru trybu szybkiego w instrukcjach CALL/RETURN: s = 0; bez zapamiętywania/odtwarzania rejestrów roboczych (WREG, STATUS i BSR) z rejestrów pomocniczych s = 1: z zapamiętaniem/odtwarzaniem rejestrów roboczych (ang. Fast mode – tryb szybki). |
u | Bit nieużywany lub niezmieniany. |
WREG | Rejestr roboczy (akumulator) (ang. Working register). |
x | Wartość nieistotna (0 lub 1). Asembler generuje w takim przypadku kod z ustawieniem x = 0. Jest to zalecana forma użycia dla zachowania kompatybilności ze wszystkimi programami narzędziowymi firmy Microchip. |
TBLPTR | 21-bitowy wskaźnik tablicy (ang. Table Pointer) ( wskazuje komórkę w pamięci programu). |
TABLAT | 8-bitowy rejestr zatrzaskowy tablicy (ang. Table Latch). |
TOS | Szczyt stosu (ang Top of Stack). |
PC | Licznik programu (ang. Program Counter). |
PCL | Dolny bajt licznika programu. |
PCH | Górny bajt licznika programu. |
PCLATH | Zatrzask górnego bajtu licznika programu. |
PCLATU | Zatrzask najwyższego bajtu licznika programu. |
GIE | Bit globalnego uaktywniania obsługi przerwań (ang. Global Interrupt Enable bit). |
WDT | Timer licznika zegarowego (ang. Watchdog Timer). |
TO | Bit przekroczenia czasu (ang. Time-out bit). Aktywny w stanie 0. |
PD | Bit wyłączenia zasilania (ang. Power-Down bit). Aktywny w stanie 0. |
C | Znacznik przeniesienia (ang. Carry). |
DC | Znacznik przeniesienia z drugiej cyfry (z bitu 4 na 5) używany w poprawkach dziesiętnych liczb BCD (ang. Digit Carry). |
Z | Znacznik zera. |
OV | Znacznik nadmiaru (ang. Overflow). |
N | Znacznik liczby ujemnej (ang. Negative). Jest to kopia bitu nr 7 wyniku operacji. |
{ } | Argument opcjonalny. Przy pominięciu zostaje przyjęta wartość domyślna. |
[ ] | Pole bitowe rejestru: r[4:2] – bity 4,3,2. |
← | Przesłanie. |
Każdy cykl rozkazowy (Tcy) złożony jest z czterech taktów Q (Q1-Q4). Takt Q jest taki sam jak takt oscylatora mikrokontrolera (TOSC). Takty Q wyznaczają w każdym cyklu rozkazowym okresy dekodowania, odczytu, przetwarzania danych, zapisu, itp. Poniższy wykres pokazuje związek taktów Q z cyklem rozkazowym.
Kolejny rysunek wyjaśnia ideę nakładkowania:
Wszystkie instrukcje są wykonywane w pojedynczym cyklu rozkazowym z wyjątkiem instrukcji rozgałęzień w programie, które wykonują się w dwóch cyklach, ponieważ pobrana instrukcja zostaje usunięta z kolejki nakładkowania, a w tym jest pobierana instrukcja spod nowego adresu, a później jest wykonywana.
Ogólnie cztery takty Q w cyklu rozkazowym można podzielić na:
Q1: Takt dekodowania instrukcji lub wymuszona operacja pusta
Q2: Takt odczytu danych lub operacja pusta
Q3: Przetwarzanie danych
Q4: Takt zapisu danych lub operacja pusta
W opisie każdej instrukcji pokazano szczegóły operacji w taktach Q.
Składnia: ADDLW k
Argumenty: k = 0...255
Operacja: WREG ← WREG + k
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0000 1111 kkkk kkkk
Opis: Zawartość akumulatora WREG zostaje dodana do 8-bitowej stałej k. Wynik jest umieszczany w akumulatorze WREG.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis do rejestru WREG |
Przykład:
ADDLW 0x15
Przed wykonaniem instrukcji:
WREG = 0x10
Po wykonaniu instrukcji:
WREG = 0x25
Składnia: ADDWF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← WREG + f
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0010 01da ffff ffff
Opis: Dodanie
zawartości rejestru roboczego WREG (akumulatora)
i rejestru f. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
ADDWF REG, W
Przed
wykonaniem instrukcji:
WREG = 0x17
REG = 0xC2
Po wykonaniu instrukcji:
WREG = 0xD9
REG = 0xC2
Składnia: ADDWFC f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← WREG + f + C
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0010 00da ffff ffff
Opis: Dodanie
zawartości rejestru roboczego WREG (akumulatora),
znacznika przeniesienia C i rejestru f z pamięci RAM. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
ADDWFC REG, W
Przed
operacją
bit C = 1
WREG = 0x4D
REG = 0x02
Po wykonaniu instrukcji:
bit C = 0
WREG = 0x50
REG = 0x02
Składnia: ANDLW k
Argumenty: k = 0...255
Operacja: WREG ← WREG & k
Modyfikowane znaczniki stanu: N, Z
Kod: 0000 1011 kkkk kkkk
Opis: Zawartość akumulatora WREG zostaje poddana operacji koniunkcji (iloczynu logicznego) z 8-bitową stałą k. Wynik jest umieszczany w akumulatorze WREG.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis do rejestru WREG |
Przykład:
ANDLW 0x5F
Przed wykonaniem instrukcji:
WREG = 0xA3
Po wykonaniu instrukcji:
WREG = 0x03
Składnia: ANDWFC f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← WREG & f
Modyfikowane znaczniki stanu: N, Z
Kod: 0001 01da ffff ffff
Opis: Koniunkcja
zawartości rejestru roboczego WREG (akumulatora) i rejestru f
z pamięci RAM. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
ANDWFC REG, W
Przed
operacją
WREG = 0x17
REG = 0xC2
Po wykonaniu instrukcji:
WREG = 0x02
REG = 0xC2
Składnia: BC n
Argumenty: n = -128...127
Operacja:
Jeśli C = 1, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0010 nnnn nnnn
Opis: Jeśli bit przeniesienia C (ang. Carry bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BC staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit przeniesienia C jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BC jest wykonywana w jednym cyklu rozkazowym.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BC JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli C = 1;
PC = adres (JUMP)
Jeśli C = 0;
PC = adres (HERE + 2)
Składnia: BCF f,b{,a}
Argumenty: f = 0...255, b = 0...7, a = 0...1
Operacja: f[b] ← 0
Modyfikowane znaczniki stanu: żaden
Kod: 1001 bbba ffff ffff
Opis: Bit b rejestru f
zostaje wyzerowany. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru f |
Przykład:
BCF FLAG_REG, 7
Przed wykonaniem instrukcji:
FLAG_REG = 0xC7
Po wykonaniu instrukcji:
FLAG_REG = 0x47
Składnia: BN n
Argumenty: n = -128...127
Operacja:
Jeśli N = 1, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0110 nnnn nnnn
Opis: Jeśli bit znaku N (ang. Negative bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BN staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit minusa N jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BN jest wykonywana w jednym cyklu.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BN JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli N = 1:
PC = adres (JUMP)
Jeśli N = 0:
PC = adres (HERE + 2)
Składnia: BNC n
Argumenty: n = -128...127
Operacja:
Jeśli C = 0, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0011 nnnn nnnn
Opis: Jeśli bit przeniesienia C (ang. Carry bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNC staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit przeniesienia C jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNC jest wykonywana w jednym cyklu rozkazowym.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BNC JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli C = 0;
PC = adres (JUMP)
Jeśli C = 1;
PC = adres (HERE + 2)
Składnia: BNN n
Argumenty: n = -128...127
Operacja:
Jeśli N = 0, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0111 nnnn nnnn
Opis: Jeśli bit znaku ujemnego N (ang. Negative bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNN staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit N jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNN jest wykonywana w jednym cyklu.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BNN JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli N = 0;
PC = adres (JUMP)
Jeśli N = 1;
PC = adres (HERE + 2)
Składnia: BNOV n
Argumenty: n = -128...127
Operacja:
Jeśli OV = 0, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0101 nnnn nnnn
Opis: Jeśli bit nadmiaru OV (ang. Overflow bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNOV staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit OV jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNOV jest wykonywana w jednym cyklu.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BNOV JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli OV = 0;
PC = adres (JUMP)
Jeśli OV = 1;
PC = adres (HERE + 2)
Składnia: BNZ n
Argumenty: n = -128...127
Operacja:
Jeśli Z = 0, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0001 nnnn nnnn
Opis: Jeśli bit zera Z (ang. Zero bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNZ staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit Z jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNZ jest wykonywana w jednym cyklu.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BNZ JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli Z = 0;
PC = adres (JUMP)
Jeśli Z = 1;
PC = adres (HERE + 2)
Składnia: BOV n
Argumenty: n = -128...127
Operacja:
Jeśli OV = 1, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0100 nnnn nnnn
Opis: Jeśli bit nadmiaru OV (ang. Overflow bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BOV staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit OV jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BOV jest wykonywana w jednym cyklu.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BOV JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli OV = 1;
PC = adres (JUMP)
Jeśli OV = 0;
PC = adres (HERE + 2)
Składnia: BRA n
Argumenty: n = -1024...1023
Operacja: PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1101 0nnn nnnn nnnn
Opis: Wykonywany jest skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. Instrukcja BRA wykonywana jest w dwóch cyklach.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE BRA JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
PC = adres (JUMP)
Składnia: BSF f,b{,a}
Argumenty: f = 0...255, b = 0...7, a = 0...1
Operacja: f[b] ← 1
Modyfikowane znaczniki stanu: żaden
Kod: 1000 bbba ffff ffff
Opis: Bit b rejestru f
zostaje ustawiony na 1. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru f |
Przykład:
BSF FLAG_REG, 7
Przed wykonaniem instrukcji:
FLAG_REG = 0x0A
Po wykonaniu instrukcji:
FLAG_REG = 0x8A
Składnia: BTFSC f,b{,a}
Argumenty: f = 0...255, b = 0...7, a = 0...1
Operacja: Pominięcie następnej instrukcji, jeśli f[b] = 0
Modyfikowane znaczniki stanu: żaden
Kod: 1011 bbba ffff ffff
Opis: Jeśli bit b w
rejestrze f ma stan 0, to zostaje pominięta następna instrukcja. Jeśli bit ten
ma stan 0, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja BTFSC wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Brak działania |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | BTFSC | FLAG, 1 |
FALSE | : | |
TRUE | : |
Przed wykonaniem instrukcji:
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli FLAG[1] = 0;
PC = adres (TRUE)
Jeśli FLAG[1] = 1;
PC = adres (FALSE)
Składnia: BTFSS f,b{,a}
Argumenty: f = 0...255, b = 0...7, a = 0...1
Operacja: Pominięcie następnej instrukcji, jeśli f[b] = 1
Modyfikowane znaczniki stanu: żaden
Kod: 1010 bbba ffff ffff
Opis: Jeśli bit b w
rejestrze f ma stan 1, to zostaje pominięta następna instrukcja. Jeśli bit ten
ma stan 1, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja BTFSC wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Brak działania |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | BTFSS | FLAG, 1 |
FALSE | : | |
TRUE | : |
Przed wykonaniem instrukcji:
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli FLAG[1] = 0;
PC = adres (FALSE)
Jeśli FLAG[1] = 1;
PC = adres (TRUE)
Składnia: BTG f,b{,a}
Argumenty: f = 0...255, b = 0...7, a = 0...1
Operacja: f[b] ← f[b]
Modyfikowane znaczniki stanu: żaden
Kod: 0111 bbba ffff ffff
Opis: Bit b rejestru f
zostaje ustawiony na stan przeciwny (0 → 1;1 → 0). Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru f |
Przykład:
BSF FLAG_REG, 7
Przed wykonaniem instrukcji:
FLAG_REG = 0x0A
Po wykonaniu instrukcji:
FLAG_REG = 0x8A
Składnia: BZ n
Argumenty: n = -128...127
Operacja:
Jeśli Z = 1, to PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1110 0000 nnnn nnnn
Opis: Jeśli bit zera Z (ang. Zero bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BZ staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.
Jeśli bit Z jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BZ jest wykonywana w jednym cyklu.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2
Operacje w taktach zegarowych przy skoku:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Operacje w taktach zegarowych przy braku skoku:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej n |
Przetwarzanie danych |
Brak działania |
Przykład:
HERE BZ JUMP
Przed
operacją
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli Z = 1;
PC = adres (JUMP)
Jeśli Z = 0;
PC = adres (HERE + 2)
Składnia: CALL k{,s}
Argumenty: k = 0...1048575, s = 0...1
Operacja:
TOS ← PC + 4
PC[20:1] ← k
Jeśli s = 1, to:
WS ← WREG
STATUSS ← STATUS
BSRS ← BSR
Modyfikowane znaczniki stanu: żaden
Kod:
Pierwsze słowo: | 1110 110s
k7kkk kkkk0 |
Drugie słowo: | 1111 k19kkk
kkkk kkkk8 |
Opis: Wywołanie podprogramu w całej 2MB przestrzeni adresowej
pamięci programu. Najpierw adres powrotny (PC + 4)
zostaje umieszczony na szczycie stosu. Jeśli bit s = 1, to rejestry WREG, STATUS
i BSR zostają zapamiętane odpowiednio w rejestrach pomocniczych WS, STATUSS i
BSRS. Jeśli bit s = 0, to rejestry te nie są zachowywane
Liczba słów instrukcji: 2
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k[7:0] |
Przesłanie PC na stos |
Odczyt stałej k[19:8] Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE CALL THERE,FAST
Przed
wykonaniem instrukcji:
PC = adres (HERE)
Po wykonaniu instrukcji:
PC = adres (THERE)
TOS = adres (HERE + 4)
WS = WREG
BSRS = BSR
STATUSS= STATUS
Składnia: CLRF f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja:
f ← 00h
Z ← 1
Modyfikowane znaczniki stanu: Z
Kod: 0110 101a ffff ffff
Opis: Zawartość
rejestru f jest zerowana a znacznik zera Z jest ustawiany. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru f |
Przykład:
CLRF FLAG_REG
Przed
wykonaniem instrukcji:
FLAG_REG = 0x5A
Po wykonaniu instrukcji:
FLAG_REG = 0x00
Składnia: CLRWDT
Argumenty: brak
Operacja:
WDT ← 00h
preskaler WDT ← 00h
TO ← 1
PD ← 1
Modyfikowane znaczniki stanu: TO, PD
Kod: 0000 0000 0000 0100
Opis: Instrukcja CLRWDT zeruje timer licznika zegarowego oraz licznik jego preskalera. Ustawiane są bity stanu TO i PD.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak działania |
Przetwarzanie danych |
Zerowanie licznika WDT |
Przykład:
CLRWDT
Przed wykonaniem
instrukcji:
Licznik WDT = ?
Po wykonaniu instrukcji:
Licznik WDT = 0x00
Preskaler WDT = 0
TO = 1
PD = 1
Składnia: COMF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← f
Modyfikowane znaczniki stanu: N, Z
Kod: 0001 11da ffff ffff
Opis: Wszystkie bity
rejestru f zostają zanegowane i wynik jest umieszczany w rejestrze docelowym
dest. Jeśli d jest równe 0, to wynik negacji zostanie umieszczony w
akumulatorze W. Jeśli d jest równe 1, to wynik zostanie z powrotem umieszczony w
rejestrze f. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
COMF REG, W
Przed
wykonaniem instrukcji:
REG = 0x13
Po wykonaniu instrukcji:
REG = 0x13
WREG = 0xEC
Składnia: CPFSEQ f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja:
f - WREG
Pominięcie przy f = WREQ (porównanie bez znaku)
Modyfikowane znaczniki stanu: żaden
Kod: 0110 001a ffff ffff
Opis: Porównanie zawartości rejestru f w pamięci danych z
zawartością WREG przez wykonanie odejmowania bez znaku. Jeśli f = WREG, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja CPFSEQ wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Brak działania |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | CPFSEQ | REG |
NEQUAL | : | |
EQUAL | : |
Przed wykonaniem instrukcji:
PC = adres (HERE)
WREG = ?
REG = ?
Po wykonaniu instrukcji:
Jeśli WREG = REG;
PC = adres (EQUAL)
Jeśli WREG ≠ REG;
PC = adres (NEQUAL)
Składnia: CPFSGT f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja:
f - WREG
Pominięcie przy f > WREQ (porównanie bez znaku)
Modyfikowane znaczniki stanu: żaden
Kod: 0110 010a ffff ffff
Opis: Porównanie zawartości rejestru f w pamięci danych z
zawartością WREG przez wykonanie odejmowania bez znaku. Jeśli f > WREG, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja CPFSGT wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Brak działania |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | CPFSGT | REG |
NGREATER | : | |
GREATER | : |
Przed wykonaniem instrukcji:
PC = adres (HERE)
WREG = ?
REG = ?
Po wykonaniu instrukcji:
Jeśli REG > WREG;
PC = adres (GREATER)
Jeśli REG ≤ WREG;
PC = adres (NGREATER)
Składnia: CPFSLT f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja:
f - WREG
Pominięcie przy f < WREQ (porównanie bez znaku)
Modyfikowane znaczniki stanu: żaden
Kod: 0110 000a ffff ffff
Opis: Porównanie zawartości rejestru f w pamięci danych z
zawartością WREG przez wykonanie odejmowania bez znaku. Jeśli f < WREG, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja CPFSLT wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Brak działania |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | CPFSLT | REG |
NLESS | : | |
LESS | : |
Przed wykonaniem instrukcji:
PC = adres (HERE)
WREG = ?
REG = ?
Po wykonaniu instrukcji:
Jeśli REG < WREG;
PC = adres (LESS)
Jeśli REG ≥ WREG;
PC = adres (NLESS)
Składnia: DAW
Argumenty: brak
Operacja:
Jeśli WREG[3:0] > 9 lub DC = 1, to
WREG[3:0] ← WREG[3:0] + 6
inaczej
WREG[3:0] ← WREG[3:0] (bez zmian)
Jeśli WREG<7:4> > 9 lub C = 1, to
WREG[7:4] ← WREG[7:4] + 6
inaczej
WREG[7:4] ← WREG[7:4] (bez zmian)
Modyfikowane znaczniki stanu: C
Kod: 0000 0000 0000 0111
Opis: Instrukcja DAW dokonuje poprawki dziesiętnej wartości 8-bitowej w rejestrze WREG, która powstała z poprzedniego dodawania dwóch liczb w spakowanym formacie BCD (po dwie cyfry BCD na bajt). Poprawka tworzy poprawny wynik w spakowanym formacie BCD w rejestrze WREG.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru WREG |
Przetwarzanie danych |
Zapis do rejestru WREG |
Przykład 1:
DAW
Przed wykonaniem
instrukcji:
WREG = 0xA5
C = 0
DC = 0
Po wykonaniu instrukcji:
WREG = 0x05
C = 1
DC = 0
Przykład 2:
DAW
Przed
wykonaniem instrukcji:
WREG = 0xCE
C = 0
DC = 0
Po wykonaniu instrukcji:
WREG = 0x34
C = 1
DC = 0
Składnia: DECF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← f - 1
Modyfikowane znaczniki stanu: C, DC, N, OV, Z
Kod: 0000 01da ffff ffff
Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
DECF CNT
Przed
operacją
CNT = 0x01
Z = 0
Po wykonaniu instrukcji:
CNT = 0x00
Z = 1
Składnia: DECFSZ f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest ← f - 1
Pominięcie przy wyniku = 0
Modyfikowane znaczniki stanu: żaden
Kod: 0010 11da ffff ffff
Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli d = 0,
to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik
trafia z powrotem do rejestru f (domyślnie). Jeśli
wynik = 0, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja DECFSZ wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis wyniku do dest |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | DECFSZ | CNT |
GOTO | LOOP | |
CONTINUE | : |
Przed wykonaniem instrukcji:
CNT = ?
PC = adres (HERE)
Po wykonaniu instrukcji:
CNT = CNT - 1
Jeśli CNT = 0;
PC = adres (CONTINUE)
Jeśli CNT ≠ 0;
PC = adres (HERE + 2)
Składnia: DECFSNZ f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest ← f - 1
Pominięcie przy wyniku ≠ 0
Modyfikowane znaczniki stanu: żaden
Kod: 0100 11da ffff ffff
Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli d = 0,
to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik
trafia z powrotem do rejestru f (domyślnie). Jeśli
wynik ≠ 0, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja DECFSNZ wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis wyniku do dest |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | DECFSNZ | TEMP |
ZERO | : | |
NZERO | : |
Przed wykonaniem instrukcji:
TEMP = ?
PC = adres (HERE)
Po wykonaniu instrukcji:
TEMP = TEMP - 1
Jeśli TEMP = 0;
PC = adres (ZERO)
Jeśli TEMP ≠ 0;
PC = adres (NZERO)
Składnia: GOTO k
Argumenty: k = 0...1048575
Operacja: PC[20:1] ← k
Modyfikowane znaczniki stanu: żaden
Kod:
Pierwsze słowo: | 1110 1111
k7kkk kkkk0 |
Drugie słowo: | 1111 k19kkk
kkkk kkkk8 |
Opis: Wykonanie skoku bezwarunkowego pod adres k w całej 2MB przestrzeni adresowej pamięci programu. 20-bitowa wartość adresu k jest ładowana do rejestru PC[20:1]. Instrukcja GOTO wykonywana jest zawsze w dwóch cyklach rozkazowych.
Liczba słów instrukcji: 2
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k[7:0] |
Przesłanie PC na stos |
Odczyt stałej k[19:8] Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
GOTO THERE
Po wykonaniu instrukcji:
PC = adres (THERE)
Składnia: INCF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← f + 1
Modyfikowane znaczniki stanu: C, DC, N, OV, Z
Kod: 0010 10da ffff ffff
Opis: Zawartość rejestru f zostaje zwiększona o 1. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
INCF CNT
Przed
operacją
CNT = 0xFF
Z = 0
C = ?
DC = ?
Po wykonaniu instrukcji:
CNT = 0x00
Z = 1
C = 1
DC = 1
Składnia: INCFSZ f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest ← f + 1
Pominięcie przy wyniku = 0
Modyfikowane znaczniki stanu: żaden
Kod: 0011 11da ffff ffff
Opis: Zawartość rejestru f zostaje zwiększona o 1. Jeśli d = 0,
to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik
trafia z powrotem do rejestru f (domyślnie). Jeśli
wynik = 0, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja INCFSZ wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis wyniku do dest |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | INCFSZ | CNT |
NZERO | : | |
ZERO | : |
Przed wykonaniem instrukcji:
CNT = ?
PC = adres (HERE)
Po wykonaniu instrukcji:
CNT = CNT + 1
Jeśli CNT = 0;
PC = adres (ZERO)
Jeśli CNT ≠ 0;
PC = adres (NZERO)
Składnia: INFSNZ f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest ← f + 1
Pominięcie przy wyniku ≠ 0
Modyfikowane znaczniki stanu: żaden
Kod: 0100 10da ffff ffff
Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli d = 0,
to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik
trafia z powrotem do rejestru f (domyślnie). Jeśli
wynik ≠ 0, to następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja INFSNZ wykonuje się w tym
przypadku prze 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis wyniku do dest |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | INFSNZ | REG |
ZERO | : | |
NZERO | : |
Przed wykonaniem instrukcji:
REG = ?
PC = adres (HERE)
Po wykonaniu instrukcji:
REG = REG - 1
Jeśli REG ≠ 0:
PC = adres (NZERO)
Jeśli REG = 0:
PC = adres (ZERO)
Składnia: IORLW k
Argumenty: k = 0...255
Operacja: WREG ← WREG | k
Modyfikowane znaczniki stanu: N, Z
Kod: 0000 1001 kkkk kkkk
Opis: Zawartość akumulatora WREG zostaje poddana operacji alternatywy logicznej z 8-bitową stałą k. Wynik jest umieszczany w akumulatorze WREG.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis do rejestru WREG |
Przykład:
IORLW 0x35
Przed wykonaniem instrukcji:
WREG = 0x9A
Po wykonaniu instrukcji:
WREG = 0xBF
Składnia: IORWF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← WREG | f
Modyfikowane znaczniki stanu: N, Z
Kod: 0001 00da ffff ffff
Opis: Wykonanie operacji alternatywy logicznej nad rejestrami WREG (akumulator)
i f. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
IORWF RESULT, W
Przed
wykonaniem instrukcji:
WREG = 0x91
RESULT = 0x13
Po wykonaniu instrukcji:
WREG = 0x93
RESULT = 0x13
Składnia: LFSR f,k
Argumenty: f = 0...2, k = 0...4095
Operacja: FSRf ← k
Modyfikowane znaczniki stanu: Żaden
Kod:
Pierwsze słowo: | 1110 111 0
00ff
k11kkk |
Drugie słowo: | 1111 0000 k7kkk
kkkk |
Opis: 12-bitowa stała k jest ładowana do rejestru wskaźnikowego komórki w pamięci RAM (ang. File Select Register, FSR) o numerze f.
Liczba słów instrukcji: 2
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt górnych bitów stałej k |
Przetwarzanie danych |
Zapis tych bitów do FSR |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt dolnych bitów stałej k |
Przetwarzanie danych |
Zapis tych bitów do FSR |
Przykład:
LFSR 2, 0x3AB
Po wykonaniu
instrukcji:
FSR2H = 0x03
FSR2L = 0xAB
Składnia: MOVF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← f
Modyfikowane znaczniki stanu: N, Z
Kod: 0101 00da ffff ffff
Opis: Zawartość rejestru f zostaje skopiowana
(załadowana) do rejestru wynikowego zależnie od stanu bitu d. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
MOVF REG, W
Przed
wykonaniem instrukcji:
WREG = 0xFF
REG = 0x22
Po wykonaniu instrukcji:
WREG = 0x22
REG = 0x22
Składnia: MOVFF fs,fd
Argumenty: fs = 0...4095, fd = 0...4095
Operacja: fd ← fs
Modyfikowane znaczniki stanu: Żaden
Kod:
Pierwsze słowo (źródło): | 1100 ffff
ffff ffffs |
Drugie słowo (przeznaczenie): | 1111 ffff ffff ffffd |
Opis: Zawartość rejestru źródłowego fs zostaje skopiowana do rejestru docelowego fd. Oba rejestry mogą zajmować dowolne miejsce wewnątrz 4096 bajtowej przestrzeni danych. Oba rejestry fs i fd mogą być rejestrem akumulatora WREG (użyteczna sytuacja specjalna). Instrukcja MOVFF jest szczególnie użyteczna przy przesyle danych z komórki pamięci do rejestru peryferyjnego (takiego jak bufor nadawczy lub port we/wy).
W instrukcji MOVFF nie można używać jako rejestru przeznaczenia rejestrów PCL, TOSU, TOSH lub TOSL.
Instrukcji MOVFF nie powinno się używać do modyfikacji ustawień przerwań, gdy jest aktywna obsługa dowolnego przerwania.
Liczba słów instrukcji: 2
Liczba cykli rozkazowych: 2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt fs |
Przetwarzanie danych |
Brak operacji |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak operacji (bez pustego odczytu) |
Brak operacji |
Zapis fd |
Przykład:
MOVFF REG1, REG2
Przed
wykonaniem instrukcji:
REG1 = 0x33
REG2 = 0x11
Po wykonaniu instrukcji:
REG1 = 0x33
REG2 = 0x33
Składnia: MOVLB k
Argumenty: k = 0...255
Operacja: BSR ← k
Modyfikowane znaczniki stanu: Żaden
Kod: 0000 0001 kkkk kkkk
Opis: 8-bitowa stała jest ładowana do rejestru wyboru banku pamięci RAM (tylko 4 najmłodsze bity są istotne) BSR[3:0].
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis k do rejestru BSR |
Przykład:
MOVLB 5
Przed wykonaniem instrukcji:
BSR = 0x02
Po wykonaniu instrukcji:
BSR = 0x05
Składnia: MOVLW k
Argumenty: k = 0...255
Operacja: WREG ← k
Modyfikowane znaczniki stanu: Żaden
Kod: 0000 0111 kkkk kkkk
Opis: 8-bitowa stała jest ładowana do rejestru akumulatora WREG.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis k do WREG |
Przykład:
MOVLW 0x5A
Po wykonaniu instrukcji:
WREG = 0x5A
Składnia: MOVWF f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja: f ← WREG
Modyfikowane znaczniki stanu: żaden
Kod: 0110 111a ffff ffff
Opis: Skopiowanie danych z akumulatora WREG do rejestru f, który
może znajdować się w dowolnym miejscu 256-bajtowego banku pamięci danych RAM. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis rejestru f |
Przykład:
MOVWF REG
Przed wykonaniem
instrukcji:
WREG = 0x4F
REG = 0xFF
Po wykonaniu instrukcji:
WREG = 0x4F
REG = 0x4F
Składnia: MOVLW k
Argumenty: k = 0...255
Operacja: PRODH:PRODL ← WREG × k
Modyfikowane znaczniki stanu: Żaden
Kod: 0000 1101 kkkk kkkk
Opis: Zostaje wykonane mnożenie bezznakowe zawartości akumulatora WREG i 8-bitowej stałej k. 16-bitowy wynik mnożenia trafia do pary rejestrów PRODH:PRODL. Rejestr PRODH zawiera górny bajt wyniku, PRODL dolny. Rejestr WREG nie jest zmieniany. Nie zmieniane są również żadne znaczniki stanu. Zauważ, iż w tej operacji nie jest możliwe powstanie nadmiaru, ani wystąpienie przeniesienia. Wynik zero jest możliwy, jednak nie jest wykrywany.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis do rejestrów PRODH:PRODL |
Przykład:
MULLW 0xC4
Przed wykonaniem instrukcji:
WREG = 0xE2
PRODH = ?
PRODL = ?
Po wykonaniu instrukcji:
WREG = 0xE2
PRODH = 0xAD
PRODL = 0x08
Składnia: MULWF f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja: PRODH:PRODL ← WREG × f
Modyfikowane znaczniki stanu: żaden
Kod: 0000 001a ffff ffff
Opis: Zostaje wykonane mnożenie bezznakowe zawartości akumulatora
WREG i rejestru f. 16-bitowy wynik mnożenia trafia do pary rejestrów PRODH:PRODL.
Rejestr PRODH zawiera górny bajt wyniku, PRODL dolny. Rejestry WREG i f nie są
zmieniane. Nie zmieniane są również żadne znaczniki stanu. Zauważ, iż w tej
operacji nie jest możliwe powstanie nadmiaru, ani wystąpienie przeniesienia.
Wynik zero jest możliwy, jednak nie jest wykrywany. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestrów PRODH:PRODL |
Przykład:
MULWF REG
Przed wykonaniem
instrukcji:
WREG = 0xC4
REG = 0xB5
PRODH = ?
PRODL = ?
Po wykonaniu instrukcji:
WREG = 0xC4
REG = 0xB5
PRODH = 0x8A
PRODL = 0x94
Składnia: NEGF f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja: f ← f + 1
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0110 110a ffff ffff
Opis: Zawartość rejestru f zostaje zanegowana przy pomocy
uzupełnienia do 2. Wynik umieszczany jest z powrotem w rejestrze f. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis rejestru f |
Przykład:
NEGF REG, 1
Przed
wykonaniem instrukcji:
REG = 0011 1010 (0x3A)
Po wykonaniu instrukcji:
REG = 1100 0110 (0xC6)
Składnia: NOP
Argumenty: brak
Operacja: brak działania
Modyfikowane znaczniki stanu: żaden
Kod: | 0000 0000 0000 0000 |
1111 xxxx xxxx xxxx |
Opis: Instrukcja pusta, nie wykonuje żadnego zadania.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak operacji |
Brak operacji |
Brak operacji |
Składnia: POP
Argumenty: brak
Operacja: Usunięcie danych z TOS
Modyfikowane znaczniki stanu: żaden
Kod: 0000 0000 0000 0110
Wartość adresu powrotnego ze szczytu stosu zostaje pobrana i usunięta. W następstwie tego na szczycie stosu pojawia się poprzedni adres powrotny umieszczony na stosie. Instrukcja ta służy do umożliwienia użytkownikowi poprawnego zarządzania stosem adresów powrotnych i dołączenia stosu programowego.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak operacji |
Usunięcie wartości z TOS |
Brak operacji |
Przykład:
POP
GOTO NEW
Przed wykonaniem instrukcji:
TOS = 0x0031A2
Jeden poziom niżej na stosie = 0x014332
Po wykonaniu instrukcji:
TOS = 0x014332
PC = NEW
Składnia: PUSH
Argumenty: brak
Operacja: TOS ← PC + 2
Modyfikowane znaczniki stanu: żaden
Kod: 0000 0000 0000 0101
Adres PC + 2 jest przesyłany na szczyt stosu adresów powrotnych. Poprzedni adres na szczycie stosu zostaje przesunięty o jeden poziom stosu niżej. Instrukcja ta pozwala użytkownikowi zaimplementować stos programowy przez zmodyfikowanie TOS i umieszczenie go na stosie powrotnym.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Przesłanie na stos PC + 2 |
Brak operacji |
Brak operacji |
Przykład:
PUSH
Przed wykonaniem instrukcji:
TOS = 0x00345A
PC = 0x000124
Po wykonaniu instrukcji:
PC = 0x000126
TOS = 0x000126
Jeden poziom niżej na stosie = 0x00345A
Składnia: RCALL n
Argumenty: n = -1024...1023
Operacja:
TOS ← PC + 2
PC ← PC + 2 + 2n
Modyfikowane znaczniki stanu: żaden
Kod: 1101 1nnn nnnn nnnn
Opis: Wywołanie podprogramu znajdującego się w odległości 1K słów od bieżącej pozycji. Najpierw na stos trafia dres powrotny PC + 2. Następnie do PC dodawane jest przesunięcie 2n jako liczba całkowita ze znakiem w kodzie U2. Ponieważ licznik programu PC został zwiększony o 2 w celu pobrania następnej instrukcji, nowym adresem będzie PC + 2 + 2n. Instrukcja wykonywana jest w dwóch cyklach.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt
stałej n, przesłanie PC na stos |
Przetwarzanie danych |
Zapis do PC |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE RCALL JUMP
Przed
wykonaniem instrukcji:
PC = adres (HERE)
Po wykonaniu instrukcji:
PC = adres (JUMP)
TOS = adres (HERE + 2)
Składnia: RESET
Argumenty: brak
Operacja: Resetuje wszystkie rejestry i znaczniki, na które wpływa reset z końcówki MCLR.
Modyfikowane znaczniki stanu: wszystkie
Kod: 0000 0000 1111 1111
Opis: Instrukcja ta dostarcza sposobu wykonania programowego resetu.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Rozpoczęcie resetu |
Brak operacji |
Brak operacji |
Przykład:
RESET
Po wykonaniu instrukcji:
Rejestry = wartość po resecie
Znaczniki = wartość po resecie
Składnia: RETFIE s
Argumenty: s = 0...1
Operacja:
PC ← TOS
GIE/GIEH lub PEIE/GIEL ← 1
Jeśli s = 1, to
WREG ← WS
STATUS ← STATUSS
BSR ← BSRS
PCLATU, PCLATH nie są zmieniane
Modyfikowane znaczniki stanu: GIE/GIEH, PEIE/GIEL
Kod: 0000 0000 0001 000s
Opis: Powrót z przerwania. Adres ze szczytu stosu zostaje załadowany do rejestru licznika programu PC. Jest włączana obsługa przerwań przez ustawienie albo bitu przerwań niskopriorytetowych, albo bitu przerwań wysokopriorytetowych. Jeśli bit s = 1, to z rejestrów zapasowych WS, STATUSS i BSRS zostaje załadowana zawartość do odpowiednich rejestrów WREG, STATUS i BSR. Jeśli s = 0, to nie nastąpi odtworzenie stanu tych rejestrów (domyślnie).
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak działania |
Brak działania |
Pobranie PC ze stosu, ustawienie GIEH lub GIEL |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
RETFIE 1
Po wykonaniu instrukcji:
PC = TOS
WREG = WS
BSR = BSRS
STATUS = STATUSS
GIE/GIEH, PEIE/GIEL = 1
Składnia: RETLW k
Argumenty: k = 0...255
Operacja:
WREG ← k
PC ← TOS
PCLATU, PCLATH nie są zmieniane
Modyfikowane znaczniki stanu: Żaden
Kod: 0000 1100 kkkk kkkk
Opis: Do akumulatora WREG zostaje załadowana 8-bitowa stała, następnie ze szczytu stosu TOS pobierany jest adres powrotny i umieszczany w rejestrze licznika programu PC. Zatrzaski górnych bitów adresu PCLATH i PCLATU nie są zmieniane.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Pobranie PC ze stosu, zapis k do WREG |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
CALL TABLE ; WREG zawiera wartość indeksu w
tablicy
; Tutaj WREG zawiera wartość komórki tablicy
:
TABLE
ADDWF PCL ; WREG = indeks
RETLW k0 ; Początek tablicy
RETLW k1 ;
:
:
RETLW kn ; Koniec tablicy
Przed wykonaniem instrukcji:
WREG = 0x07
Po wykonaniu instrukcji:
WREG = wartość k7
Składnia: RETURN s
Argumenty: s = 0...1
Operacja:
PC ← TOS
Jeśli s = 1, to
WREG ← WS
STATUS ← STATUSS
BSR ← BSRS
PCLATU, PCLATH nie są zmieniane
Modyfikowane znaczniki stanu: żaden
Kod: 0000 0000 0001 001s
Opis: Powrót z podprogramu. Adres ze szczytu stosu zostaje załadowany do rejestru licznika programu PC. Jeśli bit s = 1, to z rejestrów zapasowych WS, STATUSS i BSRS zostaje załadowana zawartość do odpowiednich rejestrów WREG, STATUS i BSR. Jeśli s = 0, to nie nastąpi odtworzenie stanu tych rejestrów (domyślnie).
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak działania |
Brak działania |
Pobranie PC ze stosu, |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
RETURN
Po wykonaniu instrukcji:
PC = TOS
Składnia: RLCF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest[7:1] ← f[6:0]
dest[0] ← C
C ← f[7]
Modyfikowane znaczniki stanu: C, N, Z
Kod: 0011 01da ffff ffff
Opis: Zawartość rejestru f jest obracana w lewo o jeden bit
poprzez znacznik przeniesienia C. Wynik tego obrotu jest zapisywany do rejestru
docelowego zależnie od stanu bitu d. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
RLCF REG, W
Przed
wykonaniem instrukcji:
REG = 1110 0110
C = 0
Po wykonaniu instrukcji:
REG = 1110 0110
WREG = 1100 1100
C = 1
Składnia: RLNCF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest[7:1] ← f[6:0]
dest[0] ← f[7]
Modyfikowane znaczniki stanu: N, Z
Kod: 0100 01da ffff ffff
Opis: Zawartość rejestru f jest obracana w lewo o jeden bit.
Wynik tego obrotu jest zapisywany do rejestru docelowego zależnie od stanu bitu
d. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
RLNCF REG
Przed
wykonaniem instrukcji:
REG = 1010 1011
Po wykonaniu instrukcji:
REG = 0101 0111
Składnia: RRCF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest[6:0] ← f[7:1]
dest[7] ← C
C ← f[0]
Modyfikowane znaczniki stanu: C, N, Z
Kod: 0011 00da ffff ffff
Opis: Zawartość rejestru f jest obracana w prawo o jeden bit
poprzez znacznik przeniesienia C. Wynik tego obrotu jest zapisywany do rejestru
docelowego zależnie od stanu bitu d. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
RRCF REG, W
Przed
wykonaniem instrukcji:
REG = 1110 0111
C = 0
Po wykonaniu instrukcji:
REG = 1110 0111
WREG = 0111 0011
C = 1
Składnia: RRNCF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest[6:0] ← f[7:1]
dest[7] ← f[0]
Modyfikowane znaczniki stanu: N, Z
Kod: 0100 00da ffff ffff
Opis: Zawartość rejestru f jest obracana w prawo o jeden bit.
Wynik tego obrotu jest zapisywany do rejestru docelowego zależnie od stanu bitu
d. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład 1:
RRNCF REG, 1, 0
Przed
wykonaniem instrukcji:
REG = 1101 0111
Po wykonaniu instrukcji:
REG = 1110 1011
Przykład 2:
RRNCF REG, W
Przed
wykonaniem instrukcji:
WREG = ?
REG = 1101 0111
Po wykonaniu instrukcji:
WREG = 1110 1011
REG = 1101 0111
Składnia: SETF f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja: f ← 0xFF
Modyfikowane znaczniki stanu: Żaden
Kod: 0110 100a ffff ffff
Opis: Wszystkie bity w rejestrze f zostają ustawione na 1. Wynik umieszczany jest z powrotem w rejestrze f. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis rejestru f |
Przykład:
SETF REG
Przed
wykonaniem instrukcji:
REG = 0x5A
Po wykonaniu instrukcji:
REG = 0xFF
Składnia: SLEEP
Argumenty: brak
Operacja:
WDT ← 00h
preskaler WDT ← 0
TO ← 1
PD ← 0
Modyfikowane znaczniki stanu: TO, PD
Kod: 0000 0000 0000 0011
Opis: Znacznik stanu wyłączenia zasilania (ang. The Power-Down status bit, PD) jest zerowany, a znacznik zakończenia okresu czasu (ang. Time-out status bit, TO). Jest zerowany licznik czasu wraz ze swoim preskalerem. Mikroprocesor zostaje wprowadzony w stan uśpienia z zatrzymanym oscylatorem.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak operacji |
Przetwarzanie danych |
Wejście w stan uśpienia |
Przykład:
SLEEP
Przed wykonaniem instrukcji:
TO = ?
PD = ?
Po wykonaniu instrukcji:
TO = 1*
PD = 0
* Jeśli licznik zegarowy WDT spowoduje wybudzenie ze stanu uśpienia, to bit ten zostanie wyzerowany
Składnia: SUBFWB f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← WREG - f - C
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0101 01da ffff ffff
Opis: Odjęcie od akumulatora WREG zawartości rejestru f oraz bitu
przeniesienia C metodą uzupełnień
do 2. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład 1:
SUBFWB REG
Przed
wykonaniem instrukcji:
REG = 0x03
WREG = 0x02
C = 1
Po wykonaniu instrukcji:
REG = 0xFF
WREG = 0x02
C = 0
Z = 0
N = 1 ; wynik jest ujemny
Przykład 2:
SUBFWB REG, 0, 0
Przed
wykonaniem instrukcji:
REG = 0x02
WREG = 0x05
C = 1
Po wykonaniu instrukcji:
REG = 0x02
WREG = 0x03
C = 1
Z = 0
N = 0 ; wynik jest dodatni
Przykład 3:
SUBFWB REG, 1, 0
Przed
wykonaniem instrukcji:
REG = 0x01
WREG = 0x02
C = 0
Po wykonaniu instrukcji:
REG = 0x00
WREG = 0x02
C = 1
Z = 1 ; wynikiem jest zero
N = 0
Składnia: SUBLW k
Argumenty: k = 0...255
Operacja: WREG ← k - WREG
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0000 1000 kkkk kkkk
Opis: Zawartość akumulatora WREG jest odejmowana od 8-bitowej stałej k. Wynik trafia do WREG.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis do WREG |
Przykład 1:
SUBLW 0x02
Przed wykonaniem instrukcji:
WREG = 0x01
C = ?
Po wykonaniu instrukcji:
WREG = 0x1
C = 1 ; wynik jest dodatni
Z = 0
N = 0
Przykład 2:
SUBLW 0x02
Przed wykonaniem instrukcji:
WREG = 0x02
C = ?
Po wykonaniu instrukcji:
WREG = 0x0
C = 1 ; wynikiem jest zero
Z = 1
N = 0
Przykład 3:
SUBLW 0x02
Przed wykonaniem instrukcji:
WREG = 0x03
C = ?
Po wykonaniu instrukcji:
WREG = 0xFF ; -1 w kodzie U2
C = 0 ; wynik jest ujemny
Z = 0
N = 1
Składnia: SUBWF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← f - WREG
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0101 11da ffff ffff
Opis: Odjęcie od rejestru f zawartości akumulatora WREG metodą
uzupełnień do 2. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład 1:
SUBWF REG
Przed wykonaniem instrukcji:
REG = 0x03
WREG = 0x02
C = ?
Po wykonaniu instrukcji:
REG = 0x01
WREG = 0x02
C = 1 ; wynik jest dodatni
Z = 0
N = 0
Przykład 2:
SUBWF REG, W
Przed wykonaniem instrukcji:
REG = 0x02
WREG = 0x02
C = ?
Po wykonaniu instrukcji:
REG = 0x02
WREG = 0x00
C = 1 ; wynikiem jest zero
Z = 1
N = 0
Przykład 3:
SUBWF REG
Przed wykonaniem instrukcji:
REG = 0x01
WREG = 0x02
C = ?
Po wykonaniu instrukcji:
REG = 0xFF ; -1 w kodzie U2
WREG = 0x02
C = 0 ; wynik jest ujemny
Z = 0
N = 1
Składnia: SUBWFB f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← f - WREG - C
Modyfikowane znaczniki stanu: N, OV, C, DC, Z
Kod: 0101 10da ffff ffff
Opis: Odjęcie od rejestru f zawartości akumulatora WREG i
znacznika przeniesienia (tutaj pożyczki)
C metodą uzupełnień do 2. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład 1:
SUBWFB REG, 1, 0
Przed wykonaniem instrukcji:
REG = 0x19 (0001 1001)
WREG = 0x0D (0000 1101)
C = 1
Po wykonaniu instrukcji:
REG = 0x0C (0000 1011)
WREG = 0x0D (0000 1101)
C = 1
Z = 0
N = 0 ; wynik jest dodatni
Przykład 2:
SUBWFB REG, 0, 0
Przed wykonaniem instrukcji:
REG = 0x1B (0001 1011)
WREG = 0x1A (0001 1010)
C = 0
Po wykonaniu instrukcji:
REG = 0x1B (0001 1011)
WREG = 0x00
C = 1
Z = 1 ; wynikiem jest zero
N = 0
Przykład 3:
SUBWFB REG, 1, 0
Przed wykonaniem instrukcji:
REG = 0x03 (0000 0011)
WREG = 0x0E (0000 1101)
C = 1
Po wykonaniu instrukcji:
REG = 0xF5 (1111 0100) ; metoda uzupełnień do 2
WREG = 0x0E (0000 1101)
C = 0
Z = 0
N = 1 ; wynik jest ujemny
Składnia: SWAPF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja:
dest[7:4] ← f[3:0]
dest[3:0] ← f[7:4]
Modyfikowane znaczniki stanu: Żaden
Kod: 0011 10da ffff ffff
Opis: Górna i dolna połówka rejestru f zostają zamienione
miejscami. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
SWAPF REG
Przed wykonaniem instrukcji:
REG = 0x53
Po wykonaniu instrukcji:
REG = 0x35
Składnia:
TBLRD *
TBLRD *+
TBLRD *-
TBLRD +*
Argumenty: żadne
Operacja:
TBLRD *:
TABLAT ← Pamięć programu (TBLPTR)
Wskaźnik TBLPTR nie jest zmieniany
TBLRD *+:
TABLAT ← Pamięć programu (TBLPTR)
TBLPTR ← TBLPTR + 1
TBLRD *-:
TABLAT ← Pamięć programu (TBLPTR)
TBLPTR ← TBLPTR - 1
TBLRD +*:
TBLPTR ← TBLPTR + 1
TABLAT ← Pamięć programu (TBLPTR)
Modyfikowane znaczniki stanu: żaden
Kod:
0000 0000 0000 11nn
nn = 00: *
nn = 01: *+
nn = 10: *-
nn = 11: +*
Opis: Instrukcja ta jest używana do odczytu zawartości pamięci programu. Jest potrzebna, ponieważ w architekturze harwardzkiej procesora PIC przestrzeń pamięci danych i przestrzeń pamięci programu są rozdzielone. Do adresowania pamięci programu używany jest tzw. wskaźnik tablicy (ang. Table Pointer, TBLPTR). Ma on rozmiar 21 bitów i może wskazywać na każdy bajt w pamięci programu, co daje mu zakres adresowy 2MB (221). Najmłodszy bit wskaźnika określa bajt adresowanego słowa pamięci programu (pamięć programu zorganizowana jest w słowa 16-bitowe, ponieważ taki jest format instrukcji mikrokontrolera PIC18):
TBLPTR[0] = 0: Dolny bajt słowa
pamięci programu
TBLPTR[0] = 1: Górny bajt słowa pamięci programu
Instrukcja TBLWT może modyfikować wskaźnik TBLPTR w następujący sposób:
*
– bez zmian*+
– postinkrementacja, czyli zwiększenie o jeden po
użyciu*-
– postdekrementacja, czyli zmniejszenie o jeden po
użyciu+*
– preinkrementacja, czyli zwiększenie o jeden
przed użyciemLiczba słów instrukcji: 1
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak działania |
Brak działania |
Brak działania |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Odczyt pamięci programu |
Brak działania |
Zapis TABLAT |
Przykład 1:
TBLRD *+ ;
Przed wykonaniem instrukcji:
TABLAT = ?
TBLPTR = 0x00A356
PAMIĘĆ(0x00A356) = 0x34
Po wykonaniu instrukcji:
TABLAT = 0x34
TBLPTR = 0x00A357
Przykład 2:
TBLRD +* ;
Przed wykonaniem instrukcji:
TABLAT = ?
TBLPTR = 0x01A357
PAMIĘĆ(0x01A357) = 0x12
PAMIĘĆ(0x01A358) = 0x34
Po wykonaniu instrukcji:
TABLAT = 0x34
TBLPTR = 0x01A358
Składnia:
TBLWT *
TBLWT *+
TBLWT *-
TBLWT +*
Argumenty: żadne
Operacja:
TBLWT *:
Rejestr przechowujący ← TABLAT
Wskaźnik TBLPTR nie jest zmieniany
TBLWT *+:
Rejestr przechowujący ← TABLAT
TBLPTR ← TBLPTR + 1
TBLWT *-:
Rejestr przechowujący ← TABLAT
TBLPTR ← TBLPTR - 1
TBLWT +*:
TBLPTR ← TBLPTR + 1
Rejestr przechowujący ← TABLAT
Modyfikowane znaczniki stanu: żaden
Kod:
0000 0000 0000 11nn
nn = 00: *
nn = 01: *+
nn = 10: *-
nn = 11: +*
Opis: Instrukcja używa trzy najmłodsze bity rejestru wskaźnika TBLPTR do określenia, do którego z ośmiu rejestrów przechowujących zostanie zapisana zawartość rejestru TABLAT. Rejestry przechowujące (ang. holding registers) używane są przy programowaniu zawartości pamięci programu. Szczegóły tego procesu znajdziesz w danych technicznych mikrokontrolera PIC18. Do adresowania pamięci programu używany jest tzw. wskaźnik tablicy (ang. Table Pointer, TBLPTR). Ma on rozmiar 21 bitów i może wskazywać na każdy bajt w pamięci programu, co daje mu zakres adresowy 2MB (221). Najmłodszy bit wskaźnika określa bajt adresowanego słowa pamięci programu (pamięć programu zorganizowana jest w słowa 16-bitowe, ponieważ taki jest format instrukcji mikrokontrolera PIC18):
TBLPTR[0] = 0: Dolny bajt słowa
pamięci programu
TBLPTR[0] = 1: Górny bajt słowa pamięci programu
Instrukcja TBLWR może modyfikować wskaźnik TBLPTR w następujący sposób:
*
– bez zmian*+
– postinkrementacja, czyli zwiększenie o jeden po
użyciu*-
– postdekrementacja, czyli zmniejszenie o jeden po
użyciu+*
– preinkrementacja, czyli zwiększenie o jeden
przed użyciemOdczytany z pamięci programu bajt zapisywany jest do rejestru TABLAT.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 2
Operacje w taktach zegarowych:
Pierwszy
cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Brak działania |
Brak działania |
Brak działania |
|
Drugi cykl rozkazowy |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Odczyt TABLAT |
Brak działania |
Zapis do rejestru przechowującego |
Przykład 1:
TBLWT *+;
Przed wykonaniem instrukcji:
TABLAT = 0x55
TBLPTR = 0x00A356
Rejestr przechowujący
(0x00A356) = 0xFF
Po wykonaniu instrukcji: (zakończenie zapisu tablicy)
TABLAT = 0x55
TBLPTR = 0x00A357
Rejestr przechowujący
(0x00A356) = 0x55
Przykład 2:
TBLWT +*;
Przed wykonaniem instrukcji:
TABLAT = 0x34
TBLPTR = 0x01389A
Rejestr przechowujący
(0x01389A) = 0xFF
Rejestr przechowujący
(0x01389B) = 0xFF
Po wykonaniu instrukcji: (zakończenie zapisu tablicy)
TABLAT = 0x34
TBLPTR = 0x01389B
Rejestr przechowujący
(0x01389A) = 0xFF
Rejestr przechowujący
(0x01389B) = 0x34
Składnia: TSTFSZ f{,a}
Argumenty: f = 0...255, a = 0...1
Operacja: Pominięcie następnej instrukcji, jeśli f = 0
Modyfikowane znaczniki stanu: żaden
Kod: 0110 011a ffff ffff
Opis: Jeśli f = 0, następna instrukcja pobrana w czasie wykonywania instrukcji
bieżącej
(nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor
wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja TSTFSZ wykonuje się w tym
przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową
(2 słowa w pamięci programu), to mikroprocesor wykonuje
2 instrukcje puste NOP. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1/2/3
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Brak działania |
Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Q1 | Q2 | Q3 | Q4 |
Brak działania |
Brak działania |
Brak działania |
Brak działania |
Przykład:
HERE | TSTFSZ | CNT |
NZERO | : | |
ZERO | : |
Przed wykonaniem instrukcji:
PC = adres (HERE)
Po wykonaniu instrukcji:
Jeśli CNT = 0;
PC = adres (ZERO)
Jeśli CNT ≠ 0;
PC = adres (NZERO)
Składnia: XORLW k
Argumenty: k = 0...255
Operacja: WREG ← WREG ^ k
Modyfikowane znaczniki stanu: N, Z
Kod: 0000 1010 kkkk kkkk
Opis: Zawartość akumulatora WREG zostaje poddana operacji różnicy symetrycznej z 8-bitową stałą k. Wynik jest umieszczany w akumulatorze WREG.
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt stałej k |
Przetwarzanie danych |
Zapis do rejestru WREG |
Przykład:
XORLW 0xAF
Przed wykonaniem instrukcji:
WREG = 0xB5
Po wykonaniu instrukcji:
WREG = 0x1A
Składnia: XORWF f{,d{,a}}
Argumenty: f = 0...255, d = 0...1, a = 0...1
Operacja: dest ← WREG ^ f
Modyfikowane znaczniki stanu: N, Z
Kod: 0001 10da ffff ffff
Opis: Różnica symetryczna akumulatora WREG
i rejestru f. Jeśli
Liczba słów instrukcji: 1
Liczba cykli rozkazowych: 1
Operacje w taktach zegarowych:
Q1 | Q2 | Q3 | Q4 |
Dekodowanie |
Odczyt rejestru f |
Przetwarzanie danych |
Zapis do rejestru dest |
Przykład:
XORWF REG
Przed
wykonaniem instrukcji:
REG = 0xAF
WREG = 0xB5
Po wykonaniu instrukcji:
REG = 0x1A
WREG = 0xB5
![]() |
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.