Lista rozkazów mikrokontrolerów rodziny MCS-51
Poniżej w tabeli zamieszczono listę wszystkich rozkazów mikrokontrolerów rodziny MCS-51. Obok każdego rozkazu przedstawiono realizowane przez mikrokontroler operacje w ramach wykonania danego rozkazu, liczbę cykli maszynowych potrzebną do jego wykonania oraz ilość bajtów zajmowaną przez ten rozkaz w pamięci kodu.
W klasycznej wersji mikrokontrolera MCS-51 jeden cykl maszynowy odpowiada 12 taktom zegara systemowego, co przy znajomości częstotliwości tego zegara pozwala na obliczenie czasu wykonywania danego rozkazu. W przypadku klonów tego mikrokontrolera liczba taktów zegara systemowego przypadająca na jeden cykl maszynowy może być inna. Wtedy po dokładną informację należy odnieść się do dokumentacji danego mikrokontrolera. |
Klikając na mnemonik danej instrukcji można przejść do strony opisującej ją dokładniej. Jednocześnie kolejne strony tego opracowania opisują każdą z grup instrukcji tematycznie.
Poniżej przedstawiono omówienie zastosowanych oznaczeń.
Rn | Jeden z rejestrów R0 do R7 aktywnego banku rejestrów. |
addr8 | 8-bitowy adres w wewnętrznej pamięci danych adresowanej bezpośrednio. |
@Ri | 8-bitowy adres umieszczony w jednym z dwóch rejestrów R0 lub R1 aktywnego banku rejestrów. |
#data8 | 8-bitowa stała kodowana wewnątrz instrukcji. |
#data16 | 16-bitowa stała kodowana wewnątrz instrukcji. |
addr16 | 16-bitowy adres używany w instrukcjach LJMP i LCALL (praktycznie zastępowany przez etykietę). |
addr11 | 11-bitowy adres używany w instrukcjach AJMP oraz ACALL (praktycznie zastępowany przez etykietę). |
rel | 8-bitowe przesuniecie traktowane jako liczba ze znakiem w kodzie U2 i używane w instrukcji SJMP oraz wszystkich instrukcjach skoków warunkowych (praktycznie zastępowane przez etykietę). |
bit | Adres bitu z wewnętrznej pamięci danych adresowanego bitowo lub obszaru SFR. |
(x) | W opisie operacji oznacza zawartość komórki w wewnętrznej pamięci danych o adresie bezpośrednim x. |
((x)) | W opisie operacji oznacza zawartość komórki wewnętrznej pamięci danych o adresie zapisanym w rejestrze x. |
(y)XDATA | W opisie operacji oznacza zawartość komórki w zewnętrznej pamięci danych o adresie y. |
(z)CODE | W opisie operacji oznacza zawartość komórki w pamięci kodu o adresie z. |
Xy..z | W opisie operacji oznacza bity od y do z rejestru X. |
UWAGA: Nie wszystkie linki w poniższej tabeli działają poprawnie, gdyż nie wszystkie instrukcje zostały opracowane.
Instrukcje arytmetyczne | ||||
---|---|---|---|---|
Rozkaz | Wykonywane operacje | Cykle maszynowe |
Rozmiar [bajty] |
|
Mnemonik | Argumenty | |||
ADD | A,Rn | (A) <− (A) + (Rn) | 1 | 1 |
ADD | A,addr8 | (A) <− (A) + (addr8) | 1 | 2 |
ADD | A,@Ri | (A) <− (A) + ((Ri)) | 1 | 1 |
ADD | A,#data8 | (A) <− (A) + data8 | 1 | 2 |
ADDC | A,Rn | (A) <− (A) + (Rn) + (C) | 1 | 1 |
ADDC | A,addr8 | (A) <− (A) + (addr8) + (C) | 1 | 2 |
ADDC | A,@Ri | (A) <− (A) + ((Ri)) + (C) | 1 | 1 |
ADDC | A,#data8 | (A) <− (A) + data8 + (C) | 1 | 2 |
SUBB | A,Rn | (A) <− (A) - (Rn) | 1 | 1 |
SUBB | A,addr8 | (A) <− (A) - (addr8) | 1 | 2 |
SUBB | A,@Ri | (A) <− (A) - ((Ri)) | 1 | 1 |
SUBB | A,#data8 | (A) <− (A) - data8 | 1 | 2 |
INC | A | (A) <− (A) + 1 | 1 | 1 |
INC | Rn | (Rn) <− (Rn) + 1 | 1 | 1 |
INC | addr8 | (addr8) <− (addr8) + 1 | 1 | 2 |
INC | @Ri | ((Ri)) <− ((Ri)) + 1 | 1 | 1 |
INC | DPTR | (DPTR) <− (DPTR) + 1 | 2 | 1 |
DEC | A | (A) <− (A) - 1 | 1 | 1 |
DEC | Rn | (Rn) <− (Rn) - 1 | 1 | 1 |
DEC | addr8 | (addr8) <− (addr8) - 1 | 1 | 2 |
DEC | @Ri | ((Ri)) <− ((Ri)) - 1 | 1 | 1 |
MUL | AB | (BA)15..0 <− (A) · (B) A – młodszy bajt wyniku, B – starszy bajt |
4 | 1 |
DIV | AB | całości wyniku: (A) <− int (A/B) reszta wyniku: (B) <− mod (A/B) |
4 | 1 |
DA | A | Jeśli [[(A)3..0 > 9] lub [AC = 1]] to (A)3..0 <− (A)3..0 + 6 Jeśli [[(A)7..4 > 9] lub [C = 1]] to (A)7..4 <− (A)7..4 + 6 |
1 | 1 |
Instrukcje logiczne | ||||
Rozkaz | Wykonywane operacje | Cykle maszynowe |
Rozmiar [bajty] |
|
Mnemonik | Argumenty | |||
ANL | A,Rn | (A) <− (A) and (Rn) | 1 | 1 |
ANL | A,addr8 | (A) <− (A) and (addr8) | 1 | 2 |
ANL | A,@Ri | (A) <− (A) and ((Ri)) | 1 | 1 |
ANL | A,#data8 | (A) <− (A) and data8 | 1 | 2 |
ANL | addr8,A | (addr8) <− (addr8) and (A) | 1 | 2 |
ANL | addr8,#data8 | (addr8) <− (addr8) and data8 | 2 | 3 |
ORL | A,Rn | (A) <− (A) or (Rn) | 1 | 1 |
ORL | A,addr8 | (A) <− (A) or (addr8) | 1 | 2 |
ORL | A,@Ri | (A) <− (A) or ((Ri)) | 1 | 1 |
ORL | A,#data8 | (A) <− (A) or data8 | 1 | 2 |
ORL | addr8,A | (addr8) <− (addr8) or (A) | 1 | 2 |
ORL | addr8,#data8 | (addr8) <− (addr8) or data8 | 2 | 3 |
XRL | A,Rn | (A) <− (A) xor (Rn) | 1 | 1 |
XRL | A,addr8 | (A) <− (A) xor (addr8) | 1 | 2 |
XRL | A,@Ri | (A) <− (A) xor ((Ri)) | 1 | 1 |
XRL | A,#data8 | (A) <− (A) xor data8 | 1 | 2 |
XRL | addr8,A | (addr8) <− (addr8) xor (A) | 1 | 2 |
XRL | addr8,#data8 | (addr8) <− (addr8) xor data8 | 2 | 3 |
CLR | A | (A) <− 0 | 1 | 1 |
CPL | A | (A) <− not(A) | 1 | 1 |
RL | A | 1 | 1 | |
RLC | A | 1 | 1 | |
RR | A | 1 | 1 | |
RRC | A | 1 | 1 | |
SWAP | A | (A)0..3 <−> (A)4..7 | 1 | 1 |
Instrukcje przesłania danych | ||||
Rozkaz | Wykonywane operacje | Cykle maszynowe |
Rozmiar [bajty] |
|
Mnemonik | Argumenty | |||
MOV | A,Rn | (A) <− (Rn) | 1 | 1 |
MOV | A,addr8 | (A) <− (addr8) | 1 | 2 |
MOV | A,@Ri | (A) <− ((Ri)) | 1 | 1 |
MOV | A,#data8 | (A) <− data8 | 1 | 2 |
MOV | Rn,A | (Rn) <− (A) | 1 | 1 |
MOV | Rn,addr8 | (Rn) <− (addr8) | 2 | 2 |
MOV | Rn,#data8 | (Rn) <− data8 | 1 | 2 |
MOV | addr8,A | (addr8) <− (A) | 1 | 2 |
MOV | addr8,Rn | (addr8) <− (Rn) | 2 | 2 |
MOV | addr8,addr8 | (addr8) <− (addr8) | 2 | 3 |
MOV | addr8,@Ri | (addr8) <− ((Ri)) | 2 | 2 |
MOV | addr8,#data8 | (addr8) <− data8 | 2 | 3 |
MOV | @Ri,A | ((Ri)) <− (A) | 1 | 1 |
MOV | @Ri,addr8 | ((Ri)) <− (addr8) | 2 | 2 |
MOV | @Ri,#data8 | ((Ri)) <− data8 | 1 | 2 |
MOV | DPTR,#data16 | (DPTR) <− data16 | 1 | 2 |
MOVC | A,@A+DPTR | (A) <− ((A) + (DPTR))CODE | 2 | 1 |
MOVC | A,@A+PC | (A) <− ((A) + (PC))CODE | 2 | 1 |
MOVX | A,@Ri | (A) <− ((256 · (P2) + (Ri))XDATA | 2 | 1 |
MOVX | A,@DPTR | (A) <− ((DPTR))XDATA | 2 | 1 |
MOVX | @Ri,A | (256 · (P2) + (Ri))XDATA <− (A) | 2 | 1 |
MOVX | @DPTR,A | ((DPTR)) <− (A) | 2 | 1 |
PUSH | addr8 | (SP) <− (SP) + 1 ((SP)) <− (sddr8) |
2 | 2 |
POP | addr8 | (addr8) <− ((SP)) (SP) <− (SP) - 1 |
2 | 2 |
XCH | A,Rn | (A) <−> (Rn) | 1 | 1 |
XCH | A,addr8 | (A) <−> (addr8) | 1 | 2 |
XCH | A,@Ri | (A) <−> ((Ri)) | 1 | 1 |
XCHD | A,@Ri | (A)3..0 <−> ((Ri))3..0 | 1 | 1 |
Instrukcje działań na bitach | ||||
Rozkaz | Wykonywane operacje | Cykle maszynowe |
Rozmiar [bajty] |
|
Mnemonik | Argumenty | |||
CLR | C | (CY) <− 0 | 1 | 1 |
CLR | bit | (bit) <− 0 | 1 | 2 |
SETB | C | (CY) <− 1 | 1 | 1 |
SETB | bit | (bit) <− 1 | 1 | 2 |
CPL | C | (CY) <− not(CY) | 1 | 1 |
CPL | bit | (bit) <− not(bit) | 1 | 2 |
ANL | C,bit | (CY) <− (CY) and (bit) | 2 | 2 |
ANL | C,/bit | (CY) <− (CY) and not(bit) | 2 | 2 |
ORL | C,bit | (CY) <− (CY) or (bit) | 2 | 2 |
ORL | C,/bit | (CY) <− (CY) or not(bit) | 2 | 2 |
MOV | C,bit | (CY) <− (bit) | 1 | 2 |
MOV | bit,C | (bit) <− (CY) | 2 | 2 |
JC | rel | (PC) <− (PC) + 3 Jeśli (CY) = 1 to (PC) <− (PC) + rel |
2 | 2 |
JNC | rel | PC) <− (PC) + 2 Jeśli (CY) = 0 to (PC) <− (PC) + rel |
2 | 2 |
JB | bit,rel | (PC) <− (PC) + 3 Jeśli (bit) = 1 to (PC) <− (PC) + rel |
2 | 3 |
JNB | bit,rel | (PC) <− (PC) + 3 Jeśli (bit) = 0 to (PC) <− (PC) + rel |
2 | 3 |
JBC | bit,rel | (PC) <− (PC) + 3 Jeśli (bit) = 1 to (bit) <− 0 oraz (PC) <− (PC) + rel |
2 | 3 |
Instrukcje skoków bezwarunkowych | ||||
Rozkaz | Wykonywane operacje | Cykle maszynowe |
Rozmiar [bajty] |
|
Mnemonik | Argumenty | |||
ACALL | addr11 | (PC <− (PC) + 2 (SP) <− (SP) + 1 ((SP)) <− (PC)7..0 (SP) <− (SP) + 1 ((SP)) <− (PC)15..8 (PC)10..0 <− addr11 (PC)15..11 pozostaje bez zmian |
2 | 2 |
LCALL | addr16 | (PC <− (PC) + 3 (SP) <− (SP) + 1 ((SP)) <− (PC)7..0 (SP) <− (SP) + 1 ((SP)) <− (PC)15..8 (PC) <− addr16 |
2 | 3 |
RET | (PC)15..8 <− ((SP)) (SP) <− (SP) - 1 (PC)7..0 <− ((SP)) (SP) <− (SP) - 1 |
2 | 1 | |
RETI | (PC)15..8 <− ((SP)) (SP) <− (SP) - 1 (PC)7..0 <− ((SP)) (SP) <− (SP) - 1 |
2 | 1 | |
AJMP | addr11 | (PC) <− (PC) + 2 (PC)10..0 <− addr11 (PC)15..11 pozostaje bez zmian |
2 | 2 |
LJMP | addr16 | (PC) <− addr16 | 2 | 3 |
SJMP | rel | (PC) <− (PC) + 2 (PC) <− (PC) + rel |
2 | 2 |
JMP | @A+DPTR | (PC) <− (A) + (DPTR) | 2 | 1 |
Instrukcje skoków warunkowych | ||||
Rozkaz | Wykonywane operacje | Cykle maszynowe |
Rozmiar [bajty] |
|
Mnemonik | Argumenty | |||
JZ | rel | (PC) <− (PC) + 2 Jeśli (A) = 0 to (PC) <− (PC) + rel |
2 | 2 |
JNZ | rel | (PC) <− (PC) + 2 Jeśli (A) ≠ 0 to (PC) <− (PC) + rel |
2 | 2 |
CJNE | A,addr8,rel | (PC) <− (PC) + 3 Jeśli (A) ≠ (addr8) to (PC) <− (PC) + rel Dodatkowo: Jeśli (A) < (addr8) to (CY) <− 1 Jeśli (A) ≥ (addr8) to (CY) <− 0 |
2 | 3 |
CJNE | A,#data8,rel | (PC) <− (PC) + 3 Jeśli (A) ≠ data8 to (PC) <− (PC) + rel Dodatkowo: Jeśli (A) < data8 to (CY) <− 1 Jeśli (A) ≥ data8 to (CY) <− 0 |
2 | 3 |
CJNE | Rn,#data8,rel | (PC) <− (PC) + 3 Jeśli (Rn) ≠ data8 to (PC) <− (PC) + rel Dodatkowo: Jeśli (Rn) < data8 to (CY) <− 1 Jeśli (Rn) ≥ data8 to (CY) <− 0 |
2 | 3 |
CJNE | @Ri,#data8,rel | (PC) <− (PC) + 3 Jeśli ((Ri)) ≠ data8 to (PC) <− (PC) + rel Dodatkowo: Jeśli ((Ri)) < data8 to (CY) <− 1 Jeśli ((Ri)) ≥ data8 to (CY) <− 0 |
2 | 3 |
DJNZ | Rn,rel | (PC) <− (PC) + 2 (Rn) <− (Rn) - 1 Jeśli (Rn) ≠ 0 to (PC) <− (PC) + rel |
2 | 2 |
DJNZ | addr8,rel | (PC) <− (PC) + 2 (addr8) <− (addr8) - 1 Jeśli (addr8) ≠ 0 to (PC) <− (PC) + rel |
2 | 3 |
Pozostałe instrukcje | ||||
Rozkaz | Wykonywane operacje | Cykle maszynowe |
Rozmiar [bajty] |
|
Mnemonik | Argumenty | |||
NOP | (PC) <− (PC) + 1 | 1 | 1 |