
CH NG 3 ƯƠ
L P TRÌNH B NG H P NG MCS51Ậ Ằ Ợ Ữ
L p trình h p ng (assembly language programming) cho h vi đi u khi n MCS51.ậ ợ ữ ọ ề ể
M t ch ng trình vi t b ng h p ng (ch ng trình h p ng ) là ch ng trình đ c vi tộ ươ ế ằ ợ ữ ươ ợ ữ ươ ượ ế
b ng vi c s d ng các câu l nh trong t p l nh c a h vi đi u khi n v i các mã l nhằ ệ ử ụ ệ ậ ệ ủ ọ ề ể ớ ệ
d i d ng mã g i nh . ướ ạ ợ ớ
Ch ng trình h p ng th ng đ c g i là ch ng trình ngu n hay mã ngu n đ cươ ợ ữ ườ ượ ọ ươ ồ ồ ượ
m t ch ng trình biên d ch (ch ng trình d ch) d ch ra thành ngôn ng máy d i d ngộ ươ ị ươ ị ị ữ ướ ạ
mã nh phân và đ c n p vào b nh ch ng trình c a vi đi u khi n thông qua m tị ượ ạ ộ ớ ươ ủ ề ể ộ
máy n p ch ng trình (Programmer).ạ ươ
Hi n nay có r t nhi u ch ng trình biên d ch cho h vi đi u khi n MCS51 (Keilệ ấ ề ươ ị ọ ề ể
µVision, RCHPSIM….) đã và đang đ c s d ng. Tuy nhiên trong ch ng này s sượ ử ụ ươ ẽ ử
d ng ch ng trình Keil µVision3 đ so n th o và biên d ch ch ng trình h p ng . Keilụ ươ ể ạ ả ị ươ ợ ữ
µVision đ c hình thành và phát tri n t năm 1985, ph n m m biên d ch này h tr choượ ể ừ ầ ề ị ỗ ợ
nhi u dòng vi đi u khi n khác nhau v i hai lo i ngôn ng chính là h p ng và C cho viề ề ể ớ ạ ữ ợ ữ
đi u khi n.ề ể
3.1 C u trúc ch ng h p ngấ ươ ợ ữ
3.1.1 Quy t c đ t tên nhãn, tên ch ng trình, bi n, h ng s :ắ ặ ươ ế ằ ố
•Không đ c trùng v i các t khóa ượ ớ ừ
•Không dài quá 31 ký t , không phân bi t ch hoa hay ch th ngự ệ ữ ữ ườ
•Không t n t i các d u cách trong tên và các ký t đ c bi tồ ạ ấ ự ặ ệ
•Tên th ng b t đ u các ch cái và có tính ch t g i nhườ ắ ầ ữ ấ ợ ớ
•Riêng tên nhãn và tên ch ng trình ph i k t thúc b ng d u “:”ươ ả ế ằ ấ
3.1.2 Khai báo bi n, h ng s :ế ằ ố
Có nhi u cách khai báo bi n và h ng s trong ch ng trình h p ng s d ng Keilề ế ằ ố ươ ợ ữ ử ụ
µVision. Tuy nhiên đ d nh ng i l p trình nên s d ng câu l nh khai báo v i cúể ễ ớ ườ ậ ử ụ ệ ớ
pháp:
Tên Bi nếEQU Giá tr ị; chú thích
Tên H ng sằ ố EQU Giá tr h ngị ằ ; chú thích
VD:
Buffer1 EQU 50h ; Bi n Buffer1 đ c gán giá tr 50Hế ượ ị
Constant_A EQU 10 ; H ng s Constant_A đ c gán 10 (=0AH) ằ ố ượ

