3. L p trình v i ngôn ng ASSEMBLY
Ngôn ng Assembly là h p ng r t g n v i ngôn ng máy. M i l nh c a Assembly có
s tiêu t n d li u (byte) và chu kì máy xác đ nh. Do đó, chúng ta có th d dàng nh n
ra s b trí d li u c a ch ng trình. L p trình b ng Assembly không có s tiêu t n ươ
do mã th a nh l p trình b ng ngôn ng C, m t ch ng trình vi t b ng Assembly ư ươ ế
ch y nhanh và hi u qu h n nhi u so v i ch ng trình vi t b ng C. ơ ươ ế
Tuy nhiên do Assembly r t g n v i ngôn ng máy nên đòi h i ng i l p trình ph i có ườ
m t trí nh t t, n u không, chúng ta ph i chu n b m t ch ng sách đ có th m ra ế
b t c lúc nào. Và chúng ta r t khó có th vi t m t ch ng trình l n b ng Assembly. ế ươ
a. C u trúc m t ch ng trình Assembly: ươ
Chúng ta hãy tham kh o đo n code vi t b ng Assembly đ tìm hi u c u trúc c a nó. ế
Ch ng trình nh p nháy LED theo mã nh phân tăng d n:ươ
org 0000h ;Ch ng trình b t đ u t đ a ch 0000hươ
main: ;Khai báo nhãn đ sau này dùng câu l nh nh y đ nh y t i đây
;Th t vào 1 kí t tab cho d nhìn
inc a ;Tăng giá tr thanh ghi a lên m t đ n v ơ
mov P0,a ;Chép n i dung thanh ghi a vào c ng P0
call delay ;G i hàm delay
jmp main ;Nh y đ n nhãn main ế
delay: ;Khai báo nhãn delay đ l nh call g i t i1
mov R7,#255 ;Chép giá tr 255 vào thanh ghi R7
loop: ;Khai báo nhãn loop đ nh y v đây
mov R6,#255 ; Chép giá tr 255 vào thanh ghi R7
loop1: ;Khai báo nhãn loop1 đ nh y v đây
djnz R6,loop1 ;Gi m thanh ghi R6 đi 1 và nh y n u R6>0 ế
djnz R7,loop ; Gi m thanh ghi R7đi 1 và nh y n u R7>0 ế
ret ;Tr v t hàm delay
end ;K t thúc đo n codeế
Rút ra c u trúc c a ch ng trình nh sau: ươ ư
org 0000h;B t đ u đo n code
...;Đo n l nh
end;K t thúc đo n codeế
B t đ u b ng câu l nh ORG 0000H
Ti p đ n là đo n l nh. Trong đo n l nh có các nhãn đ r nhánh ch ng trình.ế ế ươ
M i l nh b t đ u b t đ u b ng tên l nh, ti p theo là kí t tr ng hay kí t tab, r i đ n ế ế
các tham s l nh.
M i l nh ch đ c vi t trên 1 dòng. ượ ế
K t thúc b ng câu l nh ENDế
Chú ý: Trong Asembly không phân bi t ch hoa hay ch th ng. Dòng chú thích đ c ườ ượ
đ t sau d u ch m ph y ‘;’.
b. Các l nh c b n trong Assembly: ơ
Kí hi u đ c dùng d i đây ượ ướ :
o Rn: Kí hi u cho các thanh ghi R0 đ n R7 (c a băng thanh ghi đ c ch n). ế ượ
o Data: D li u tr c ti p, là 1 byte d li u bên trong RAM ho c thanh ghi ch c năng ế
đ c bi t.
o @Ri: 1 byte d li u vùng RAM đ c đánh đ a ch b i thanh ghi R0 ho c R1. ượ
o #data: 1 byte d li u t c th i (là nh ng con s do ng i l p trình đ t s n). ườ
o #data16: 2 byte d li u t c th i (là nh ng con s c a ng i l p trình). ườ
o Addr16: 16 bit đ a ch c a các l nh nh y xa và g i xa.
o Addr11: 11 bit đ a ch c a các l nh nh y tuy t đ i và g i tuy t đ i.
o Rel: 8 bit đ a ch có d u c a các l nh nh y g n và g i g n.
Các l nh c b n ơ
v Các l nh sao chép d li u:
- Tên l nh: MOV
MOV A,Rn (1 byte 1 chu kì máy) Chép n i dung thanh ghi Rn vào thanh ghi A
MOV A,data (2 byte 1 chu kì máy) Chép n i dung c a data vào thanh ghi A
MOV A,@Ri (1 byte 1 chu kì máy) Chép n i dung c a ô nh do Ri tr t i vào thanh ghi
A
MOV A,#Data (2 byte 1 chu kì máy) Ghi d li u t c th i vào thanh ghi A
MOV A,@A+DPTR (1 byte 2 chu kì máy) Chép n i dung c a ô nh ch ng trình có ươ
đ a ch A+DPTR vào thanh ghi A
MOV Rn,A (1 byte 1 chu kì máy) Chép n i dung thanh ghi A vào thanh ghi Rn
MOV Rn,data (2 byte 2 chu kì máy) Chép n i dung c a data vào thanh ghi Rn
MOV Rn,#data (2 byte 1 chu kì máy) Ghi d li u t c th i vào thanh ghi Rn
MOV data,A (2 byte 1 chu kì máy) Chép n i dung thanh ghi A vào data
MOV data,Rn (2 byte 2 chu kì máy) Chép n i dung thanh ghi Rn vào data
MOV data,data (3 byte 2 chu kì máy) Chép n i dung hai d li u tr c ti p data v i nhau ế
MOV data,@Ri (2 byte 2 chu kì máy) Chép n ii dung ô nh do Ri tr t i vào data
MOV data,#data (3 byte 2 chu kì máy) Ghi d li u t c th i vào data
MOV @Ri,A (1 byte 1 chu kì máy) Chép n i dung c a thanh ghi A vào ô nh do Ri tr
t i
MOV @Ri,data (2 byte 1 chu kì máy) Chép n i dung data vào ô nh do Ri tr t i
MOV @Ri,#data (2 byte 1 chu kì máy) Ghi d li u tr c ti p vào ô nh do Ri tr t i ế
MOV DPTR,#data (3 byte 2 chu kì máy) Ghi m t h ng 16 bit vào thanh ghi DPTR
MOV C,bit (2 byte 1 chu kì máy) Chép m t bit tr c ti p vào c nh C ế
MOV bit,C (2 byte 2 chu kì máy) Chép tr ng thái c nh C vào m t bit tr c ti p ế
- Tên l nh MOVC
MOVC A,@A+PC (1 byte 2 chu kì máy) Chép n i dung ô nh ch ng trình có đ a ch ươ
A+PC vào thanh ghi A
- Tên l nh MOVX
MOVX A,@Ri (1 byte 2 chu kì máy) Chép n i dung c a ô nh b nh ngoài do Ri tr
t i vào thanh ghi A (8 bit đ a ch )
MOVX A,@DPTR (1 byte 2 chu kì máy) Chép n i dung c a ô nh b nh ngoài do
DPTR tr t i vào thanh ghi A (16 bit đ a ch )
MOVX @Ri,A (1 byte 2 chu kì máy) Chép n i dung thanh ghi A ra ngoài
MOVX @DPTR,A (1 byte 2 chu kì máy) Chép n i dung thanh ghi A ra ngoài
- Tên l nh PUSH
PUSH data (2 byte 2 chu kì máy) Chép data lên ngăn x p và tăng SPế
- Tên l nh POP
POP data (2 byte 2 chu kì máy) Chép d li u t ngăn x p vào data và gi m SP ế
- Tên l nh XCH
XCH A,Rn (1 byte 1 chu kì máy) Trao đ i d li u gi a thanh ghi A và thanh ghi Rn
XCH A,data (2 byte 1 chu kì máy) Trao đ i d li u gi a thanh ghi A và data
XCH A,@Ri (1 byte 1 chu kì máy) Trao đ i d li u gi a thanh ghi A và ô nh do Ri tr
t i
- Tên l nh XCHD
XCHD A,@Ri (1 byte 1 chu kì máy) Trao đ i hai nibble th p c a thanh ghi A và ô nh
do Ri tr t i
v Các l nh s h c
- Tên l nh ADD
ADD A,data (2 byte 1 chu kì máy) A=A+data
ADD A,@Ri (1 byte 1 chu kì máy) A=A+@Ri
ADD A,#data (2 byte 1 chu kì máy) A=A+#data
ADD A,Rn (1 byte 1 chu kì máy) A=A+Rn
- Tên l nh ADDC
ADDC A,Rn (1 byte 1 chu kì máy) A=A+Rn+C
ADDC A,@Ri (1 byte 1 chu kì máy) A=A+@Ri+C
ADDC A,data (2 byte 1 chu kì máy) A=A+data+C
ADDC A,#data (2 byte 1 chu kì máy) A=A+#data+C
- Tên l nh SUBB
SUBB A,Rn (1 byte 1 chu kì máy) A=A-Rn-C
SUBB A,data (2 byte 1 chu kì máy) A=A-data-C
SUBB A,@Ri (1 byte 1 chu kì máy) A=A-@Ri-C
SUBB A,#data (2 byte 1 chu kì máy) A=A-#data-C
- Tên l nh INC
INC A (1 byte 1 chu kì máy) Tăng n i dung thanh ghi A lên 1
INC Rn (1 byte 1 chu kì máy) Tăng n i dung thanh ghi Rn lên 1
INC data (2 byte 1 chu kì máy) Tăng data lên 1
INC @Ri (1 byte 1 chu kì máy) Tăng n i dung ô nh do Ri tr t i lên 1
INC DPTR (1 byte 2 chu kì máy) Tăng n i dung thanh ghi DPTR lên 1
- Tên l nh DEC
DEC A (1 byte 1 chu kì máy) Gi m n i dung thanh ghi A xu ng 1
DEC Rn (1 byte 1 chu kì máy) Gi m n i dung thanh ghi Rn xu ng 1
DEC data (2 byte 1 chu kì máy) Gi m data xu ng 1
DEC @Ri (1 byte 1 chu kì máy) Gi m n i dung ô nh do Ri tr t i 1
- Tên l nh MUL
MUL AB (1 byte 4 chu kì máy) Nhân n i dung thanh ghi A v i thanh ghi B. Byte cao
l u trong thanh ghi B, byte th p l u trong A. N u k t q a l n h n 255 thì c OV b t,ư ư ế ế ơ
n u không thì b xoá. C C luôn b xoá.ế
- Tên l nh DIV
DIV AB (1 byte 4 chu kì máy) Chia n i dung thanh ghi A cho thanh ghi B. Ph n nguyên
l u trong thanh ghi A, ph n d l u trong thanh ghi B. C C và c OV đ u b xoá.ư ư ư
- Tên l nh DA
DA A (1 byte 1 chu kì máy) Hi u ch nh th p phân cho thanh ghi A.
v Các l nh lu n lý
- Tên l nh ANL
ANL A,Rn (1 byte 1 chu kì máy) AND n i dung thanh ghi A v i Rn, ll u vào thanh ghi ư
A
ANL A,data (2 byte 1 chu kì máy) AND n i dung thanh ghi A v i data, l u vào thanh ư
ghi A
ANL A, @Ri (1 byte 1 chu kì máy) AND n i dung thanh ghi A v i @Ri, l u vào thanh ư
ghi A
ANL A,#data (2 byte 1 chu kì máy) AND n i dung thanh ghi A v i #data, l u vào thanh ư
ghi A
ANL data,A (2 byte 1 chu kì máy) AND n i dung thanh ghi A v i data, l u vào data ư
ANL data,#data (3 byte 2 chu kì máy) AND data v i #data, l u vào data ư
ANL C,bit (2 byte 2 chu kì máy) AND C v i bit, l u vào C ư
ANL C,/bit (2 byte 2 chu kì máy) AND C v i đ o c a bit, l u vào C ư
- Tên l nh ORL
ORL A,Rn (1 byte 1 chu kì máy) OR n i dung thanh ghi A v i Rn, ll u vào thanh ghi A ư
ORL A,data (2 byte 1 chu kì máy) OR n i dung thanh ghi A v i data, l u vào thanh ghi ư
A
ORL A,@Ri (1 byte 1 chu kì máy) OR n i dung thanh ghi A v i @Ri, l u vào thanh ghi ư
A
ORL A,#data (2 byte 1 chu kì máy) OR n i dung thanh ghi A v i #data, l u vào thanh ư
ghi A
ORL data, A (2 byte 1 chu kì máy) Orn i dung thanh ghi A v i data, l u vào data ư
ORL data,#data (3 byte 1 chu kì máy) OR data v i #data, l u vào data ư
ORL C,bit (2 byte 2 chu kì máy) OR C v i bit, l u vào C ư
ORL C,\bit (2 byte 2 chu kì máy) OR C v i đ o c a bit, l u vào C ư
- Tên l nh XRL
XRL A,Rn (1 byte 1 chu kì máy) XOR n i dung thanh ghi A v i Rn, ll u vào thanh ghi ư
A
XRL A,data (2 byte 1 chu kì máy) XOR n i dung thanh ghi A v i data, l u vào thanh ư
ghi A
XRL A,@Ri (1 byte 1 chu kì máy) XOR n i dung thanh ghi A v i @Ri, l u vào thanh ư
ghi A
XRL A,#data (2 byte 1 chu kì máy) XOR n i dung thanh ghi A v i #data, l u vào thanh ư
ghi A
XRL data,A (2 byte 1 chu kì máy) XORn i dung thanh ghi A v i data, l u vào data ư
XRL data,#data (3 byte 1 chu kì máy) XOR data v i #data, l u vào data ư
- Tên l nh SETB
SETB C (1 byte 1 chu kì máy) B t c nh C
SETB bit (2 byte 1 chu kì máy) B t bit tr c ti p ế
- Tên l nh CLR
CLR A (1 byte 1 chu kì máy) Xoá thanh ghi A
CLR C (1 byte 1 chu kì máy) Xoá c nh C
CLR bit (2 byte 1 chu kì máy) Xoá bit tr c ti p ế
- Tên l nh CPL
CPL A (1 byte 1 chu kì máy) L y bù thanh ghi A