
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ấ