3.1.3 Khai báo ch ng trình con:ươ
Cú pháp:
Tên ch ng trình con:ươ
; Bi n (thanh ghi) vào :…………….ế
; Bi n (thanh ghi) ra: ………………ế
; Bi n (thanh ghi) thay đ i: ………..ế ổ
; -------------------------------------------------
Câu lênh 1
Câu l nh 2ệ
…………
Câu l nh nệ
Ret
Ví d :ụ
Add2_1byte_Hex:
; Bi n vào: R0, R1ế
; Bi n ra : Acc ,C flagế
; Thanh ghi thay đ i: Acc, C flagổ
;--------------------------------------------
Mov A, R0
Add A, R1
Ret
3.1.4 C u trúc ch ng trình h p ng :ấ ươ ợ ữ
;===========Tên ch ng trình ============ươ
org 00h
nop
sjmp Tên ch ng trình chínhươ
org 03h ; Ng t Ex0 ắ
nop
reti
org 0bh ; Ng t Timer0ắ
nop
ljmp Tên ct Ph c v ng t / Retiụ ụ ắ
org 13h ; Ng t Ex1 ắ
nop
ljmp Tên ct Ph c v ng t / Retiụ ụ ắ
org 1bh ; Ng t Timer1ắ
nop
ljmp Tên ct Ph c v ng t / Retiụ ụ ắ
org 23h ; Ng t serialắ
nop
reti
;=========Khai báo Bi n H ng s =========ế ằ ố
Bi n equếgiá tr ; chú thíchị
……………………………………
H ng sằ ố equ giá tr ; chú thích ị
………………………………….
;=====================================
Vùng khai báo các Vector ng t và các ch ng trìnhắ ươ
ph c v ng t t ng ngụ ụ ắ ươ ứ
L u ý: ư
•Khi m t ng t nào đó không dùng thì ng iộ ắ ườ
vi t ch ng trình ph i k t thúc b ng l nhế ươ ả ế ằ ệ
RETI (nh ng t EX0 và ng t Serial)ư ắ ắ
•Khi ng t nào đó đ c s d ng thì ng iắ ượ ử ụ ườ
dùng ph i vi t l nh ả ế ệ
Ljmp Tên Ctrình ph c v ng tụ ụ ắ
(Nh ng t Timer0, Ex1, Timer1)ư ắ
;===================================
Vùng khai báo bi n, h ng sế ằ ố

;===================================
; m a i n p r o g r a m
;===================================
org 50h
Tên ch ng trình chính:ươ
L nh 1ệ
…………
lcall Ctr_con1
…………
here:
sjmp here
;==========Ctrình_con =============
Ctr_con1:
Câu l nh 1ệ
………….
Lcall Ctr_con2
…………
ret
;================================
Ctr_con2:
Câu l nh aệ
………….
Câu l nh kệ
…………
ret
;===============================
Ctrinh _ Ph c v ng tụ ụ ắ
;===============================
Tên ct Ph c v ng t1 :ụ ụ ắ
Câu l nh 1ệ
………….
Câu l nh mệ
…………
Lcall Ctr_con2
…………
Reti
;===============================
Tên ct Ph c v ng t2 :ụ ụ ắ
Câu l nh aệ
………….
Câu l nh hệ
…………
Lcall Ctr_con m
…………
reti
;==============================
End
;===================================
;===================================
L nh đ nh đ a ch đ u c a Ctrình chính trong ROM ệ ị ị ỉ ầ ủ
L nh goi Ctrình con1 trong Ctrình chínhệ
T o vòng l p vô t n ạ ặ ậ
;====================================
Vùng vi t các Ctrình con ế
L u ý:ư
Trong 1 Ctrình con có th g i các Ctrình con khác ể ọ
;===================================
Vùng vi t các Ctrình ph c v ng t ế ụ ụ ắ
L u ý:ư
Trong 1 Ctrình ph c v ng t có th g i các Ctrìnhụ ụ ắ ể ọ
con khác
;====================================
Câu l nh k t thúc Ctrìnhệ ế

