Programowanie mikrokontrolera 8051
Asembler mikrokontrolera 8051
mnemonik [argument docelowy] , [argument źródłowy]
mov A , #0 ; komentarz
Tryby adresowania
●
adresowanie natychmiastowe
- argumenty: #data - 8 bitowa wartość, #d16 - 16bitowa wartość
mov A,#10H
mov DPTR,#1234H
●
adresowanie rejestrowe
- argumenty: A, B, Rr - R0 ... R7
mov A,R0
●
adresowanie pośrednie
- argumenty: @DPTR, @Ri - @R0, @R1
mov A,@R0
movx A,@DPTR
●
adresowanie pośrednie indeksowe
- argumenty: @A+DPTR, @A+PC
movc A,@A+DPTR
movc A,@A+PC
●
adresowanie bezpośrednie
- argumenty: direct - adres komórki wewnętrznej pamięci RAM lub adres
SFR
mov A,DPH
●
adresowanie bezpośrednie bitowe
- argumenty: bit - bitowy adres komórki wewnętrznej pamięci RAM lub adres
SFR
setb ACC.4
Lista instrukcji asemblera mikrokontrolera 8051
●
instrukcje arytmetyczne
ADD A,Rr
- dodaje zawartość wskazanego rejestru R0...R7 do z
zawartości akumulatora
ADD A,direct - dodaje bajt adresowany bezpośrednio do zawartości
akumulatora
ADD A,E2H
ADD A,TH1
ADD A,@Ri
- dodaje zawartość komórki pamięci RAM, której adres
umieszczony jest w rejestrze R0 lub R1 do akumulatora
ADD A,#data - dodaje wartość natychmiastową do akumulatora
ADD A,#3
- grupa instrukcji analogiczna do grupy ADD, przy czym do
ADDC A,Rr
ADDC A,direct
ADDC A,@Ri
ADDC A,#data
sumy dodawany jest bit przeniesienia C
(A)=(A)+(argument)+(C)
SUBB A,Rr
SUBB A,direct
SUBB A,@Ri
SUBB A,#data
- grupa instrukcji analogiczna do grupy ADDC, przy czym
obliczana jest różnica z pożyczką
(A)=(A)-(argument)-(C)
INC A
- zwiększa o 1 zawartość akumulatora
INC Rr
- zwiększa o 1 zawartość rejestru Rr
INC direct
- zwiększa o 1 zawartość komórki pamięci RAM adresowanej
bezpośrednio
INC A4H
INC TH0
INC @Ri
- zwiększa o 1 zawartość komórki pamięci RAM, której adres
podany jest w rejestrze R0 lub R1
DEC A
DEC Rr
DEC direct
DEC @Ri
- grupa analogiczna do polecenia INC, przy czym operacją
jest zmniejszenie o 1 wskazanego argumentu
INC DPTR
- zwiększa o 1 zawartość 16-bitowego rejestru DPTR
MUL AB
- mnoży zawartość akumulatora przez zawartość rejestru B.
Starsza część 16 bitowego wyniku umieszczana jest w
rejestrze B, a młodsza w akumulatorze
DIV AB
- dzieli zawartość akumulatora przez zawartość rejestru B.
Iloraz umieszczany jest akumulatorze, a reszta z dzielenia w
rejestrze B
DA A
- dokonuje korekty dziesiętnej akumulatora po operacjach
arytmetycznych w kodzie BCD
●
instrukcje logiczne
ANL A,Rr
- umieszcza w akumulatorze iloczyn logiczny
poszczególnych bitów rejestru Rr i odpowiednich bitów
akumulatora
A =10010111
MOV A,#10010111B
R1 =00100111
MOV R1,#00100111B
A =00000111
ANL A,R1
ANL A,direct - umieszcza w akumulatorze iloczyn logiczny
poszczególnych bitów pamięci RAM o podanym adresie i
zawartości akumulatora
ANL A,@Ri
- umieszcza w akumulatorze iloczyn logiczny
poszczególnych bitów komórki pamięci RAM o adresie
podanym w rejestrze R0 lub R1 i zawartości akumulatora.
ANL A,#data - umieszcza w akumulatorze iloczyn logiczny
poszczególnych bitów danej natychmiastowej i zawartości
akumulatora
ANL direct,A - umieszcza w komórce pamięci RAM o podanym adresie
bezpośrednim iloczyn logiczny zawartości tej komórki i
zawartości akumulatora.
ANL direct,#data
- umieszcza w komórce pamięci RAM o podanym adresie
bezpośrednim iloczyn logiczny zawartości tej komórki i
danej natychmiastowej umieszczonej w drugim bajcie
instrukcji
ORL A,Rr
ORL A,direct
ORL A,@Ri
ORL A,#data
ORL direct,A
ORL direct,#data
- grupa instrukcji analogiczna do grupy instrukcji ANL, przy
czym operacją jest suma logiczna poszczególnych bitów
argumentów
A =10010111
MOV A,#10010111B
R1 =00100111
MOV R1,#00100111B
A =10110111 XRL A,R1
XRL A,Rr
XRL A,direct
XRL A,@Ri
XRL A,#data
XRL direct,A
XRL direct,#data
- grupa instrukcji analogiczna do grupy instrukcji ANL, przy
czym operacją jest różnica symetryczna poszczególnych
bitów argumentów
A =10010111
MOV A,#10010111B
R1 =00100111
MOV R1,#00100111B
A =10110000 XRL A,R1
CLR A
- zeruje akumulator
CPL A
- neguje wszystkie bity akumulatora
RL A
- przesuwa akumulator w lewo o 1 bit
RLC A
- przesuwa akumulator w lewo o 1 bit z uwzględnieniem bitu
przeniesienia C
RR A
- przesuwa akumulator w prawo o 1 bit
RRC A
- przesuwa akumulator w prawo o 1 bit z uwzględnieniem
bitu przeniesienia C
SWAP A
- zamienia ze sobą miejscami tetrady akumulatora
●
instrukcje przesłań
MOV A,Rr
MOV A, direct
MOV A,@Ri
MOV A,#data
- kopiuje argument źródłowy do akumulatora
MOV A,R3
przed: A=13H ,
R3=AFH
po:
A=AFH,
R3=AFH
MOV A,@R0
przed: A=13H,
R0=6FH, Mem(6FH)=1FH
po:
A=1FH,
R0=6FH, Mem(6FH)=1FH
MOV Rr,A
- kopiuje argument źródłowy do rejestru pomocniczego Rr
MOV Rr,direct
MOV Rr,#data
MOV direct,A
MOV direct,Rr
MOV direct,direct
MOV direct,@Ri
MOV direct,#data
- kopiuje argument źródłowy do komórki pamięci RAM
zaadresowanej bezpośrednio
MOV @Ri,#data
MOV @Ri,direct
MOV @Ri,A
- kopiuje argument źródłowy do pamięci RAM o adresie
podanym w rejestrze R0 lub R1
MOV DPTR,#d16 - kopiuje daną natychmiastową 16-bitową do rejestru DPTR
MOV DPTR,#1234H
przed: DPL=00,
DPH=00
po:
DPL=34H,
DPH=12H
MOVC
A,@A+DPTR
- kopiuje do akumulatora bajt pamięci programu, przy czym
jego adres obliczany jest jako suma zawartości rejestru
DPTR z zawartością podaną w akumulatorze
przed: A=00H,
DPTR=311H, EPROM(312H)=22H
po:
A=22H,
DPTR=311H EPROM(312H)=22H
MOVC A,@A+PC
- kopiuje do akumulatora bajt pamięci programu, przy czym
jego adres obliczany jest jako suma zawartości licznika
rozkazów PC z zawartością podaną w akumulatorze
Adr. ROM
0100
0102
0103
0106
0109
Zawartość ROM
74 05
83
02 01 0A
01 FF 03
09
DB
X1:
Instrukcja
MOV A,#4
MOVC A,@A+PC
LJMP L1
DB 01,FFH,03
L1: NOP; A=FFH
MOVX A,@Ri - kopiuje do akumulatora zawartość komórki zewnętrznej
pamięci RAM, której adres zawarty jest w rejestrze R0 lub
R1. Instrukcją można zaadresować obszar 256 bajtów
zewnętrznej pamięci RAM
MOVX
A,@DPTR
- kopiuje do akumulatora zawartość komórki zewnętrznej
pamięci RAM, której adres zawarty jest w rejestrze DPTR
MOV DPTR,#1234H
MOVX A,@DPTR
przed: A=01H, RAMX(1234H)=7EH
po:
A=7EH, RAMX(1234H)=7EH
MOVX @Ri,A - kopiuje zawartość akumulatora do komórki zewnętrznej
pamięci RAM, której adres zawarty jest rejestrze R0 lub R1.
Instrukcją można zaadresować obszar 256 bajtów
zewnętrznej pamięci RAM
MOVX
@DPTR,A
- kopiuje zawartość akumulatora do komórki zewnętrznej
pamięci RAM, której adres zawarty jest w rejestrze DPTR
PUSH direct
- odkłada na stosie komórkę pamięci RAM o adresie
bezpośrednim. Wskaźnik stosu SP jest inkrementowany
przed odłożeniem danej na stosie
PUSH DPH
PUSH DPL
PRZED:
SP=30H
DPTR=1234H
PO:
SP=32H
DPTR=1234H
RAM(30H)
RAM(31H)
RAM(32H)
10H
xx
xx
RAM(30H)
RAM(31H)
RAM(32H)
10H
12H
34H
POP direct
- zdejmuje ze stosu daną i kopiuje ją do komórki
adresowanej bezpośrednio. Wskaźnik stosu SP jest
dekrementowany po zdjęciu danej ze stosie
POP DPL
POP DPH
PRZED:
SP=32H
DPTR=0000H
PO:
SP=30H
DPTR=1234H
RAM(30H)
RAM(31H)
RAM(32H)
10H
12H
34H
RAM(30H)
RAM(31H)
RAM(32H)
10H
12H
34H
XCH A,Rr
- zamienia miejscami zawartości akumulatora i rejestru Rr
XCH A,R1
przed: A=01H,
R1=7FH
po:
A=7FH,
R1=01H
XCH A,direct - zamienia zawartości akumulatora i komórki pamięci RAM
adresowanej bezpośrednio
XCH A,@Ri
- zamienia zawartości akumulatora i komórki pamięci RAM,
której adres podano w rejestrze R0 lub R1
XCHD A,@Ri - zamienia młodsze tetrady akumulatora i komórki pamięci
RAM, o adresie podanym w rejestrze R0 lub R1
XCHD A,@R1
przed: A=01H,
R1=30H
RAM(30H)=7FH
po:
A=0FH,
R1=30H
RAM(30H)=71H
●
instrukcje operacji boolowskich
CLR C
- zeruje bit przeniesienia C
CLR bit
- zeruje bit adresowany bezpośrednio
CLR 11H
CLR ACC.5
SETB C
- ustawia bit przeniesienia C
SETB bit
- ustawia bit adresowany bezpośrednio
CPL C
- neguje bit przeniesienia C
CPL bit
- neguje bit adresowany bezpośrednio
ANL C,bit
- umieść w bicie przeniesienia wynik operacji iloczynu
logicznego C i bitu adresowanego bezpośrednio
ANL C,ACC.1
przed: C=1, ACC.1=0
po:
C=0, ACC.1=0
ANL C,/bit
- umieść w bicie przeniesienia wynik operacji iloczynu
logicznego C i negacji bitu adresowanego bezpośrednio
ORL C,bit
- umieść w bicie przeniesienia wynik operacji sumy logicznej
C i bitu adresowanego bezpośrednio
ORL C,/bit
- umieść w bicie przeniesienia wynik operacji sumy logicznej
C i negacji bitu adresowanego bezpośrednio
MOV C,bit
- kopiuje bit adresowany bezpośrednio do bitu przeniesienia
MOV bit,C
- kopiuje bit przeniesienia do bitu adresowanego
bezpośrednio
●
instrukcje rozgałęzień programu
ACALL adr11 - wywołaj podprogram, którego adres znajduje się na tej
samej 2kB stronie programu
(PC)
(SP)
((SP))
(SP)
((SP))
←
←
←
←
←
(PC)+2
(SP)+1
(PC7-0)
(SP)+1
(PC15-8)
zapamiętanie adresu
powrotu na stosie
(PC10-0)
←
adr 11
wpisanie do PC
adresu podprogramu
MOV A,#1
ACALL PROC
MOV R1,A
.....
PROC:
MOV R1,A
MOV A,@R1
RET
RET
- instrukcja powrotu z podprogramu
(PC15..8)
(SP)
(PC7...0)
(SP)
←
←
←
←
((SP))
(SP)-1
((SP))
(SP)-1
RETI
- instrukcja powrotu z procedury obsługi przerwania
AJMP adr11
- wykonuje skok bezwarunkowy pod adres znajdujący się na
tej samej stronie 2KB
(PC10..0)
←
adr10..0
(PC15..11) - bez zmian
LJMP adr16
- wykonuje skok bezwarunkowy w dowolne miejsce
programu
(PC)
←
adr15...0
SJMP rel
- wykonuje skok bezwarunkowy krótki (-128B...+127B).
Adres skoku obliczany jest jako PC+rel
JMP @A+DPTR - wykonuje skok pod adres obliczony jako suma wartości
rejestru DPTR i akumulatora
MOV DPTR,#TAB
JMP @A+DPTR
TAB: AJMP L0
AJMP L1
AJMP L2
JZ rel
- wykonuje skok względny jeśli wartość akumulatora równa
się zero
JNZ rel
- wykonuje skok względny jeśli wartość akumulatora różna
jest od zera
JC rel
- wykonuje skok względny jeśli wartość bitu przeniesienia
równa się jeden
JNC rel
- wykonuje skok względny jeśli wartość bitu przeniesienia
równa się zero
JB bit,rel
- wykonuje skok względny jeśli wartość testowanego bitu
równa się jeden
MOV A,R1
JB ACC.0,L1
MOV R1,#0
L1: MOV A,R0
JNB bit,rel
- wykonuje skok względny jeśli wartość testowanego bitu
równa się jzero
JBC bit,rel
- wykonuje skok względny jeśli wartość testowanego bitu
równa się jeden i kasuje go
CJNE A,direct,rel
CJNE A,#data,rel
CJNE Rr,#data,rel
CJNE
@
Ri,
#
data,rel
- porównuje zawartość pierwszego argumentu z zawartością
drugiego argumentu i jeżeli wartości te nie są takie same, to
wykonuje skok względny. Jeśli wartość argument drugiego
jest większa od wartości argumentu pierwszego to
ustawiany jest bit przeniesienia. W przeciwnym wypadku bit
przeniesienia jest kasowany
DJNZ Rr,rel
DJNZ direct,rel
- zmniejsza o 1 zawartość wskazanego argumentu i jeżeli
jest ona różna od zera to wykonuje skok względny
MOV R1,#7
L1: MOV A,@R1
...................
DJNZ R1,L1
NOP
- operacja pusta - nic nie rób przez jeden cykl
●
tylko wybrane instrukcje modyfikują flagi rejestru statusowego
Tab. 9.1. Flagi rejestru statusowego modyfikowane przez instrukcje 8051.
Instrukcja
C
OV AC
Instrukcja
C
OV AC
ADD
X
X
X
MOV C,BIT
X
ADDC
X
X
X
SETB C
1
SUBB
X
X
X
CLR C
0
MUL
0
X
CPL C
X
DIV
0
X
ANL C,BIT
X
RLC
X
ANL C,/BIT
X
RRC
X
ORL C,BIT
X
DA
X
ORL C,/BIT
X
CJNE
X