3.2 Qu n lý b ng s li u, phép tính nhi u byteả ả ố ệ ề
3.2.1 Qu n lý b ng s li uả ả ố ệ
B ng s li u (M ng, s nhi u byte) th ng đ c l u tr trong 1 vùng nh n m trongả ố ệ ả ố ề ườ ượ ư ữ ớ ằ
b nh ch ng trình. Khi thao tác v i m t b ng s li u ng i lâp trình s c n ph i bi tộ ớ ươ ớ ộ ả ố ệ ườ ẽ ầ ả ế
cách khai báo b ng s li u, qua đó xác đ nh đ c đ a ch đ u c a b ng s li u, sả ố ệ ị ượ ị ỉ ầ ủ ả ố ệ ố
l ng byte trong 1 b ng s li u. Đ trên c s đó th c hi n các phép toán trên b ng sượ ả ố ệ ể ơ ở ự ệ ả ố
li u đó ệ
a. Khai báo b ng s li u:ả ố ệ
Cú pháp1 : (theo ki u Byte - DB)ể
Tên b ng: ả
DB Gtr 1, Gtr 2, ……, Gtr Nị ị ị
Chú ý :
•Các giá tr có th các d ng khác nhauị ể ở ạ
(DEC, HEX, BIN,ASCII)
•Có th t n t i nhi u b ng khác nhauể ồ ạ ề ả
trong 1 ch ng trìnhươ
•Các giá tr trên cùng m t dòng, n uị ộ ế
ph i khai báo nhi u thì ph i khai báoả ề ả
nh sau: ưTên b ng:ả
DB Gtr 1ị
DB Gtr 2ị
……………..
DB Gtr Nị
•Cách này ng i l p trình khó bi tườ ậ ế
chính xác đ a ch đ u c a b ng s li uị ỉ ầ ủ ả ố ệ
Cách 2: K t h p v i l nh đ nh đ a ch conế ợ ớ ệ ị ị ỉ
trỏ
Org Đ a ch ị ỉ
Tên b ng: ả
DB Gtr 1, Gtr 2, ……, Gtr Nị ị ị
L u ý:ư
•Ng i l p trình ph i c n th n trongườ ậ ả ẩ ậ
vi c l a ch n đ a ch đ u c a b ng, vìệ ự ọ ị ỉ ầ ủ ả
có th vùng nh này đang đ cể ớ ượ
ch ng trình s d ng . Vì v y thôngươ ử ụ ậ
th ng ườ b ng hay đ c đ t t i vùngả ượ ặ ạ
cu i cùng c a b nh ch ng trìnhố ủ ộ ớ ươ
Cú pháp1:
Ví d 1ụ
Table1:
DB 05, 10, 10H, ‘Abc’, 0F8H, ‘5’
Address_Table1 Gtr (hex)ị
[ Table1 +00] h 05
[ Table1 +01] h 0A
[ Table1 +02] h 10
[ Table1 +03] h 41
[ Table1 +04] h 62
[ Table1 +05] h 63
[ Table1 +06] h F8
[ Table1 +07] h 35
B ng có tên Table1 có 8 byte trong mi nả ề
nh có đ a ch đ u đ c ch ng trình d chớ ị ỉ ầ ượ ươ ị
t đ ng c p phát ự ộ ấ
Ví d 2:ụ
Org 8000h
Table2:
DB 05, 10, 10H, ‘Abc’, 0F8H, ‘5’
Address_Table2 Gtr (hex)ị
[ 8000] h 05
[ 8001] h 0A
[ 8002] h 10
[ 8003] h 41
[ 8004] h 62
[ 8005] h 63
[ 8006] h F8
[ 8007] h 35

Cú pháp2 : (theo ki u Word - DW)ể
Tên b ng: ả
DW Gtr 1, Gtr 2, ……, Gtr Nị ị ị
T ng t nh s d ng theo ki u đ nhươ ự ư ử ụ ể ị
nghĩa theo Byte ch có khác là m i giá trỉ ỗ ị
ph i đ c l u vào 2 byteả ượ ư
Cú pháp2:
Ví d 1ụ
Table3:
DW 05, 10, ‘5’, 0F8AH,
Address_Table3 Gtr (hex)ị
[ Table3 +00] h 00
[ Table3 +01] h 05
[ Table3 +02] h 00
[ Table3 +03] h 0A
[ Table3 +04] h 00
[ Table3 +05] h 35
[ Table3 +06] h 0F
[ Table3 +07] h 8A
B ng có tên Table3 có 8 byte trong mi nả ề
nh có đ a ch đ u đ c ch ng trình d chớ ị ỉ ầ ượ ươ ị
t đ ng c p phát (v i)ự ộ ấ ớ
b. Phép tính nhi u byte:ề
Khi th c hi n các phép tính (c ng tr ,…) ng i l p trình ph i xác đ nh đ c k tự ệ ộ ừ ườ ậ ả ị ượ ế
qu là s m y byte đ có ph ng án xác đ nh vùng nh nào s l u gi k t qu c aả ố ấ ể ươ ị ớ ẽ ư ữ ế ả ủ
phép tính. Các thao tác đ i v i m t b ng s li u th ng là đ c và vi t vào b ngố ớ ộ ả ố ệ ườ ọ ế ả
thông qua con tr ( pointer) v i các l nh :ỏ ớ ệ
N u b ng trong vùng RAM trong c a MCS51 : ế ả ủ
L nh đ c t vùng nh ệ ọ ừ ớ Movx A, @Ri ; (Ri là R0, R1)
L nh vi t vào vùng nh ệ ế ớ Movx @Ri, A ; (Ri là R0, R1)
N u b ng trong vùng RAM ngoài c a MCS51 : ế ả ủ
L nh đ c t vùng nh ệ ọ ừ ớ Movx A, @Dptr
Movx A, @A+Dptr
L nh vi t vào vùng nh ệ ế ớ Movx @Dptr, A
N u b ng trong vùng ROM c a MCS51 : ế ả ủ
L nh đ c t vùng nh ệ ọ ừ ớ Movc A, @A+Dptr
Movx A, @A+PC
Ví d : ụ
Vi t đo n trình chuy n hai m ng d li u 50 byte. Bi t m ng 1 có đ a ch 50h trong Ramế ạ ể ả ữ ệ ế ả ị ỉ
trong và m ng 2 có đ a ch 1234h RAM ngoài.ả ị ỉ ở

