Tải bản đầy đủ (.pdf) (309 trang)

CHƯƠNG 2 LẬP TRÌNH HỢP NGỮ 8051

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.12 MB, 309 trang )


ch"¬ng 2
!"#$%&'(#()"#'*+#, /#
#
01/#23'#$%4'*#, /1#
5%4'*#"(6'#'78#9(:'*#$;#'*(<3'#9=>#9?9#$(;'(#*(<#9(@'(#9A;#, /#B7#$%&'(#C78#9?9(#
DE#FG'*#BH<#9?9#IJ'(#KL'#*<M'#NOP#B7#QRR1#
2.1.1 C¸c thanh ghi.
5%4'*#STU#9?9#$(;'(#*(<#KV)9#FW'*#KX#IV>#9Y$#$(Z'*#$<'#$[\#$(]<^#'(+'*#$(Z'*#$<'#
'78#9_#$(X#I7#\`$#C8$a#F+#I<J>#96'#KV)9#DE#Ib#(4c9#I7#\`$#Kd;#9(e#Kf'#F+#I<J>#96'#
KV)9#'["1#T(6'#IH'#9?9#$(;'(#*(<#9A;#, /#I7#9?9#$(;'(#*(<#,#C<$1#5%4'*#, /#9(e#9_#
\`$#g<X>#F+#I<J>h# 4[<#,#C<$^#,#C<$#9A;#\`$#$(;'(#*(<#KV)9#$%&'(#C78#'(V#D;>h#
#
#
BH<#Ni2#I7#C<$#9_#*<?#$%d#9;4#'(Y$#Rj#9(4#Kf'# i2#I7#C<$#9_#*<?#$%d#$(Y"#'(Y$#R-1#
kNi2#l#N4D$#i<*m<9;'#C<$#B7# i2#l# a;%$#i<*'<m<9;'$#2<$n1#PH<#\`$#g<X>#F+#I<J>#,#C<$#
$(&#CY$#go#F+#I<J>#'74#IH'#(L'#,#C<$#Kp>#"(M<#KV)9#9(<;#$(7'(#9?9#g(:9#,#C<$#$%VH9#g(<#
KV)9#qE#Ib1#P&#9_#\`$#Dr#IV)'*#IH'#9?9#$(;'(#*(<#$%4'*#, /#$;#Ds#$!"#$%>'*#B74#\`$#
Dr#$(;'(#*(<#9Z'*#FG'*#9(>'*#Kc9#C<J$#$%4'*#9?9#9(VL'*#gf#$<f"1#tu8#$(;\#g(M4#"(G#
IG9#Q""a'F<q#Q1v#KX#C<f$#K68#KA#Bp#9?9#$(;'(#*(<#9A;#, /1#
H×nh 2.1:#;n#N`$#Dr#$(;'(#*(<#,#C<$#9A;#, /#
Cn#N`$#Dr#$(;'(#*(<#/w#C<$#9A;#, /#
S?9#$(;'(#*(<#KV)9#DE#FG'*#%`'*#%u<#'(Y$#9A;#, /#I7#Q#k$(;'(#*(<#$@9(#I>xn^#2^#y-#l#
yj^#RT5y#k94'#$%z#F+#I<J>n#B7#TS#kC`#Kf\#9(VL'*#$%&'(n1#5Y$#9M#9?9#F+#I<J>#$%3'#Kp>#
I7#$(;'(#*#(<#,#C<$#$%{#RT5y#B7#TS#I7#/w#C<$1#5(;'(#*(<#$@9(#I>x#Q#KV)9#DE#FG'*#9(4#
$Y$#9M#\|<#"(}"#$4?'#Dr#(|9#B7#IZl*@91#~X#(<X>#DE#FG'*#9?9#$(;'(#*(<#'78#$;#Ds#*<H<#
$(<J>#9(:'*#$%4'*#9?9#B@#FG#BH<#9?9#IJ'(#KL'#*<M'#I7#QRR#B7#NOP1#
2.1.2 LÖnh chuyÓn MOV.
•_<#\`$#9?9(#KL'#*<M'^#IJ'(#NOP#D;4#9(}"#F+#I<J>#${#\`$#Bd#$%@#'78#Kf'#\`$#B@#$%@#
g(?91#•_#9_#9:#"(?"#'(V#D;>h#
NOP## ;#~@9(^#'*>å';#D;4#9(}"#'*>å'#B74#K@9(#


D7

D6

D5

D4

D3

D2

D1

D0

A

B

R0

R1

R2

R3

R4


R5

R6

R7

DPH

PC (program counter)

DPL

DPTR

PC

J'(#'78#'_<#STU#9(>8X'#k$%4'*#$(ự9#$f#I7#D;4#9(}"n#$4?'#(['*#'*>ồ'#B74#$4?'#(['*#
K@9(1#P@#FG#IJ'(#NOP#Q^#y-#D;4#9(}"#'`<#F>'*#$(;'(#*(<#y-#B74#$(;'(#*(<#Q1#
i;>#g(<#I3'(#'78#KV)9#$(ự9#(<J'#$(&#$(;'(#*(<#Q#Ds#9_#*<?#$%d#*<r'*#'(V#$(;'(#*(<#y-1#
J'(#NOP#g(Z'*#$?9#K`'*#$4?'#(['*#'*>ồ'1#~4['#9(VL'*#$%&'(#FVH<#Kâ8#K6>#$<3'#
I7#'["#$(;'(#*(<#Q#$H<#*<?#$%d# t#9I7#*<?#$%d# #ở#F['*#Dr#taqn#B7#D;>#K_#9(>8X'#*<?#
$%d#'78#q>;#9?9#$(;'(#*(<#g(?9#'(;>#C3'#$%4'*#STU1## V>#b#%ằ'*#FY>###$%4'*#IJ'(#
C?4#%ằ'*#K_#I7#\`$#*<?#$%d1#56\#q>;'#$%|'*#9A;#'_#Ds#KV)9#$%&'(#C78#'*;8#D;>#B@#FG#
'781#
MOV A, #55H; ; Nạp trí trị 55H vào thanh ghi A (A = 55H)
MOV R0, A ; Sao chép nội dung A vào R0 (bây giờ R0=A)
MOV R1, A ; Sao chép nội dung A và R1 (bây giờ R1=R0=A)
MOV R2, A ; Sao chép nội dung A và R2 (bây giờ R2=R1=R0=A)
MOV R3, #95H ; Nạp giá trị 95H vào thanh ghi R3 (R3 = 95H)
MOV A, R3 ; Sáo chép nội dung R3 vào A (bây giờ A = 95H)

#
K(<#I!"#$%&'(#C`#B<#K<p>#g(<X'#, /#96'#IV>#b#9?9#K<X\#D;>h#
/1#S?9#*<?#$%d#9_#$(X#KV)9#'["#B74#$%ự9#$<f"#CY$#go#$(;'(#*(<#'74#Q^#2^#y-#l#yj1#5>8#
'(<3'^#KX#$(Z'*#C?4#K_#I7#*<?#$%d#$=9#$(]<#$(&#"(M<#Kc$#$%VH9#'_#\`$#gb#(<J>###'(V#
9(e#%;#FVH<#Kâ81#
#
MOV A, #23H ; Nạp giá trị 23H vào A (A = 23H)
MOV R0, #12H ; Nạp giá trị 12H vào R0 (R0 = 2BH)
MOV R1, #1FH ; Nạp giá trị 1FH vào R1 (R1 = 1FH)
MOV R2, #2BH ; Nạp giá trị 2BH vào R2 (R2 = 2BH)
MOV B, # 3CH ; Nạp giá trị 3CH vào B (B = 3CH)
MOV R7, #9DH ; Nạp giá trị 9DH vào R7 (R7 = 9DH)
MOV R5, #0F9H ; Nạp giá trị F9H vào R5 (R5 = F9H)
MOV R6, #12 ;Nạp giá trị thập phân 12 = 0CH vào R6
(trong R6 có giá trị 0CH).
#
~X#b#$%4'*#IJ'(#NOP#y.^##-F9t#$(&#"(M<#9_#Dr#-#K='*#$%VH9#F#B7#D;>#FY>###C?4#
%ằ'*#F#I7#\`$#Dr#taq#9(=#g(Z'*#"(M<#I7#\`$#gb#$ự1#t;8#'_<#9?9(#g(?9#NOP#y.^#
#F9t#Ds#*â8#%;#Iỗ<1#
01#f>#9?9#*<?#$%d#-#Kf'#F#KV)9#9(>8X'#B74#\`$#$(;'(#*(<#,#C<$#$(&#9?9#C<$#9ò'#I[<#KV)9#
94<#I7#$Y$#9M#9?9#Dr#-1#P@#FG^#$%4'*#IJ'(#NOP#Q^#.#gf$#q>M#I7#Q=-1.^#K_#I7#Q#=#
#-/-/#ở#F['*#'(d#"(â'1#
v1#P<J9#9(>8X'#\`$#*<?#$%d#IH'#(L'#g(M#'ă'*#9(=;#9A;#$(;'(#*(<#Ds#*â8#%;#Iỗ<#B@#FGh#
#
MOV A, #7F2H ; Không hợp lệ vì 7F2H > FFH
MOV R2, 456 ; Không hợp lệ vì 456 > 255 (FFH)
#
41#~X#'["#\`$#*<?#$%d#B74#\`$#$(;'(#*(<#$(&#"(M<#*?'#FY>###$%VH9#*<?#$%d#K_1#f>#
g(Z'*#9_#FY>#$(&#'_#(<X>#%ằ'*#'["#${#\`$#Bd#$%@#'(H1#P@#FG##NOP#Q^#/jt#9_#'*(ĩ;#
I7#'["#*<?#$%d#$%4'*#'*ă'#'(H#9_#*<?#$%d#/jt#B74#$(;'(#*(<#Q#B7#$[<#Kd;#9(e#K_#F+#I<J>#

9_#$(X#9_#CY$#go#*<?#$%d#'74#${#-#Kf'#FFt1#Sò'#KX#'["#*<?#$%d##I7#/jt#B74#$(;'(#*(<#Q#
$(&#96'#"(M<#9_#FY>###$%VH9#/jt#'(V#$(f#'781#NOP#Q^##/jt1#S6'#IV>#b#%ằ'*#
'f>#$(<f>#FY>###$%VH9#\`$#$(&#Ds#g(Z'*#*â8#Iỗ<#B&#()"#'*+#9(4#K_#I7#\`$#IJ'(#()"#
IJ1#5>8#'(<3'^#gf$#q>M#Ds#g(Z'*#K:'*#'(V#b#\>r'#9A;#'*V]<#I!"#$%&'(1#~# â8#Ds#I7#
\`$#Iỗ<#$(V]'*##(;8#*c"#Kr<#BH<#I!"#$%&'(#B<3'#\H<1#
2.1.3 Lệnh cộng ADD.
J'(#9`'*#QRR#9_#9?9#"(}"#'(V#D;>h#
QRR#;^#'*>ồ'## ;#S`'*#$4?'#(['*#'*>ồ'#B74#$(;'(#*(<#Q1#
J'(#9`'*#QRR#'_<#STU#9`'*#C8$a#'*>ồ'#B74#$(;'(#*(<#Q#B7#Kc$#gf$#q>M#$(;'(#*(<#
Q1#~X#9`'*#(;<#Dr#'(V#0.t#B7#v4t#$(&#\ỗ<#Dr#9_#$(X#9(>8X'#Kf'#\`$#$(;'(#*(<#B7#
D;>#K_#9`'*#I[<#BH<#'(;>#'(Vh#
MOV A, #25H ; Nạp giá trị 25H vào A
MOV R2, #34H ; Nạp giá trị 34H vào R2
ADD A, R2 ; Cộng R2 vào A và kết quả A = A + R2
#
5(ự9#(<J'#9(VL'*#$%&'(#$%3'#$;#KV)9#Q#=#.9t#kB&#0.t#+#v4t#=#.9tn#B7#y0#=##v4t^#
9(:#b#I7#'`<#FG'*#y0#g(Z'*#$(;8#Kổ<1#S(VL'*#$%&'(#$%3'#9_#$(X#B<f$#$(a4#'(<p>#9?9(#
"(G#$(>`9#B74#$(;'(#*(<#KV)9#DE#FG'*1#N`$#$%4'*#9?9(#B<f$#g(?9#9_#$(X#I7h#
MOV R5, #25H ; Nạp giá trị 25H vào thanh ghi R5
MOV R7, #34H ; Nạp giá trị 34H vào thanh ghi R7
MOV A, #0 ; Xoá thanh ghi A (A = 0)
ADD A, R5 ; Cộng nội dung R5 vào A (A = A + R5)
ADD A, R7 ; Cộng nội dung R7 vào A (A = A + R7 = 25H + 34H)
#
S(VL'*#$%&'(#$%3'#9_#gf$#q>M#$%4'*#Q# 7#.9t^#9_#%Y$#'(<p>#9?9(#KX#B<f$#9(VL'*#$%&'(#
*<r'*#'(V#B!81#N`$#9â>#(z<#9_#$(X#Kc$#%;#D;>#g(<#qa\#K4['#9(VL'*#$%&'(#$%3'#I7#I<J>#
9_#9ẩ'#9(>8X'#9M#(;<#F+#I<J>#B74#9?9#$(;'(#*(<#$%VH9#g(<#9`'*#9(:'*#BH<#'(;>#
g(Z'*?#Sâ>#$%M#I]<#I7#g(Z'*#96'1#tu8#qa\#K4['#9(VL'*#$%&'(#FVH<#Kâ8h#
MOV A, #25H ; Nạp giá trị thứ nhất vào thanh ghi A (A = 25H)
ADD A, #34H ; Cộng giá trị thứ hai là 34H vào A (A = 59H)

#
5%4'*#$%V]'*#()"#$%3'#Kâ8^#g(<#$(;'(#*(<#Q#Ku#9(=;#Dr#$(=#'(Y$#$(&#*<?#$%d#$(=#(;<#K<#
$(a4#\`$#$4?'#(['*1#~â8#KV)9#*|<#I7#$4?'#(['*#$=9#$(]<#k$%ự9#$<f"n1#
S?9#B@#FG#$%VH9#9(4#Kf'#*<]#$(&#IJ'(#QRR#C?4#%ằ'*#$4?'#(['*#'*>ồ'#9_#$(X#(4c9#I7#
\`$#$(;'(#*(<#(4c9#I7#\`$#F+#I<J>#$%ự9#$<f"#k$=9#$(]<n#'(V'*#$(;'(#*(<#K@9(#I>Z'#I7#
$(;'(#*(<#Q^#$(;'(#*(<#$@9(#I>x1#t;8#'_<#9?9(#g(?9#I7#\`$#IJ'(#'(V# QRR#y0^#
#/0t#I7#IJ'(#g(Z'*#()"#IJ#B&#\|<#"(}"#$4?'#Dr#(|9#"(M<#96'#Kf'#$(;'(#*(<#Q#B7#
IJ'(#QRR#y4^#Q#9ũ'*#g(Z'*#()"#IJ#B&#Q#I>Z'#I7#$(;'(#*(<#K@9(#9(4#\|<#"(}"#Dr#
(|91#_<#\`$#9?9(#KL'#*<M'#I7#$%4'*#, /#$(&#\|<#"(}"#$4?'#Dr#(|9#Kp>#96'#Kf'#
$(;'(#Q#BH<#B;<#$%ò#I7#$4?'#(['*#K@9(1#T(6'#$%&'(#C78#$%3'#Kâ8#*<M<#$(@9(#Ib#F4#B&#D;4#
$(;'(#*(<#Q#'(V#I7#$(;'(#$(<#$@9(#I>x1#S:#"(?"#9?9#IJ'(#()"#'*+#\Z#$M#9?9(#DE#FG'*#
9(:'*#B7#I<J$#g3#9?9#g<X>#$4?'#(['*#()"#IJ#KV)9#9(4#$%4'*#"(G#IG9#Q""a'F<q#Q1/1#
S_#(;<#$(;'(#*(<#/w#C<$#$%4'*#, /#I7#C`#Kf\#9(VL'*#$%&'(#TS#B7#94'#$%z#F+#I<J>#
QT5y1#56\#q>;'#$%|'*#B7#9?9(#DE#FG'*#9(:'*#KV)9#$%&'(#C78#ở#\G9#01v1#5(;'(#*(<#
RT5y#KV)9#DE#FG'*#KX#$%>8#9!"#F+#I<J>#B7#KV)9#I7\#gx#ở#9(VL'*#.#g(<#'_<#Bp#9?9#
9(f#K`#K?'(#Kd;#9(e1#
010# G<H<#$(<J>#Bp#I!"#$%&'(#()"#'*+#, /1#
5%4'*#"(6'#'78#9(:'*#$;#C7'#Bp#F['*#$(=9#9A;#()"#'*+#B7#Kd'(#'*(ĩ;#\`$#Dr#$(>!$#
'*+#DE#FG'*#%`'*#%u<#*ắ'#I<p'#BH<#I!"#$%&'(#()"#'*+1#
STU#9(e#9_#$(X#I7\#B<J9#BH<#9?9#Dr#'(d#"(â'#B7#9_#$(X#9([8#BH<#$r9#K`#%Y$#9;41#5>8#
'(<3'^#$(!$#I7#'*?'#'*!\#B7#9(!\#9(["#Kr<#BH<#94'#'*V]<#"(M<#I7\#B<J9#BH<#9?9#Dr#-#
B7#/#KX#I!"#$%&'(#9(4#\?8#$@'(1#N`$#9(VL'*#$%&'(#9(=;#9?9#Dr#-#B7#/#KV)9#*|<#I7#'*Z'#
'*+#\?81#
5%4'*#'(+'*#'*78#K6>#9A;#\?8#$@'(^#9?9#I!"#$%&'(#B<3'#"(M<#B<f$#\u#9(VL'*#$%&'(#
FVH<#F['*#'*Z'#'*+#\?81#Nc9#FG#(J#$(r'*#$(!"#IG9#"(â'#kDr#taqn#Ku#KV)9#DE#FG'*#
'(V#\`$#9?9(#(<J>#q>M#(L'#KX#C<X>#F<ễ'#9?9#Dr#'(d#"(â'#$(&#q>?#$%&'(#I7\#B<J9#BH<#
\u#\?8#Bẫ'#9ò'#I7#9Z'*#B<J9#9ồ'*#gp'(#Kr<#BH<#94'#'*V]<1#S>r<#9W'*^#9?9#'*>ồ'#
'*+#()"#'*+#Ku#KV)9#"(?$^#Ku#9>'*#9Y"#9?9#${#*)<#'(H#9(4#9?9#IJ'(#\u#\?8#9`'*#BH<#
'(+'*#Kc9#$@'(#g(?9#*<:"#9(4#B<J9#I!"#$%&'(#'(;'(#(L'#B7#@$#\ắ9#Iỗ<#(L'1#5(>!$#'*+#
${#*)<#'(H#k\'a\4'<9n#$(V]'*#q>83'#DE#FG'*#$%4'*#$7<#I<J>#g(4;#(|9#B7#gx#$(>!$#

\?8#$@'(#KX#$(;\#9(<f>#9(4#9?9#\u#B7#${#%:$#*|'#$VL'*#Kr<#Fễ#'(H^#9?9#9(VL'*#$%&'(#
()"#'*+#"(M<#KV)9#Fd9(#%;#$(;'(#\u#\?8#Cằ'*#\`$#9(VL'*#$%&'(#KV)9#I7#$%&'(#()"#
'*+#k()"#Fd9(n1#t)"#'*+#KV)9#94<#'(V#I7#\`$#'*Z'*#'*+#C!9#$(Y"#B&#'_#*<;4#$<f"#$%ự9#
$<f"#BH<#9Y>#$%:9#C3'#$%4'*#9A;#STU1#~X#I!"#$%&'(#$%4'*#()"#'*+^#I!"#$%&'(#B<3'#"(M<#
C<f$#$Y$#9M#9?9#$(;'(#*(<#9A;#STU#B7#g@9(#$(VH9#9A;#9(:'*#9ũ'*#'(V#9?9#9(<#$<f$#
g(?91#
*78#';8^#$;#9_#$(X#DE#FG'*#'(<p>#'*Z'#'*+#I!"#$%&'(#g(?9#'(;>^#9(ẳ'*#(['#'(V#
2;D<9^#T;D9;I^#S^#S
++
^#J;B;#B7#BZ#Dr#'*Z'#'*+#g(?91#S?9#'*Z'#'*+#'78#KV)9#94<#I7#
'(V'*#'*Z'#'*+#C!9#9;4#B&#I!"#$%&'(#B<3'#g(Z'*#96'#"(M<#$VL'*#$?9#BH<#9?9#9(<#$<f$#
C3'#$%4'*#9A;#STU1#N`$#$%&'(#()"#Fd9(#KV)9#FW'*#KX#Fd9(#9(VL'*#$%&'(#()"#'*+#%;#
\u#\?8#9ò'#k9ò'#KZ<#g(<#9ũ'*#9ò'#KV)9#*|<#\7#Kr<#$V)'*#kOCja9$#S4Fan#(;8#\u#
IJ'(#O"94Fan^#9ò'#9?9#'*Z'#'*+#C!9#9;4#KV)9#Fd9(#$(7'(#9?9#'*Z'#'*+#\u#\?8#
Cằ'*#\`$#9(VL'*#$%&'(#*|<#I7#$%&'(#C<3'#Fd9(1#P@#FG^#KX#B<f$#\`$#9(VL'*#$%&'(#$%4'*#S#
$;#"(M<#DE#FG'*#\`$#$%&'(#C<3'#Fd9(#S#KX#Fd9(#9(VL'*#$%&'(#Bp#F['*#\u#\?81#2â8#*<]#
$;#q}$#F['*#$(=9#()"#'*+#9A;#, /#B7#DE#FG'*#$%&'(#()"#Fd9(#KX#$[4#%;#\`$#9(VL'*#
$%&'(#Dẵ'#D7'*#9([8#'*;8#KV)91#
2.2.1 Cấu trúc của hợp ngữ.
N`$#9(VL'*#$%&'(#()"#'*+#C;4#*ồ\#\`$#9(>ỗ<##9?9#Fò'*#IJ'(#()"#'*+1#N`$#IJ'(#()"#
'*+#9_#9(=;#\`$#${#*)<#'(H#k\'a\4'<9n#B7#$>8#$(a4#${'*#IJ'(#B7#D;>#'_#9_#\`$#(4c9#
(;<#$4?'#(['*1#S?9#$4?'#(['*#I7#9?9#F+#I<J>#96'#KV)9#$(;4#$?9#B7#9?9#${#*)<#'(H#I7#9?9#
IJ'(#Kr<#BH<#STU#'_<#'_#I7\#*&#BH<#9?9#F+#I<J>1#
ORG 0H ; Bắt đầu (origin) tại ngăn nhớ 0
MOV R5, #25H ; Nạp 25H vào R5
MOV R7, #34H ; Nạp 34H vào R7
MOV A, #0 ; Nạp 0 vào thanh ghi A
ADD A, R5 ; Cộng nôi dụng R5 vào A (A = A + R5)
ADD A, R7 ; Cộng nội dung R7 vào A (A = A + R7)
ADD A, #121H ; Cộng giá trị 12H vào A (A = A + 12H)

HERE: SJMP HERE ; ở lại trong vòng lặp này
END ; Kết thúc tệp nguồn hợp ngữ
#
S(VL'*#$%&'(#01/h#P@#FG#\ẫ>#Bp#\`$#9(VL'*#$%&'(#()"#'*+1#
S(VL'*#$%&'(#01/#9(4#$%3'#Kâ8#I7#\`$#9(>ỗ<#9?9#9â>#IJ'(#(4c9#9?9#Fò'*#IJ'(#KV)9#
B<f$#(4c9#Cằ'*#9?9#IJ'(#()"#'*+#'(V#QRR#B7#NOP#(4c9#Cằ'*#9?9#9â>#IJ'(#KV)9#*|<#
I7#9?9#9(e#Fẫ'1#5%4'*#g(<#9?9#IJ'(#()"#'*+#$(&#'_<#STU#"(M<#I7\#*&#$(&#9?9#9(e#IJ'(#
k(;8#9ß'#*|<#I7#*<M#IJ'(n#$(&#KV;#%;#9?9#9(e#IJ'(#9(4#()"#'*+1#P@#FG^#$%4'*#9(VL'*#
$%&'(#01/#$(&#9?9#IJ'(#QRR#B7#NOP#I7#9?9#IJ'(#Kf'#STU^#9ß'#OyG#B7#E•R#I7#9?9#
9(e#IJ'(#Kr<#BH<#()"#'*+1#OyG#'_<#()"#'*+#Kc$#\u#IJ'(#$[<#'*¨'#'(H#-#B7#E•R#$(&#
C?4#9(4#()"#'*+#C<f$#gf$#$(:9#\u#'*>å'1#t;8#'_<#9?9(#g(?9#\`$#9(e#IJ'(#KX#C¾$#K6>#
B7#9(e#IJ'(#$(=#(;<#KX#gf$#$(:9#9(VL'*#$%&'(1#
SY>#$%:9#9A;#\`$#IJ'(#()"#'*+#9_#4#$%V]'*#'(V#D;>h#
['(u'h]### [${#*)<#'(H]# [9?9#$4?'#(['*]# [;#9(:#*<M<]#
S?9#$%V]'*#$%4'*#FY>#'*4c9#B>Z'*#I7#$>o#9(|'#B7#g(Z'*#"(M<#Fß'*#IJ'(#'74#9ò'*#9_#
9(:'*1#S?9#FY>#'*4c9#B>Z'*#g(Z'*#KV)9#B<f$#B741#PH<#F['*#$(=9#$%3'#K©8#96'#IV>#b#
9?9#K<X\#D;>h#
/1#5%V]'*#'(u'#9(4#"(}"#9(VL'*#$%&'(#$(;\#9(<f>#Kf'#\`$#Fß'*#IJ'(#C»'*#$3'1#•_#
g(Z'*#KV)9#B<f$#q>?#\`$#Dr#gb#$ù#'(Y$#Kd'(1#tu8#g<X\#$%;#q>8#Kd'(#'78#9A;#()"#'*+#
\7#$;#DE#FG'*1#
01#5{#*)<#'(H#kIJ'(n#B7#9?9#$4?'#(['*#I7#9?9#$%V]'*#gf$#()"#BH<#'(;>#$(ù9#$(<#9Z'*#B<J9#
$(ù9#$f#9A;#9(VL'*#$%&'(#B7#(47'#$(<J'#9?9#'(<J\#BG#\7#9(VL'*#$%&'(#KV)9#B<f$#9(4#
9(:'*1#5%4'*#()"#'*+#9?9#9©>#IJ'(#'(Vh#
#
“ ADD A, B”
“MOV A, #67H”
#
$(&#QRR#B7#NOP#I7#'(+'*#${#*)<#'(H#$[4#%;#\u#IJ'(^#9ß'#“Q^#2”#B7#“Q^#
#wjt”#I7#'(+'*#$4?'#(['*#$(&#(;<#$%V]'*#9_#$(X#9(=;#9?9#IJ'(#*<M#(4c9#9(e#
IJ'(#9A;#()"#'*+1#tu8#'(H#%»'*#9?9#9(e#IJ'(#g(Z'*#$[4#%;#\u#IJ'(#'74#k\u#

\?8n#B7#9(:'*#9(e#FW'*#Cë<#()"#'*+^#'*V)9#I[<#Kr<#BH<#9?9#IJ'(#I7#9(:'*#
KV)9#Fd9(#%;#\u#\?8#k\u#I3'(n#9(4#STU#$(ù9#(<J'1#5%4'*#9(VL'*#$%&'(#01/#
9?9#IJ'(#OyG#B7# E•R#I7#9?9#9(e#IJ'(#k\`$#Dr#()"#'*+#9A;#, /#DE#FG'*#
F['*#1OyG#B7#1E•Rn1#tu8#K|9#q>8#Kd'(#9G#$(X#9A;#()"#'*+#$;#DE#FG'*1#
v1#S(VL'*#9(:#*<M<#I>Z'#"(M<#C¾$#K6>#C»'*#FY>#9(Y\#"(È8#k;n1#S?9#9(:#*<M<#9_#$(X#C¾$#
K6>#ë#K6>#Fß'*#(4c9#*<+;#Fß'*1#t)"#'*+#
Cz#q>;#kI7\#'*Ln#9?9#9(:#*<M<#'(V'*#9(:'*#
I[<#%Y$#96'#$(<f$#Kr<#BH<#I!"#$%&'(#B<3'1#Nc9#
FW#9?9#9(:#*<M<#I7#$>o#9(|'^#g(Z'*#C¾$#C>`9#
'(V'*#$;#'3'#FW'*#9(:'*#KX#\Z#$M#9(VL'*#
$%&'(#KX#*<:"#9(4#'*V]<#g(?9#K|9#B7#(<X>#
9(VL'*#$%&'(#FÔ#F7'*#(L'1#
41# V>#b#Kf'#'(u'#tEyE#$%4'*#$%V]'*#'(u'#
9A;#9(VL'*#$%&'(#01/1#N`$#'(u'#CY$#go#
$(;\#9(<f>#Kf'#\`$#IJ'(#"(M<#9_#FY>#(;<#
9(Y\#khn#K='*#ë#D;>1#5%4'*#9©>#IJ'(#'(M8#
'*¾'#iJNT#$(&#, /#KV)9#%;#IJ'(#ë#I[<#
$%4'*#Bß'*#Ic"#'78#BZ#(['1#•f>#(J#$(r'*#
9A;#9(:'*#$;#9_#\`$#9(VL'*#$%&'(#*<?\#D?$#
$(&#$;g(Z'*#96'#Fß'*#IJ'(#'78#B7#'_#9_#$(X#
KV)9#q4?#K<#%;#g(z<#9(VL'*#$%&'(1#
01v#t)"#Fd9(#B7#9([8#\`$#9(VL'*#
$%&'(#, /1#
•(V#B!8#9Y>#$%:9#9A;#\`$#9(VL'*#$%&'(#()"#
'*+#$;#Ku#KV)9#C<f$^#9©>#(z<#Kc$#%;#I7#9(VL'*#
EDITOR

PRAGRAM

ASSEMBLE

R

PRAGRAM

LINKER

PRAGRAM

OH

PRAGRAM

myfile.asm

myfile.lst

myfile.obj

other obj file

myfile.abs

myfile.hex

$%&'(#Ds#KV)9#$[4#%;#B7#()"#Fd9(#'(V#$(f#'74#B7#I7\#$(f#'74#KX#9_#$(X#9([8#KV)9?#S?9#
CVH9#KX#$[4#%;#\`$#9(VL'*#$%&'(#()"#'*+#9_#$(X#9([8#KV)9#I7h#
/1#5%VH9#(f$#$;#DE#FG'*#\`#$%&'(#D4['#$(M4#KX#*ỡ#B74#\`$#9(VL'*#$%&'(#*<r'*#'(V#
9(VL'*#$%&'(#01/1#S_#'(<p>#$%&'(#D4['#$(M4#$>8J$#B]<#(4c9#9?9#C`#DE#Ib#${#KV)9#DE#
FG'*#KX#$[4#%;#B7/#(4c9#KX#D4['#$(M4#9(VL'*#$%&'(1#N`$#$%&'(#D4['#$(M4#KV)9#DE#FG'*#
%`'*#%u<#I7#$%&'(#D4['#$(M4#ERI5#9A;#NilROi#k(4c9#4$a%;F#9A;#W<'F4wDn#Kp>#

9([8#$%3'#(J#K<p>#(7'(#N<9%4D4m$1# V>#b#%ằ'*^#$%&'(#D4['#$(M4#"(M<#9_#g(M#'ă'*#$[4#
%;#$J"#\u#QiSII1#~r<#BH<#'(<p>#$%&'(#()"#'*+#$(&#9?9#$3'#$J"#$>â'#$(a4#9?9#q>8#VH9#
$(V]'*#IJ#9A#ROi^#'(V'*#"(6'#\ở#%`'*#9A;#9?9#$J"#'*>ồ'#"(M<#I7#;D\#(;8#D%9#
$>o#$(a4#$%&'(#()"#'*+#\7#$;#DE#FG'*1#
01#5J"#'*>ồ'#9_#"(6'#\ở#%`'*#;D\#9(=;#\u#9(VL'*#$%&'(#KV)9#$[4#%;#ở#CVH9#/#KV)9#
'["#B74#$%&'(#()"#Fd9(#9A;#, /1#5%&'(#()"#Fd9(#9(>8X'#9?9#IJ'(#%;#\u#\?81#5%&'(#
()"#Fd9(#Ds#$[4#%;#\`$#$J"#Kr<#$V)'*#B7#\`$#$J"#I<J$#g3#BH<#9?9#$(7'(#"(6'#\ở#%`'*#
4Cj#B7#ID$#$VL'*#='*1#
v1#S?9#$%&'(#()"#Fd9(#83>#96>#\`$#CVH9#$(=#C;#*|<#I7#I<3'#gf$1#S(VL'*#$%&'(#I<3'#gf$#IY8#
\`$#(4c9#'(<p>#$J"#Kr<#$V)'*#B7#$[4#%;#\`$#$J"#Kr<#$V)'*#$>8J$#Kr<#BH<#$(7'(#"(6'#
\ở#%`'*#;CD1#5J"#;CD#'78#KV)9#DE#FG'*#Cở<#$(W'*#9(=;#9A;#, /#9_#\`$#
9(VL'*#$%&'(#*<?\#D?$1#
41# Kf#D;>#K_#$J"#;CD#KV)9#'["#B74#\`$#9(VL'*#$%&'(#KV)9#*|<#I7#-t#k9(>8X'#Kr<#
$V)'*#4Cja9$#Bp#F['*#Dr#taqn#KX#$[4#%;#\`$#$J"#BH<#K>Z<#\ở#%`'*#taq#9_#$(X#'["#
$r$#B74#$%4'*#yON1#S(VL'*#$%&'(#'78#9_#$%4'*#$Y$#9M#\|<#$%&'(#()"#'*+#9A;#, /#
9?9#$%&'(#()"#'*+#Fự;#$%3'#W<'F4wD#(<J'#';8#gf$#()"#9?9#CVH9#0#Kf'#4#B74#$(7'(#
\`$#CVH91#
Hình 2.2:#S?9#CVH9#KX#$[4#%;#\`$#9(VL'*#$%&'(1#
2.3.1 Nói thêm về các tệp .asm và .object.
5J"#1;D\#9ũ'*#KV)9##*|<#I7#$J"#'*>ồ'#B7#9(@'(#B&#Ib#F4#'78#\7#\`$#Dr#$%&'(#()"#
'*+#Kò<#(z<#$J"#'78#"(M<#9_#\`$#"(6'#\ở#%`'*#D%9#${#9(+#D4>%9a#I7#'*>ồ'1#tu8#
g<X\#$%;#()"#'*+#, /#\7#$;#DE#FG'*#qa\#'_#9_#Kò<#(z<#'(V#B!8#g(Z'*?#(V#$;#'_<#
$%VH9#Kâ8#$J"#'78#KV)9#$[4#%;#'(]#\`$#$%&'(#C<3'#$!"#9(ẳ'*#(['#'(V#EF<$#9A;#ROi#
(4c9#4$a";F#9A;#W<'F4wD1#t)"#'*+#9A;#, /#9(>8X'#Kổ<#9?9#$J"#()"#'*+#$%4'*#
$J"#1;D\#$(7'(#'*Z'#'*+#\u#\?8#B7#9>'*#9Y"#$J"#Kr<#$V)'*#14Cja9$1#*47<#B<J9#$[4#%;#
$J"#Kr<#$V)'*#$%&'(#()"#'*+#9ũ'*#9(4#%;#$J"#I<J$#g3#ID$#k <D$#m<Ian1#
2.3.2 Tệp liệt kê .lst.
5J"#I<J$#g3#I7#\`$#$>o#9(|'^#'_#%Y$#(+>#@9(#9(4#I!"#$%&'(#B<3'#B&#'_#I<J$#g3#$Y$#9M#\|<#
\u#IJ'(#B7#Kd;#9(e#9ũ'*#'(V#$Y$#9M#9?9#Iỗ<#\7#$%&'(#()"#'*+#"(?$#(<J'#%;1#(<p>#$%&'(#
()"#'*+#*<M#$(<f$#%ằ'*^#$J"#I<J$#g3#I7#g(Z'*#96'#$(<f$#$%{#g(<#$;#C?4#%ằ'*#$;#\>r'#$[4#

%;#'_1#5J"#'78#9_#$(X#KV)9#$%>8#9!"#Cằ'*#\`$#$%&'(#C<3'#Fd9(#'(V#EF<$#9A;#ROi#(4c9#
4$a";F#9A;#W<'F4w#B7#KV)9#(<X'#$(d#$%3'#\7'#(&'(#(4c9#KV)9#*E<#%;#\?8#<'1# !"#
$%&'(#B<3'#DE#FG'*#$J"#I<J$#g3#KX#$&\#9?9#Iỗ<#9:#"(?"1#S(e#D;>#g(<#Ku#DE;#(f$#9?9#Iỗ<#
KV)9#K?'(#FY>#$%4'*#$J"#I<J$#g3#$(&#$J"#Kr<#$V)'*#\H<#Dẵ'#D7'*#I7\#K6>#B74#9(4#
9(VL'*#$%&'(#I<3'#gf$1#
1 0000 ORG 0H ; Bắt đầu ở địa chỉ 0
2 0000 7D25 MOV R5, #25H ; Nạp giá trị 25H vào R5
3 0002 7F34 MOV R7, #34H ; Nạp giá trị 34H vào R7
4 0004 7400 MOV A, #0 ; Nạp 0 vào A (xoá A)
5 0006 2D ADD A, R5 ; Cộng nội dung R5 vào A (A = A + R5)
6 0007 2F ADD A, R7 ; Cộng nội dung R7 vào A (A = A + R7)
7 0008 2412 ADD A, #12H ; Cộng giá trị 12H vào A (A = A + 12H)
8 00A BCEF HERE: SJMP HERE ; ở lại vòng lặp này
9 000C END ; Kết thúc tệp .asm
#
S(VL'*#$%&'(#010h#5J"#I<J$#g31#
014#2`#Kf\#9(VL'*#$%&'(#B7#g(Z'*#*<;'#yON#$%4'*#, /1#
2.4.1 Bộ đếm ch ơng trình trong 8051.
N`$#$(;'(#*(<#q>;'#$%|'*#g(?9#$%4'*#, /#I7#C`#Kf\#9(VL'*#$%&'(#1#2`#Kf\#9(VL'*#
$%&'(#9(e#Kf\#Kd;#9(e#9A;#IJ'(#gf#$<f"#96'#KV)9#$(ự9#(<J'1#K(<#STU#'["#\u#IJ'(#${#
C`#'(H#yON#9(VL'*#$%&'(#$(&#C`#Kf\#9(VL'*#$%&'(#$ă'*#I3'#9(e#Kf\#IJ'(#gf$#$<f"1#
2`#Kf\#9(VL'*#$%&'(#$%4'*#, /#9_#$(X#$%>8#9!"#9?9#Kd;#9(e#9(VL'*#$%&'(#$%4'*#, /#
%`'*#/w#C<$1#~<p>#'78#9_#'*(ĩ;#I7#, /#9_#$(X#$%>8#9!"#9?9#Kd;#9(e;#9(VL'*#$%&'(#${#
#Kf'#FFFFt#$ổ'*#9`'*#I7#w4g#C8$a#\u#IJ'(1#5>8#'(<3'^#g(Z'*#"(M<#$Y$#9M#\|<#
$(7'(#B<3'#9A;#, /#Kp>#9_#$Y$#9M#w4g#C8$a#yON#$%3'#9(@"#KV)9#97<#Kc$1#P!8#g(<#
, /#KV)9#C!$#'*>ồ'#$(&#'_#K?'(#$(=9#ở#Kd;#9(e;#'74?#
2.4.2 Địa chỉ bắt đầu khi 8051 đ ợc cấp nguồn.
N`$#9â>#(z<#\7#$;#"(M<#(z<#Bp#C`#B<#K<p>#g(<X'#CY$#go#I7#$(&#'_#KV)9#9Y"#'*>ồ'#$(&#'_#
Cắ$#K6>#${#Kd;#9(e#'74?#Nỗ<#C`#B<#K<p>#g(<X'#Kp>#g(?9#'(;>1#5%4'*#$%V]'*#()"#(|#
, /#$(&#\|<#$(7'(#B<3'#gX#${#'(7#DM'#q>Y$#'74#(;8#"(<3'#CM'#'74#$(&#C`#B<#K<p>#

g(<X'#Kp>#Cắ$#K6>#${#Kd;#9(e# #g(<#'_#KV)9#C!$#'*>ồ'1#2!$#'*>ồ'#ở#Kâ8#9_#'*(ĩ;#
I7#$;#9Y"#K<J'#?"#P
99
#Kf'#9(â'#yEiE5#'(V#Ds#$%&'(#C78#ở#9(VL'*#41#t;8#'_<#9?9(#
g(?9^#g(<#, /#KV)9#9Y"#'*>ồ'#$(&#C`#Kf\#9(VL'*#$%&'(#9_#*<?#$%d# 1#~<p>#'78#9_#
'*(ĩ;#I7#'_#9(]#\u#IJ'(#K6>#$<3'#KV)9#IV>#ở#Kd;#9(e;#yON# t1#P&#Ib#F4#'78#\7#
$%4'*#Bd#$%@#'(H# t#9A;#C`#'(ở#yON#9(VL'*#$%&'(#B&#Kâ8#I7#'L<#\7#'_#$&\#IJ'(#
K6>#$<3'#g(<#C!$#'*>ồ'1#S(:'*#$;#K[$#KV)9#K<p>#'78#Cằ'*#9â>#IJ'(#OyG#$%4'*#
9(VL'*#$%&'(#'*>ồ'#'(V#Ku#$%&'(#C78#$%VH9#Kâ81#RVH<#Kâ8#I7#(4[$#K`'*#${'*#CVH9#9A;#
C`#Kf\#9(VL'*#$%&'(#$%4'*#q:;#$%&'(#'["#B7#$(ự9#$(<#\`$#9(VL'*#$%&'(#\ẫ>1#
2.4.3 Đặt mã vào ROM ch ơng trình.
~X#(<X>#$r$#(L'#B;<#$%ò#9A;#C`#Kf\#9(VL'*#$%&'(#$%4'*#q>?#$%&'(#'["#B7#$(ự9#$(<#\`$#
9(VL'*#$%&'(^#$;#g(M4#D?$#\`$#(4[$#K`'*#9A;#C`#Kf\#9(VL'*#$%&'(#g(<#\ỗ<#IJ'(#KV)9#
'["#B7#$(ự9#$(<1#5%VH9#(f$#$;#g(M4#D?$#\`$#I6'#'+;#$J"#I<J$#g3#9A;#9(VL'*#$%&'(#\ẫ>#B7#
9?9(#Kc$#\u#B74#yON#9(VL'*#$%&'(#, /#'(V#$(f#'74?#(V#$;#9_#$(X#$(Y8^#\u#IJ'(#
B7#$4?'#(['*#Kr<#BH<#\ỗ<#IJ'(#KV)9#I<J$#g3#ở#C3'#$%?<#9A;#IJ'(#I<J$#g31#
S(VL'*#$%&'(#01/h#P@#FG#\ẫ>#Bp#\`$#9(VL'*#$%&'(#()"#'*+1#
S(VL'*#$%&'(#01/#9(4#$%3'#Kâ8#I7#\`$#9(>ỗ<#9?9#9â>#IJ'(#(4c9#9?9#Fò'*#IJ'(#KV)9#
B<f$#(4c9#Cằ'*#9?9#IJ'(#()"#'*+#'(V#QRR#B7#NOP#(4c9#Cằ'*#9?9#9â>#IJ'(#KV)9#*|<#
I7#9?9#9(e#Fẫ'1#5%4'*#g(<#9?9#IJ'(#()"#'*+#$(&#'_<#STU#"(M<#I7\#*&#$(&#9?9#9(e#IJ'(#
k(;8#9ò'#*|<#I7#*<M#IJ'(n#$(&#KV;#%;#9?9#9(e#IJ'(#9(4#()"#'*+1#P@#FG^#$%4'*#9(VL'*#
$%&'(#01/#$(&#9?9#IJ'(#QRR#B7#NOP#I7#9?9#IJ'(#Kf'#STU^#9ò'#OyG#B7#ER#I7#9?9#
9(e#IJ'(#Kr<#BH<#()"#'*+1#OyG#'_<#()"#'*+#Kc$#\u#IJ'(#$[<#'*ă'#'(H#-#B7#ER#$(&#
C?4#9(4#()"#'*+#C<f$#gf$#$(:9#\u#'*>ồ'1#t;8#'_<#9?9(#g(?9#\`$#9(e#IJ'(#KX#Cắ$#K6>#
B7#9(e#IJ'(#$(=#(;<#KX#gf$#$(:9#9(VL'*#$%&'(1#
SY>#$%:9#9A;#\`$#IJ'(#()"#'*+#9_#4#$%V]'*#'(V#D;>h#
['(u'h]### [${#*)<#'(H]# [9?9#$4?'#(['*]# [;#9(:#*<M<]#
S?9#$%V]'*#$%4'*#FY>#'*4c9#B>Z'*#I7#$>o#9(|'#B7#g(Z'*#"(M<#Fò'*#IJ'(#'74#9ũ'*#9_#
9(:'*1#S?9#FY>#'*4c9#B>Z'*#g(Z'*#KV)9#B<f$#B741#PH<#F['*#$(=9#$%3'#Kâ8#96'#IV>#b#
9?9#K<X\#D;>h#

5%V]'*#'(u'#9(4#"(}"#9(VL'*#$%&'(#$(;\#9(<f>#Kf'#\`$#Fß'*#IJ'(#C»'*#$3'1#•_#
g(Z'*#KV)9#B<f$#q>?#\`$#Dr#gb#$ù#'(Y$#Kd'(1#tu8#g<X\#$%;#q>8#Kd'(#'78#9A;#()"#'*+#
\7#$;#DE#FG'*1#
5{#*)<#'(H#kIJ'(n#B7#9?9##$4?'#(['*#I7#9?9#$%V]'*#gf$#()"#BH<#'(;>#$(ù9#$(<#9Z'*#B<J9#
$(ù9#$f#9A;#9(VL'*#$%&'(#B7#(47'#$(<J'#9?9#'(<J\#BG#\7#9(VL'*#$%&'(#KV)9#B<f$#9(4#
9(:'*1#5%4'*#()"#'*+#9?9#9©>#IJ'(#'(Vh#
“ ADD A, B”
“MOV A, #67H”
#
5(&#QRR#B7#NOP#I7#'(+'*#${#*L<#'(H#$[4#%;#\u#IJ'(^#9ß'#“Q^#2”#B7#“Q^#
#wjt”#I7#'(+'*#$4?'#(['*#$(&#(;<#$%V]'*#9_#$(X#9(=;#9?9#IJ'(#*<M#(4c9#9(e#IJ'(#9A;#
()"#'*+1#tu8#'(H#%»'*#9?9#9(e#IJ'(#g(Z'*#$[4#%;#\u#IJ'(#'74#k\u#\?8n#B7#9(:'*#
9(e#FW'*#Cë<#()"#'*+^#'*V)9#I[<#Kr<#BH<#9?9#IJ'(#I7#9(:'*#KV)9#Fd9(#%;#\u#\?8#k\u#
I3'(n#9(4#STU#$(ù9#(<J'1#5%4'*#9(VL'*#$%&'(#01/#9?9#IJ'(#OyG#B7#E•R#I7#9?9#9(e#
IJ'(#k\`$#Dr#()"#'*+#9A;#, /#DE#FG'*#F['*#1OyG#B7#1E•Rn1#tu8#K|9#q>8#Kd'(#9G#
$(X#9A;#()"#'*+#$;#DE#FG'*1#
5%VL'*#9(:#*<M<#I>Z'#"(M<#C¾$#K6>#C»'*#FY>#9(Y\#"(È8#k;n1##S?9#9(:#*<M<#9_#
$(X#C¾$#K6># ë#K6>#Fß'*#(4c9#*<+;#Fß'*1#t)"#'*+#Cz# q>;#kI7\#'*Ln#9?9#9(:#*<M<#
'(V'*#9(:'*#I[<#%Y$#96'#$(<f$#Kr<#BH<#I!"#$%&'(#B<3'1#Nc9#FW#9?9#9(:#*<M<#I7#$>o#9(|'^#
g(Z'*#C¾$#C>`9#'(V'*#$;#'3'#FW'*#9(:'*#KX#\Z#$M#9(VL'*#$%&'(#KX#*<:"#9(4#'*V]<#
g(?9#K|9#B7#(<X>#9(VL'*#$%&'(#FÔ#F7'*#(L'1#
V>#b#Kf'#'(u'#tEyE#$%4'*#$%V]'*#'(u'#9A;#
9(VL'*#$%&'(#01/1#N`$#'(u'#CY$#go#$(;\#9(<f>#Kf'#\`$#
IJ'(#"(M<#9_#FY>#(;<#9(Y\#khn#K='*#ë#D;>1#5%4'*#9©>#IJ'(#
'(M8#'*¾'#iJNT#$(&#, /#KV)9#%;#IJ'(#ë#I[<#$%4'*#Bß'*#
Ic"#'78#BZ#(['1#•f>#(J#$(r'*#9A;#9(:'*#$;#9_#\`$#9(VL'*#
$%&'(#*<?\#D?$#$(&#$;g(Z'*#96'#Fß'*#IJ'(#'78#B7##'_#9_#$(X#
KV)9#q4?#K<#%;#g(z<#9(VL'*#$%&'(1###
#S(VL'*#$%&'(#01/h#5J"#I<J$#g3#
#i;>#g(<#9(VL'*#$%&'(#KV)9#Kr$#B74#$%4'*#yON#9A;#

$(7'(#B<3'#(|#, /#'(V#,j./#(4c9#Q5#,9./#(4c9#Ri#
#$(&#\u#IJ'(#B7#$4?'#(['*#KV)9#KV;#B74#9?9#Bd#$%@#'(H#
yON#C¾$#K6>#${#Kd;#9(e# #'(V#CM'*#I<J$#g3#FVH<#K©81#
#
§Þa chØ ROM Ng«n ng÷ m¸y Hîp ng÷
0000 7D25 MOV R5, #25H
0002 7F34 MOV R7, #34H
0004 7400 MOV A, #0
0006 2D ADD A, R5
0007 2F ADD A, R7
0008 2412 ADD A, #12H
000A 80EF HERE: SJMP HERE
#
2M'*#'`<#F>'*#yON#9A;#9(VL'*#$%&'(#01/1#
2M'*#I<J$#g3#9(e#%;#Kd;#9(e# #9(=;#\u#jR#I7#\u#IJ'(#KX#9(>8X'#\`$#*<?#$%d#B74#
$(;'(#*(<#y.#B7#Kd;#9(e# /#9(=;#$4?'#(['*#kë#K©8#I7#*<?#$%d#0.4n#96'#KV)9#9(>8X'#
B74#y.1#R4#B!8^#IJ'(#“NOP#y.^##0.t”#9_#\u#I7#“jR0.”#$%4'*#K_#jR#I7#\u#IJ'(^#
§Þa chØ M· lÖnh
0000 7D
0001 25
0002 F7
0003 34
0004 74
0005 00
0006 2D
0007 2F
0008 24
0009 12
000A 80
000B FE

#
9ò'*#0.#I7#$4?'#(['*1#5VL'*#$ự#'(V#B!8^#\u#\?8#jFv4#KV)9#Kc$#$%4'*#9?9#'*ă'#
'(H# 0#B7# v#B7#C<X>#F<ễ'#\u#IJ'(#B7#$4?'#(['*#Kr<#BH<#IJ'(#NOP#yj^##v4t1#
5(a4#9?9(#'(V#B!8^#\u#\?8#j4 #KV)9#Kc$#$[<#Kd;#9(e# 4#B7# #B7#C<X>#F<ễ'#
\u#IJ'(#B7#$4?'#(['*#Kr<#BH<#IJ'(#NOP#Q^##-1#*ă'#'(H# w#9_#\u#0R#I7#\u#
Kr<#BH<#IJ'(#QRR#Q^#y.#B7#'*ă'#'(H# j#9_#'`<#F>'*#0F#I7#\u#IJ'(#9(4#QRR#
Q^#yj1#Nu#IJ'(#Kr<#BH<#IJ'(#QRR#Q^##/0t#KV)9#Kc$#ở#'*ă'#'(H# ,#B7#$4?'#
(['*#/0t#KV)9#Kc$#ở#'*ă'#'(H# 91#*ă'#'(H# Q#9_#\u#IJ'(#9A;#IJ'(#iJNT#B7#
Kd;#9(e#K@9(#9A;#'_#KV)9#Kc$#ở#'*ă'#'(H# 21# b#F4#B&#D;4#Kd;#9(e#K@9(#I7#FE#KV)9#
*<M<#$(@9(#ở#9(VL'*#v1#
2.4.4 Thực hiện một ch ơng trình theo từng byte.
G<M#DE#%ằ'*#9(VL'*#$%&'(#$%3'#KV)9#Kr$#B74#yON#9A;#9(@"#, /#(4c9k#,j./^#Q5#
,9./#(4c9#Ri# n#$(&#FVH<#Kâ8#I7#\Z#$M#(4[$#K`'*#$(a4#${'*#CVH9#9A;#, /#g(<#'_#
KV)9#9Y"#'*>ồ'1#
/1# K(<#, /#KV)9#C!$#'*>ồ'^#C`#Kf\#9(VL'*#$%&'(#TS#9_#'`<#F>'*# #B7#Cắ$#K6>#'["#
\u#IJ'(#K6>#$<3'#${#Bd#$%@#'(H# #9A;#yON#9(VL'*#$%&'(1#5%4'*#$%V]'*#()"#9A;#
9(VL'*#$%&'(#'78#I7#\u#jR#KX#9(>8X'#\`$#$4?'#(['*#B74#y.1#K(<#$(ự9#(<J'#\u#IJ'(#
STU#'["#*<?#$%d#0.#B74#C`#Kf\#9(VL'*#$%&'(#KV)9#$ă'*#I3'#KX#9(e#Kf'# 0#kTS#=#
0n#9_#9(=;#\u#IJ'(#jF#I7#\u#9A;#IJ'(#9(>8X'#\`$#$4?'#(['*#B74#yj#NOP#yj^#
1111#
01# K(<#$(ự9#(<J'#\u#IJ'(#jF#$(&#*<?#$%d#v4t#KV)9#9(>8X'#B74#yj#D;>#K_#TS#KV)9#$ă'*#
I3'# 41#
v1#*ă'#'(H# 4#9(=;#\u#IJ'(#9A;#IJ'(#NOP#Q^##-1# J'(#'78#KV)9#$(ự9#(<J'#B7#
Câ8#*<]#TS#=# w1# V>#b#%ằ'*#$Y$#9M#9?9#IJ'(#$%3'#Kp>#I7#'(+'*#IJ'(#0#C8$a^#'*(ĩ;#
I7#\ỗ<#IJ'(#9(<f\#(;<#'*ă'#'(H1#
41#2â8#*<]#TS#=# w#9(e#Kf'#IJ'(#gf#$<f"#I7#QRR#Q^#y.1#~â8#I7#IJ'(#\`$#C8$a^#D;>#
g(<#$(ự9#(<J'#IJ'(#'78#TS#=# j1#
.1#*ă'#'(H# j#9(=;#\u#0F#I7#\u#IJ'(#9A;#QRR#Q^#yj1#~â8#9ũ'*#I7#IJ'(#\`$#
C8$a^#g(<#$(ự9#(<J'#IJ'(#'78#TS#KV)9#$ă'*#I3'# ,1#Q:;#$%&'(#'78#9=#$<f"#$G9#9(4#
Kf'#g(<#$Y$#9M#\4<#IJ'(#Kp>#KV)9#'["#B7#$(ự9#(<J'1#5(ự9#$f#\7#C`#Kf\#9(VL'*#$%&'(#

9(e#Kf'#IJ'(#gf#$<f"#96'#KV)9#$(ự9#(<J'#*<M<#$(@9(#$[<#D;4#\`$#Dr#C`#B<#qE#Ib#kK?'*#
'_<#I7##,wn#*|<#C`#Kf\#I7#94'#$%z#IJ'(#kI'D$%>9$<4'#T4<'$a%n1#
2.4.5 Bản đồ nhớ ROM trong họ 8051.
(V#$;#Ku#$(Y8#ở#9(VL'*#$%VH9^#\`$#Dr#$(7'(#B<3'#(|#, /#9(e#9_#4g#C8$a#C`#'(H#
yON#$%3'#9(@"#kB@#FG#,j./^#Q5#,9./n#B7#\`$#Dr#g(?9#'(V#Q5#,9./#9_#,g#C8$a#
yON^#Ri# lv0#9A;#R;II;D#ia\<94'F>9$4%#9_#v0g#C8$a#yON#$%3'#9(@"1#R;II;D#
ia\<94'F>9$4%#9ũ'*#9_#\4$|#, /#BH<#yON#$%3'#9(@"#I7#w4g#C8$a1#~<X\#96'#'(H#I7#
g(Z'*#9_#$(7'(#B<3'#'74#9A;#(|#, /#9_#$(X#$%>8#9!"#KV)9#(L'#w4g#C8$a#\u#IJ'(#B&#
C`#Kf\#9(VL'*#$%&'(#9A;#, /#I7#/w#C<$#kFM<#Kd;#9(e#${# #Kf'#FFFFtn1#S6'#"(M<#
*(<#'(H#I7#IJ'(#K6>#$<3'#9A;#yON#9(VL'*#$%&'(#Kp>#Kc$#ở# ^#9ò'#IJ'(#9>r<#9W'*#
"(G#$(>`9#B74#F>'*#IV)'*#yON#$%3'#9(@"#9A;#\ỗ<#$(7'(#B<3'#(|#, /1#5%4'*#Dr#9?9#
$(7'(#B<3'#(|#, /#$(&#,j./#B7#Q5#,9./#9_#4g#C8$a#yON#$%3'#9(@"1#2`#'(H#yON#
$%3'#9(@"#'78#9_#9?9#Kd;#9(e#${# #Kf'#-FFFt1#R4#B!8^#'*ă'#'(H#K6>#$<3'#9_#Kd;#
9(e# #B7#'*ă'#'(H#9>r<#9W'*#9_#Kd;#9(e;#-FFFt1#tu8#q}$#B@#FG#01/1#
Ví dụ 2.1:
5&\#Kd;#9(e#C`#'(H#yON#9A;#\ỗ<#$(7'(#B<3'#(|#, /#D;>#Kâ81#
;n#Q5#,9./#k(4c9#,j./n#BH<#4g#C8$a#
Cn#Ri# lv0#BH<#v0g#C8$a#
Lời giải:
;n#PH<#4g#C8$a#9A;#g(Z'*#*<;'#'(H#yON#$%3'#9(@"#$;#9_#4-9w#C8$a#Cằ'*#/ t#ở#F['*#
taq#k4##/-04#=#4-9w#(;8#/ #ở#F['*#taqn1#2`#'(H#'78#KV)9#qắ"#qf"#$%4'*#9?9#
'*ă'#'(H#${# #Kf'#-FFFFt1# V>#b#-#I>Z'#I7#'*ă'#'(H#K6>#$<3'1#
Cn#PH<#v0g#C8$a#'(H#$;#9_#v01jw,#C8$a#kv0##/-04n1#S(>8X'#Kổ<#v01jw,#Bp#Dr#taq#$;#
'(!'#KV)9#*<?#$%d#, t1#R4#B!8^#g(Z'*#*<;'#'(H#I7#FM<#${# #Kf'#jFFFt1#
#
#
#
#
#
#

#
#
#
#
#
#
#
#
Hình 2.3:#RM<#Kd;#9(e#9A;#yON#$%3'#9(@"#\`$#Dr#$(7'(#B<3'#(|#, /1#
01.#S?9#g<X>#F+#I<J>#B7#9?9#9(e#IJ'(1#
2.5.1 Kiểu dữ liệu và các chỉ lệnh của 8051.
2`#B<#K<p>#g(<X'#9(e#9_#\`$#g<X>#F+#I<J>^#'_#I7#,#C<$#B7#K`#F7<#\ỗ<#$(;'(#*(<#9ũ'*#I7#
,#C<$1#SZ'*#B<J9#9A;#I!"#$%&'(#B<3'#I7#"(â'#9(<;#F+#I<J>#IH'#(L'#,#C<$#%;#$(7'(#${'*#
g(:9#,#C<$#k${# #Kf'#FFt#(;8#${#-#Kf'#0 n#KX#STU#qE#Ib1#P@#FG#Bp#qE#Ib#F+#I<J>#IH'#
(L'#,#C<$#KV)9#$%&'(#C78#ở#9(VL'*#w1#S?9#F+#I<J>#KV)9#DE#FG'*#Cở<#, /#9_#$(X#I7#Dr#
â\#(4c9#Dr#FVL'*#B7#Bp#qE#Ib#9?9#Dr#9_#FY>#KV)9#C7'#ở#9(VL'*#w1#
2.5.2 Chỉ lệnh DB (định nghĩa byte).
S(e#IJ'(#R2#I7#\`$#9(e#IJ'(#F+#I<J>#KV)9#DE#FG'*#%`'*#%u<#'(Y$#$%4'*#()"#'*+1#_#
KV)9#FW'*#KX#Kd'(#'*(ĩ;#F+#I<J>#,#C<$1#K(<#R2#KV)9#FW'*#KX#Kd'(#'*(ĩ;#C8$a#F+#I<J>#
$(&#9?9#Dr#9_#$(X#ở#F['*#$(!"#"(â'^#'(d#"(â'^#taq#(4c9#ở#F['*#$(=9#QiII1#~r<#BH<#F+#
I<J>#$(!"#"(â'#$(&#96'#Kc$#9(+#R#D;>#Dr#$(!"#"(â'^#Kr<#BH<#Dr#'(d#"(â'#$(&#Kc$#9(+#
2#B7#Kr<#BH<#F+#I<J>#F['*#taq#$(&#96'#Kc$#9(+#t1#2Y$#gX#$;#DE#FG'*#Dr#ở#F['*#
$(=9#'74#$(&#()"#'*+#Kp>#9(>8X'#Kr<#9(:'*#Bp#$(7'(#F['*#taq1#~X#C?4#F['*#$(=9#ở#
F['*#\u#QiSII#$(&#9(e#96'#KL'#*<M'#Kc$#'_#B74#FY>#'(?8#KL'#'(V#$(f#'781#t)"#'*+#
Ds#*?'#\u#QiSII#9(4#9?9#Dr#(4c9#9?9#gb#$ự#\`$#9?9(#$ự#K`'*1#S(e#IJ'(#R2#9(e#I7#9(e#
IJ'(#\7#9_#$(X#KV)9##DE#FG'*#KX#Kd'(#'*(ĩ;#9?9#9(>ỗ<#QiSII#IH'#(L'#0#gb#$ự1#R4#
B!8^#'_#9_#$(X#KV)9#DE#FG'*#9(4#$Y$#9M#\|<#Kd'(#'*(ĩ;#F+#I<J>#QiSII1#RVH<#Kâ8#I7#
\`$#Dr#B@#FG#Bp#R2h#
ORG 500H
DATA1: DB 2B ; Số thập phân (1C ở dạng Hex)

DATA2: DB 00110101B ; Số nhị phân (35 ở dạng Hex)
DATA3: DB 39H ; Số dạng Hex
ORG 510H
DATA4: DB 2591 ; Các số ASCII
ORG 518H
DATA5 DB My name is Joe ; Các ký tự ASCII
byte

byte

byte

0000

0FFF

1FFF

7FFF

0000

0000

8751

AT89C51
#
8752


AT89C52
#
DS5000
-
32

##
#S?9#9(>ỗ<#QiSII#9_#$(X#DE#FG'*#FY>#'(?8#KL'#'(V#$(f#'78#(4c9#'(?8#g}"#
'(V#$(f#'781#RW'*#FY>#"(ẩ8#g}"#Ds#(+>#@9(#(L'#Kr<#BH<#$%V]'*#()"#FY>#'(?8#KL'#
KV)9#FW'*#Dở#(+>#9?9(#'(V#$(f#'78#(7#O# a;%81#S(e#IJ'(#R2#9ũ'*#KV)9#FW'*#
KX#9Y"#"(?$#C`#'(H#$(a4#${'*#K4['#g@9(#$(VH9#\`$#C8$a1#
2.5.3 Các chỉ lệnh của hợp ngữ.
/1#S(e#IJ'(#OyGh#S(e#IJ'(#OyG#KV)9#FW'*#KX#C?4#Cắ$#K6>#9A;#Kd;#9(e1#ir#K<#D;>#OyG#
9_#gX#ở#F['*#taq#(4c9#$(!"#"(â'1#f>#Dr#'78#9_#gè\#9(+#t#Kằ'*#D;>#$(&#I7#ở#F['*#
taq#B7#'f>#g(Z'*#9_#9(+#t#ở#D;>#I7#Dr#$(!"#"(â'#B7#()"#'*+#Ds#9(>8X'#'_#$(7'(#Dr#
taq1#N`$#Dr#()"#'*+#DE#FG'*#FY>#9(Y\#K='*#$%VH9#OyG#$(;8#9(4#OyG1#tu8#
K|9#gx#Bp#$%&'(#()"#'*+#$;#DE#FG'*1#
01#S(e#IJ'(#EQUh#~V)9#FW'*#KX#Kd'(#'*(ĩ;#\`$#(ằ'*#Dr#\7#g(Z'*#9(<f\#'*ă'#'(H#
'741#S(e#IJ'(#EQU#g(Z'*#F7'(#9(ỗ#9Y$#9(4#F+#I<J>#'(V'*#'_#*ắ'#\`$#*<?#$%d#(ằ'*#Dr#
BH<#'(u'#F+#I<J>#D;4#9(4#g(<#'(u'#q>Y$#(<J'#$%4'*#9(VL'*#$%&'(#*<?#$%d#(ằ'*#Dr#9A;#
'_#Ds#KV)9#$(;8#$(f#Kr<#BH<#'(u'1#RVH<#Kâ8#DE#FG'*#EQU#9(4#(ằ'*#Dr#C`#Kf\#B7#D;>#
K_#(ằ'*#Dr#KV)9#FW'*#KX#'["#$(;'(#*(<#yi1#
#
COUNT EQU 25
MOV R3, #count
#
K(<#$(ự9#(<J'#IJ'#NOP#yv^##SOU5#$(&#$(;'(#*(<#yv#Ds#KV)9#'["#*<?#$%d#
0.#k9(:#b#Kf'#FY>##n1#P!8#V>#K<X\#9A;#B<J9#DE#FG'*#EQU#I7#*&?#G<M#DE#9_#
\`$#(ằ'*#Dr#k\`$#*<?#$%d#9r#Kd'(n#KV)9#FW'*#$%4'*#'(<p>#9(ỗ#g(?9#'(;>#$%4'*#
9(VL'*#$%&'(#B7#I!"#$%&'(#B<3'#\>r'#$(;8#Kổ<#*<?#$%d#9A;#'_#$%4'*#9M#9(VL'*#

$%&'(1#2ằ'*#B<J9#DE#FG'*#9(e#IJ'(#EQU#$;#9_#$(X#$(;8#Kổ<#\`$#Dr#I6'#B7#()"#
'*+#Ds#$(;8#Kổ<#$Y$#9M#\|<#I6'#q>Y$#(<J'#9A;#'_#I7#$&\#$47'#C`#9(VL'*#$%&'(#B7#
*ắ'*#$&\#\|<#I6'#q>Y$#(<J'1#
v1#S(e#IJ'(#ERh#N`$#IJ'(#q>;'#$%|'*#g(?9#I7#9(e#IJ'(#ER1#_#C?4#9(4#$%&'(#
()"#'*+#gf$#$(:9#9A;#$J"#'*>ồ'#;D\#9(e#IJ'(#ER#I7#Fò'*#9>r<#9W'*#9A;#
9(VL'*#$%&'(#, /#9_##'*(ĩ;#I7#$%4'*#\u#'*>ồ'#$(&#\|<#$(=#D;>#9(e#IJ'(#ER#
KX#Cd#$%&'(#()"#'*+#Cz#q>;1#N`$#Dr#$%&'(#()"#'*+#DE#FG'*#1ER#9_#FY>#9(Y\#
K='*#$%VH9#$(;8#9(4#ER1#
2.5.4 Các quy định đố với nhãn trong hợp ngữ.
2ằ'*#9?9(#9(|'#9?9#$3'#'(u'#9_#'*(ĩ;#I7#\`$#I!"#$%&'(#B<3'#9_#$(X#I7\#9(4#9(VL'*#
$%&'(#Fễ#K|9#B7#Fễ#CM4#$%&#(L'^#9_#\`$#Dr#q>8#Kd'(#\7#9?9#$3'#'(u'#"(M<#$>â'#$(a41#
5(=#'(Y$#I7#\ỗ<#$3'#'(u'#"(M<#$(r'*#'(Y$^#9?9#$3'#KV)9#DE#FG'*#I7\#'(u'#$%4'*#()"#
'*+#*ồ\#9?9#9(+#9?<#B<f$#(4;#B7#B<f$#$(V]'*^#9?9#Dr#${#-#Kf'#9#B7#9?9#FY>#Kc9#C<J$#
'(Vh#FY>#(z<#k?n^#FY>#kn^#FY>#*[9(#FVH<#k_n^#FY>#KZ#I7#k$n#B7#FY>#9(>#go#k1n1#Kb#$ự#
K6>#$<3'#9A;#'(u'#"(M<#I7#\`$#9(+#9?<1#t;8#'_<#9?9(#g(?9#I7#'_#g(Z'*#$(X#I7#Dr#taq1#
Nỗ<#$%&'(#()"#'*+#9_#\`$#Dr#${#Fự#$%+#I7#9?9#${#*)<#'(H#9(4#9?9#IJ'(#\7#g(Z'*#KV)9#
FW'*#KX#I7\#'(u'#$%4'*#9(VL'*#$%&'(1#P@#FG#'(V#NOP#B7#QRR1#23'#9['(#9?9#
${#*)<#'(H#9ò'#9_#\`$#Dr#$ự#Fự#$%+#g(?9^#(u8#g<X\#$%;#CM'#I<J$#g3#9?9#${#Fự#"(ò'*#9A;#
()"#'*+#$;#K;'*#DE#FG'*1#
01w#S?9#C<$#9]#B7#$(;'(#*(<#Kc9#CJ$#TiW#9A;#, /1#
Sũ'*#'(V#9?9#C`#B<#qE#Ib#g(?9^#, /#9_#\`$#$(;'(#*(<#9]#KX#C?4#9?9#K<p>#g<J'#Dr#
(|9#'(V#C<$#'(H1#5(;'(#*(<#9]#$%4'*#, /#KV)9#*|<#I7#$(;'(#*(<#${#$%['*#$(?<#9(VL'*#
$%&'(#TiW1#5%4'*#"(6'#'78#B7#KV;#%;#\`$#Dr#B@#FG#Bp#9?9(#$(;8#Kổ<#9(:'*1#
2.6.1 Thanh ghi từ trạng thái ch ơng trình PSW.
5(;'(#*(<#TiW#I7#$(;'(#*(<#,#C<$1#_#9ũ'*#9ò'#KV)9#94<#'(V#I7#$(;'(#*(<#9]1#Nc9#
FW#$(;'(#*(<#TiW#%`'*#,#C<$#'(V'*#9(e#9_#w#C<$#KV)9#, /#DE#FG'*1#t;<#C<$#9(V;#
FW'*#I7#9?9#9]#9(#'*V]<#FW'*#Kd'(#'*(ĩ;1#2r'#$%4'*#Dr#9?9#9]#KV)9#*|<#I7#9?9#9]#9_#
K<p>#g<J'^#9_#'*(ĩ;#I7#9(:'*#C?4#\`$#Dr#K<p>#g<J'#F4#gf$#q>M#9A;#\`$#IJ'(#B{;#KV)9#
$(ự9#(<J'1#2r'#9]#'78#I7#9]#'(H#SY#k9;%%8n^#9]#QS#k;>q<I<;%8#9;%8n^#9]#9(ẵ'#Iẻ#T#
k";%<$8n#B7#9]#$%7'#OP#k4Ba%mI4wn1#

(V#'(&'#$(Y8#${#(&'(#014#$(&#9?9#C<$#TiW1v#B7#TiW14#KV)9#*?'#'(V#yi-#B7#yi/#B7#
9(:'*#KV)9#DE#FG'*#KX#$(;8#Kổ<#9?9#$(;'(#*(<#Că'*1#S(:'*#Ds#KV)9#*<M<#$(@9(#ở#"(6'#
gf#D;>1#S?9#C<$#TiW1.#B7#TiW1/#I7#9?9#C<$#9]#$%['*#$(?<#9Z'*#FG'*#9(>'*#B7#I!"#$%&'(#
B<3'#9_#$(X#DE#FG'*#9(4#CY$#go#\G9#K@9(#'741#
#
#
CY PSW.7 ; Cờ nhớ
AC PSW.6 ; Cờ
ã TiW1.## ;#R7'(#9(4#'*V]<#FW'*#DE#FG'*#\G9#K@9(#9(>'*#
RS1 PSW.4 ; Bit = 1 chọn băng thanh ghi
RS0 PSW.3 ; Bit = 0 chọn băng thanh ghi
OV PSW.2 ; Cờ bận
ã TiW1/## ;#2<$#F7'(#9(4#'*V]<#FW'*#Kd'(#'*(ĩ;#
P PSW.0 ; Cờ chẵn, lẻ. Thiết lập/ xoá bằng phần cứng mỗi chu kỳ lệnh báo tổng các
số bit 1 trong thanh ghi A là chẵn/ lẻ.
RS1 RS0 Băng thanh ghi Địa chỉ
0 0 0 00H - 07H
0 1 1 08H - 0FH
1 0 2 10H - 17H
1 1 3 18H - 1FH
#
Hình 2.4: Các bit của thanh ghi PSW
RVH<#Kâ8#I7#*<M<#$(@9(#'*ắ'#*|'#Bp#4#C<$#9]#9A;#$(;'(#*(<#TiW1#
/1#S]#'(H#SYh#S]#'78#KV)9#$(<f$#I!"#\ỗ<#g(<#9_#'(H#${#C<$#Rj1#S]#'78#KV)9#$?9#K`'*#
D;>#IJ'(#9`'*#(4c9#$%{#,#C<$1#_#9ũ'*#KV)9#$(<f$#I!"#I3'#/#(4c9#q4?#Bp#-#$%ự9#$<f"#
Cằ'*#IJ'(#iE52#S#B7#S y#S#'*(ĩ;#I7#$(<f$#I!"#9]#'(H#B7#q4?#9]#'(H#$VL'*#
='*1#Pp#9?9#IJ'(#K?'(#Kd;#9(e#$(a4#C<$#KV)9#C7'#gx#ở#9(VL'*#,1#
01#S]#QSh#S]#'78#C?4#9_#'(H#${#C<$#Rv#D;'*#R4#$%4'*#"(}"#9`'*#QRR#(4c9#$%{#iU21#
S]#'78#KV)9#FW'*#Cở<#9?9#IJ'(#$(ự9#$(<#"(}"#Dr#(|9#\u#2SR#kqa\#ở#9(VL'*#wn1#
v1#S]#9(ẵ'#Iẻ#Th#S]#9(ẵ'#Iẻ#9(e#"(M'#?'(#Dr#C<$#\`$#$%4'*#$(;'(#*(<#Q#I7#9(ẵ'#(;8#Iẻ1#

f>#$(;'(#*(<#Q#9(=;#\`$#Dr#9(ẵ'#9?9#C<$#\`$#$(&#T#=#-1#R4#B!8^#T#=#/#'f>#Q#9_#\`$#
Dr#Iẻ#9?9#C<$#\`$1#
41#S]#9(7'#OPh#S]#'78#KV)9#$(<f$#I!"#\ỗ<#g(<#gf$#q>M#9A;#\`$#"(}"#$@'(#Dr#9_#FY>#q>?#
IH'#$[4#%;#C<$#C!9#9;4#I7\#$%7'#C<$#FY>1#(&'#9(>'*#9]#'(H#KV)9#FW'*#KX#"(?$#(<J'#
Iỗ<#$%4'*#9?9#"(}"#Dr#(|9#g(Z'*#FY>1#Sò'#9]#$%7'#KV)9#FW'*#9(e#KX#"(?$#(<J'#Iỗ<#
$%4'*#9?9#"(}"#Dr#(|9#9_#FY>#B7#KV)9#C7'#gx#ở#9(VL'*#w1#
2.6.2 Lệnh ADD và PSW.
2â8#*<]#$;#q}$#$?9#K`'*#9A;#IJ'(#QRR#I3'#9?9#C<$#SY^#QS#B7#T#9A;#$(;'(#*(<#TiW1#
N`$#Dr#B@#FG#Ds#I7\#%õ#$%['*#$(?<#9A;#9(:'*^#\c9#FW#9?9#C<$#9]#Cd#$?9#K`'*#Cở<#IJ'(#
QRR#I7#SY^#T^#QS#B7#OP#'(V'*#$;#9(e#$!"#$%>'*#B74#9?9#9]#SY^#QS#B7#T^#9ò'#9]#
OP#Ds#KV)9#'_<#Kf'#ở#9(VL'*#w#B&#'_#I<3'#q>;'#Kf'#"(}"#$@'(#Dr#(|9#Dr#9_#FY>1##
CY

AC

F0

OV

P

-

RS1

RS0

S?9#B@#FG#010#Kf'#014#Ds#"(M'#?'(#$?9#K`'*#9A;#IJ'(#QRR#I3'#9?9#C<$#'_<#$%3'1#
B¶ng 2.1:#S?9#IJ'(#$?9#K`'*#I3'#9?9#C<$#9]1#
VÝ dô 2.2:#tu8#$%&'(#C78#$%['*#$(?<#9?9#C<$#9]#SY^#QS#B7#T#D;>#IJ'(#9`'*#v,t#BH<#

0Ft#FVH<#K©8h#
MOV A, #38H
ADD A, #2FH ; Sau khi céng A = 67H, CY = 0
#
Lêi gi¶i:
38 00111000
+ 2F 00101111
67 01100111
#
S]#SY#=#-#B&#g(Z'*#9_#'(H#${#Rj#
S]#QS#=#/#B&#9_#'(H#${#Rv#D;'*#R4#
S]#T#=#/#B&#$(;'(#*(<#Q#9_#.#C<$#/#kIÎn#
#
VÝ dô 2.3:
tu8#$%&'(#C78#$%['*#$(?<#9?9#9]#SY^#QS#B7#T#
D;>#"(}"#9`'*#9St#BH<#w4t1#
Lêi gi¶i:
9C 10011100
+ 64 01100100
100 00000000
##
S]#SY#=#/#B&#9_#'(H#q>;#C<$#Rj#
S]#QS#=#/#B&#9_#'(H#${#Rv#D;'*#R4#
S]#T#=#-#B&#$(;'(#*(<#Q#g(Z'*#9_#C<$#/#'74#k9(½'n#
#
VÝ dô 2.4:
tu8#$%&'(#C78#$%['*#$(?<#9?9#9]#SY^#QS#B7#T#D;>#"(}"#9`'*#,,t#BH<#9vt1#
Lêi gi¶i:
#######,,# / / #
+#####9v# / / //#

#####//2# //-//#
##
S]#SY#=#/#B&#9_#'(H#${#C<$#Rj#
S]#QS#=#-#B&#g(Z'*#9_#'(H#${#Rv#D;'*#R4#
S]#T#=#-#B&#Dr#C<$#/#$%4'*#Q#I7#4#k9(½'n#
#
Instruction CY OV AC
ADD X X X
ADDC X X X
SUBB X X X
MUL 0 X
DIV 0 X
DA X
RRC X
RLC X
SETB C 1
CLR C 0
CPL C X
ANL C, bit X
ANL C,/ bit X
ORL C, bit X
ORL C,/bit X
MOV C, bit X
CJNE

X



01j#S?9#Că'*#$(;'(#*(<#B7#'*ă'#qf"#9A;#, /1#

2`#B<#K<p>#g(<X'#, /#9_#$Y$#9M#/0,#C8$a#yQN1#5%4'*#\G9#'78#$;#C7'#BJ#"(â'#Cr#
9A;#/0,#C8$a#yQN#'78#B7#g(M4#D?$#9Z'*#FG'*#9A;#9(:'*#'(V#9?9#$(;'(#*(<#B7#'*ă'#
qf"1#
2.7.1 Phân bố không gian bộ nhớ RAM trong 8051.
S_#/0,#C8$a#yQN#$%4'*#, /#k\`$#Dr#$(7'(#B<3'#K;'*#9(:#b#I7#, 0#9_#0.w#C8$a#
yQNn1#/0,#C8$a#yQN#C3'#$%4'*#, /#KV)9#*?'#Kd;#9(e#${# #Kf'#jFt1#(V#$;#Ds#
$(Y8#ở#9(VL'*#.^#9(:'*#9_#$(X#KV)9#$%>8#9!"#$%ự9#$<f"#'(V#9?9#'*ă'#'(H#/0,#C8$a#
yQN#'78#KV)9#"(â'#9(<;#$(7'(#${'*#'(_\#'(V#D;>h#
/1#5ổ'*#9`'*#v0#C8$a#${#'*ă'#'(H# #Kf'#/Ft#KV)9#F7'(#9(4#9?9#$(;'(#*(<#B7#'*ă'#
qf"1#
01#5ổ'*#9`'*#/w#C8$a#${#'*ă'#'(H#0-t#Kf'#0Ft#KV)9#F7'(#9(4#C`#'(H#K|9/#*(<#K?'(#
Kd;#9(e#KV)9#$(a4#C<$1#S(VL'*#,#Ds#C7'#9(<#$<f$#Bp#C`#'(H#B7#9?9#IJ'(#K?'(#Kd;#9(e#
KV)9#$(a4#C<$1#
v1#5ổ'*#9`'*#,-#C8$a#${#'*ă'#'(H#v-t#Kf'#jFt#KV)9#FW'*#9(4#IV>#K|9#B7#*(<#(;8#'(V#
Bẫ'#$(V]'*#*|<#I7#CM'*#'(?"#kia%;9(#";Fn1#(+'*#'*ă'#'(H#'78#k,-#C8$an#9A;#yQN#
KV)9#DE#FG'*#%`'*#%u<#9(4#\G9#K@9(#IV>#F+#I<J>#B7#$(;\#Dr#Cở<#9?9#I!"#$%&'(#B<3'#
, /1#S(:'*#$;#Ds#DE#FG'*#9(:'*#ở#9?9#9(VL'*#D;>#KX#IV>#F+#I<J>#'(!'#B74#STU#q>;#
9?9#9ổ'*#B74l%;1#
2.7.2 Các băng thanh ghi trong 8051.
(V#Ku#'_<#ở#$%VH9^#$ổ'*#9`'*#v0#C8$a#yQN#KV)9#F7'(#%<3'*#9(4#9?9#Că'*#$(;'(#*(<#
B7#'*ă'#qf"1#v0#C8$a#'78#KV)9#9(<;#%;#$(7'(#4#Că'*#9?9#$(;'(#*(<#$%4'*#K_#\ỗ<#Că'*#
9_#,#$(;'(#*(<#${#y-#Kf'#yj1#S?9#'*ă'#'(H#yQN#Dr#-^#y/#I7#'*ă'#'(H#yQN#Dr#/^#
y0#I7#'*ă'#'(H#yQN#Dr#0#B1B111#2ă'*#$(=#(;<#9A;#9?9#$(;'(#*(<#y-#Kf'#yj#Cắ$#K6>#${#
$(;'(#'(H#yQN#Dr#0#9(4#Kf'#'*ă'#'(H#yQN#Dr#-Ft1#2ă'*#$(=#C;#Cắ$#K6>#${#'*ă'#
'(H#/-t#Kf'#/jt#B7#9>r<#9W'*#${#'*ă'#'(H#/,t#Kf'#/Ft#I7#FW'*#9(4#Că'*#9?9#
$(;'(#*(<#y-#Kf'#yj#$(=#$V1#
#
R0 - R7
R0 - R7
R0 - R7

R0 - R7
RAM đánh địa
chỉ theo bit
RAM băng nhớ
(Seratch Pad)
#
##
Hình 2.5:#*ă'#qf"#9?9#$(;'(#'(H#yQN#$%4'*#, /1#
#
#
#
#
#
#
#
#
#
#
#
#
00 07 08 0F10 1718 1F 20 2F 3
0 7F

Băng0 Băng3

R7

R6

R5


R4

R3

R2

R1

7

6

.

4

v

0

1

R0

0

R7

R6


R5

R4

R3

R2

R1

F

E

D

C

B

A

9

R0

8

R7


R6

R5

R4

R3

R2

R1

17

16

15

14

13

12

11

R0

10


R7

R6

R5

R4

R3

R2

R1

1F

1E

1D

1C

1B

1A

19

R0


18

Bank 0

Bank 1

Bank 2

Bank 3

#
#
Hình 2.6: S?9#Că'*#$(;'(#*(<#9A;#, /#B7#Kd;#9(e#9A;#9(:'*1#
(V#$;#9_#$(X#'(&'#$(Y8#${#(&'(#01.#Că'*#/#DE#FG'*#9W'*#g(Z'*#*<;'#yQN#'(V#'*ă'#
qf"1#~â8#I7#\`$#BY'#Kp#9(@'(#$%4'*#I!"#$%&'(#, /1#S(:'*#$;#"(M<#(4c9#I7#g(Z'*#DE#
FG'*#Că'*#/#(4c9#I7#"(M<#K?'(#\`$#g(Z'*#*<;'#g(?9#9A;#yQN#9(4#'*ă'#qf"1#
Ví dụ 2.5:
tu8#"(?$#C<X>#9?9#'`<#F>'*#9A;#9?9#'*ă'#'(H#yQN#D;>#K4['#9(VL'*#$%&'(#D;>h#
MOV R0, #99H ; Nạp R0 giá trị 99H
MOV R1, #85H ; Nạp R1 giá trị 85H
MOV R2, #3FH ; Nạp R2 giá trị 3FH
MOV R7, #63H ; Nạp R7giá trị 63H
MOV R5, #12H ; Nạp R5 giá trị12H
#
Lời giải:
i;>#g(<#$(ự9#(<J'#9(VL'*#$%&'(#$%3'#$;#9_h#
*ă'#'(H#-#9A;#yQN#9_#*<?#$%d#99t#
*ă'#'(H#/#9A;#yQN#9_#*<?#$%d#,.t#
*ă'#'(H#0#9A;#yQN#9_#*<?#$%d#vFt#

*ă'#'(H#j#9A;#yQN#9_#*<?#$%d#wvt#
*ă'#'(H#.#9A;#yQN#9_#*<?#$%d#/0t#
#
2.6.3 Băng thanh ghi mặc định.
f>#9?9#'*ă'#'(H# #Kf'#/F#KV)9#F7'(#%<3'*#9(4#Cr'#Că'*#$(;'(#*(<^#B!8#Că'*#
$(;'(#*(<#y-#Kf'#yj#'74#$;#"(M<#$%>8#9!"#$H<#g(<#, /#KV)9#9Y"#'*>ồ'?#Sâ>#$%M#I]<#I7#
9?9#Că'*#$(;'(#*(<#-1#~_#I7#9?9#'*ă'#'(H#yQN#Dr#-^#/^#0^#v^#4^#.^#w#B7#j#KV)9#$%>8#
9!"#BH<#$3'#y-^#y/^#y0^#yv^#y4^#y.^#yw#B7#yj#g(<#I!"#$%&'(#, /1#_#Fễ#F7'*#(L'#
'(<p>#g(<#$(;\#9(<f>#9?9#'*ă'#'(H#yQN#'78#LB@#9?9#$3'#y-^#y/#B1B111#(L'#I7#Dr#Bd#
$%@#9A;#9?9#'*ă'#'(H1#P@#FG#01w#I7\#%õ#g(?<#'<J\#'781#
Ví dụ 2.6:
tu8#B<f$#I[<#9(VL'*#$%&'(#ở#B@#FG#01.#DE#FG'*#9?9#Kd;#9(e#yQN#$(;8#$3'#9?9#$(;'(#
*(<1#
Lời giải:
~â8#KV)9#*|<#I7#9(f#K`#K?'(#Kd;#9(e#$%ự9#$<f"#B7#DE#FG'*#Kd;#9(e#9?9#Bd#$%@#'*ă'#'(H#
yQN#Kr<#BH<#Kd;#9(e#K@9(1#Xa\#9(<#$<f$#ở#9(VL'*#.#Bp#9(f#K`#K?'(#Kd;#9(e1#
MOV 00, #99H ; Nạp thanh ghi R0 giá trị 99H
MOV 01, #85H ; Nạp thanh ghi R1 giá trị 85H
MOV 02, #3FH ; Nạp thanh ghi R2 giá trị 3FH
MOV 07, #63H ; Nạp thanh ghi R7giá trị 63H
MOV 05, #12H ; Nạp thanh ghi R5 giá trị12H
#
2.6.4 Chuyển mạch các băng thanh ghi nh thế nào?
(V#Ku#'_<#ở#$%3'^#Că'*#$(;'(#*(<#-#I7#\c9#Kd'(#g(<#, /#KV)9#9Y"#'*>ồ'1#S(:'*#$;#
9_#$(X#9(>8X'#\[9(#D;'*#9?9#Că'*#$(;'(#*(<#g(?9#Cằ'*#9?9(#DE#FG'*#C<$#Rv#B7#R4#
9A;#$(;'(#*(<#TiW#'(V#9(e#%;#$(a4#CM'*#0101#
Bảng 2.2:#2<$#Iự;#9(|'#9?9#Că'*#$(;'(#*(<#yi-#B7#yi/1#
RS1 (PSW.4) RS0 (PSW.3)
Băng 0 0 0
Băng 1 0 1

Băng 2 1 0
Băng 3 1 1
#
2<$#Rv#B7#R4#9A;#$(;'(#*(<#TiW#$(V]'*#KV)9#$(;\#9(<f>#'(V#I7#TiW1v#B7#TiW14#B&#
9(:'*#9_#$(X#KV)9#$%>8#9!"#Cằ'*#9?9#IJ'(#K?'(#Kd;#9(e#$(a4#C<$#'(V#iE52#B7#S y1#
P@#FG#iE52#TiW1v#Ds#$(<f$#I!"#TiW1v#B7#9(|'#Că'*#$(;'(#*(<#/1#Xa\#B@#FG#01j#
FVH<#Kâ81#
Ví dụ 2.7:
tu8#"(?$#C<X>#'`<#F>'*#9?9#'*ă'#'(H#yQN#D;>#K4['#9(VL'*#$%&'(#FVH<#Kâ8h#
SETB PSW.4 ; Chọn băng thanh ghi 4
MOV R0, #99H ; Nạp thanh ghi R0 giá trị 99H
MOV R1, #85H ; Nạp thanh ghi R1 giá trị 85H
MOV R2, #3FH ; Nạp thanh ghi R2 giá trị 3FH
MOV R7, #63H ; Nạp thanh ghi R7giá trị 63H
MOV R5, #12H ; Nạp thanh ghi R5 giá trị12H
#
Lời giải:
5(a4#\c9#Kd'(#TiW1v#=#-#B7#TiW14#=#-1#R4#B!8^#IJ'(#iE52#TiW14#Ds#C!$#C<$#yi/#
=#/#B7#yi-#=#-^#Cằ'*#IJ'(#'(V#B!8#Că'*#$(;'(#*(<#y-#Kf'#yj#Dr#0#KV)9#9(|'1#2ă'*#
0#DE#FG'*#9?9#'*ă'#'(H#${#/-t#Kf'#/jt1#3'#D;>#g(<#$(ự9#(<J'#K4['#9(VL'*#$%&'(#
$%3'#$;#9_#'`<#F>'*#9?9#'*ă'#'(H#'(V#D;>h#
*ă'#'(H#Bd#$%@#/-t#9_#*<?#$%d#99t#
*ă'#'(H#Bd#$%@#//t#9_#*<?#$%d#,.t#
*ă'#'(H#Bd#$%@#/0t#9_#*<?#$%d#vFt#
*ă'#'(H#Bd#$%@#/jt#9_#*<?#$%d#wvt#
*ă'#'(H#Bd#$%@#/.t#9_#*<?#$%d#/0t#
#
2.6.5 Ngăn xếp trong 8051.
*ă'#qf"#I7#\`$#BW'*#C`#'(H#yQN#KV)9#STU#DE#FG'*#KX#IV>#$(Z'*#$<'#$[\#$(]<1#
5(Z'*#$<'#'78#9_#$(X#I7#Fự#I<J>^#9_#$(X#I7#Kd;#9e#STU#96'#g(Z'*#*<;'#IV>#$%+#'78#B&#Dr#

9?9#$(;'(#*(<#Cd#(['#9(f1#
2.6.6 Cách truy cập các ngăn xếp trong 8051.
f>#'*ă'#qf"#I7#\`$#BW'*#9A;#C`#'(H#yQN#$(&#"(M<#9_#9?9#$(;'(#*(<#$%4'*#STU#9(e#
Kf'#'_1#5(;'(#KV)9#FW'*#KX#9(e#Kf'#'*ă'#qf"#KV)9#*|<#I7#$(;'(#*(<#94'#$%z#'*ă'#
qf"#iT#ki$;9g#T4<'$a%n1#S4'#$%z#'*ă'#qf"#$%4'*#, /#9(e#%`'*#,#C<$#9_#'*(ĩ;#I7#'_#9(e#
9_#$(X#9_#$(X#KV)9#9?9#Kd;#9(e#${# #Kf'#FFt1#
K(<#, /#KV)9#9Y"#'*>ồ'#$(&#iT#9(=;#*<?#$%d#-j#9_#'*(ĩ;#I7#'*ă'#'(H#-,#9A;#yQN#I7#
'*ă'#'(H#K6>#$<3'#KV)9#FW'*#9(4#'*ă'#qf"#$%4'*#, /1#P<J9#IV>#I[<#\`$#$(;'(#*(<#
TSU#$%4'*#'*ă'#qf"#KV)9#*|<#I7#\`$#I6'#9Y$#B74#TUit#B7#B<J9#'["#'`<#F>'*#9A;#
'*ă'#qf"#$%ở#I[<#$(;'(#*(<#STU#KV)9#*|<#I7#IY8#%;#TOT1#t;8#'_<#9?9(#g(?9#I7#\`$#
$(;'(#*(<#KV)9#9Y$#B74#'*ă'#qf"#KX#IV>#9Y$#B7#KV)9#IY8#%;#${#'*ă'#qf"#KX#FW'*#$<f"#
9Z'*#B<J9#9A;#iT#I7#%Y$#'*(<3\#'*c$#\ỗ<#g(<#$(;4#$?9#9Y$#B74#kTUitn#B7#IY8#%;#kTOTn#
KV)9#$(ự9#$(<1#~X#C<f$#'*ă'#qf"#I7\#B<J9#'(V#$(f#'74#(u8#q}$#9?9#IJ'(#TUit#B7#TOT#
FVH<#Kâ81#
2.6.7 Cất thanh ghi vào ngăn xếp.
5%4'*#, /#$(&#94'#$%z#'*ă'#qf"#9(e#Kf'#'*ă'#'(H#DE#FG'*#9>r<#9W'*#9A;#'*ă'#qf"1#
K(<#$;#9Y$#F+#I<J>#B74#'*ă'#qf"#$(&#94'#$%z#'*ă'#qf"#iT#KV)9#$ă'*#I3'#/1# V>#b#%ằ'*#
K<p>#'78#Kr<#BH<#9?9#C`#B<#qE#Ib#g(?9#'(;>#I7#g(?9#'(;>^#K?'*#9(:#b#I7#9?9#C`#B<#qE#
Ib##,w#I7#iT#*<M\#q>r'*#g(<#9Y$#F+#I<J>#B74#'*ă'#qf"1#X}$#B@#FG#01,#FVH<#Kâ8^#$;#
$(Y8#%ằ'*#\ỗ<#g(<#IJ'(#TUit#KV)9#$(ự9#(<J'#$(&#'`<#F>'*#9A;#$(;'(#*(<#KV)9#9Y$#B74#
'*ă'#qf"#B7#iT#KV)9#$ă'*#I3'#/1# V>#b#I7#Kr<#BH<#\ỗ<#C8$a#9A;#F+#I<J>#KV)9#9Y$#B74#
'*ă'#qf"#$(&#iT#KV)9#$ă'*#I3'#/#I6'1#Sũ'*#IV>#b#%ằ'*#KX#9Y$#9?9#$(;'(#*(<#B74#'*ă'#
qf"#$;#"(M<#DE#FG'*#Kd;#9(e#yQN#9A;#9(:'*1#P@#FG#IJ'(#TUit#/#I7#9Y$#$(;'(#*(<#
y/#B74#'*ă'#qf"1#
Ví dụ 2.8:
tu8#C<X>#F<ễ'#'*ă'#qf"#B7#94'#$%z#'*ă'#qf"#Kr<#BH<#K4['#9(VL'*#$%&'(#D;>#Kâ81#G<M#
$(<f$#BW'*#'*ă'#qf"#I7#\c9#Kd'(1#
MOV R6, #25H
MOV R1, #12H
MOV R4, #0F3H

PUSH 6
PUSH 1
PUSH 4
#
Lời giải:

Sau PUSH 6 Sau PUSP 1 Sau PUSH 4
0B

0B 0B 0B
0A

0A 0A 0A F3
09

09 09 12 09 12
08

08 25 08 25 08 25
Bắt đầu SP = 07 SP = 08 SP = 09 SP = 0A

2.6.8 Lấy nôi dung thanh ghi ra từ ngăn xếp.
P<J9#IY8#'`<#F>'*#%;#${#'*ă'#qf"#$%ở#I;<#$(;'(#*(<#Ku#9(4#I7#q:;#$%&'(#'*V)9#BH<#9?9#
'`<#F>'*#$(;'(#*(<#B74#'*ă'#qf"1#PH<#\ỗ<#I6'#IY8#%;#$(&#C8$a#$%3'#Ke'(#'*ă'#qf"#
KV)9#D;4#9(}"#B74#$(;'(#*(<#KV)9#q?9#Kd'(#Cở<#IJ'(#B7#94'#$%z#'*ă'#qf"#KV)9#*<M\#
q>r'*#/1#P@#FG#019#\<'(#(4[#IJ'(#IY8#'`<#F>'*#%;#g(z<#'*ă'#qf"1#
Ví dụ 2.9:
K(M4#D?$#'*ă'#qf"#B7#(u8#$%&'(#C78#'`<#F>'*#9A;#9?9#$(;'(#*(<#B7#iT#D;>#g(<#$(ự9#
(<J'#K4['#9(VL'*#$%&'(#D;>#Kâ8h#
POP 3 ; Lấy ngăn xếp trở lại R3

POP 5 ; Lấy ngăn xếp trở lại R5
POP 2 ; Lấy ngăn xếp trở lại R2
#
Lời giải:

Sau POP3 Sau POP 5 Sau POP 2
0B 54

0B 0B 0B
0A F9

0A F9 0A 0A
09 76

09 76 09 76 09
08 6C

08 6C 08 6C 08 6C
Bắt đầu SP = 0B SP = 0A SP = 09 SP = 08
#
2.6.9 Giới hạn trên của ngăn xếp.
(V#Ku#'_<#ở#$%3'^#9?9#'*ă'#'(H#-,#Kf'#/Ft#9A;#yQN#$%4'*#, /#9_#$(X#KV)9#FW'*#
I7\#'*ă'#'(H#0-t#Kf'#0Ft#9A;#yQN#KV)9#Fự#"(ò'*#9(4#C`#'(H#K?'(#Kd;#9(e#KV)9#
$(a4#C<$#B7#g(Z'*#$(X#FW'*#$%VH9#9(4#'*ă'#qf"1#f>#$%4'*#\`$#9(VL'*#$%&'(#Ku#9(4#
$;#96'#'*ă'#qf"#'(<p>#(L'#04#C8$a#k-,#Kf'#/Ft#=#04#C8$an#$(&#$;#9_#$(X#Kổ<#iT#9(e#
Kf'#9?9#'*ă'#'(H#v-#Kf'#jFt1#~<p>#'78#KV)9#$(ự9#(<X'#Cở<#Iẹ'(#NOP#iT^##XX1#
2.6.10 Lệnh gọi CALL và ngăn xếp.
*47<#B<J9#DE#FG'*#'*ă'#qf"#KX#IV>#9Y$#9?9#$(;'(#*(<#$(&#STU#9ũ'*#DE#FG'*#'*ă'#
qf"#KX#IV>#9Y$#$;\#$(]<#Kd;#9(e#9A;#IJ'(#K='*#'*;8#FVH<#IJ'(#SQ 1#~<p>#'78#9(@'(#
I7#KX#TSU#C<f$#9(ỗ#'74#KX#q>;8#$%ở#Bp#$(ự9#(<J'#$<f"#9?9#IJ'(#D;>#g(<#9(|'#9(VL'*#

$%&'(#94'1#S(<#$<f$#Bp#IJ'(#*|<#SQ #KV)9#$%&'(#Co#ở#9(VL'*#v1#
2.6.11 Xung đột ngăn xếp và băng thanh ghi số 1.
(V#$;#K;#'_<#ở#$%3'#$(&#$(;'(#*(<#94'#$%z#'*ă'#qf"#9_#$(X#9(e#Kf'#Bd#$%@#yQN#(<J'#
$(]<#F7'(#9(4#'*ă'#qf"1#K(<#F+#I<J>#KV)9#IV>#9Y$#974#'*ă'#qf"#$(&#iT#KV)9#$ă'*#I3'#
B7#'*V)9#I[<#g(<#F+#I<J>#KV)9#IY8#%;#${#'*ă'#qf"#$(&#iT#*<M\#q>r'*1# b#F4#I7#Ti#KV)9#
$ă'*#I3'#D;>#g(<#TUit#I7#"(M<#C<f$#IY8#9(ắ9#9(ắ'#%ằ'*#'*ă'#qf"#K;'*#$ă'*#I3'#Kf'#Bd#
$%@#'*ă'#'(H#jFt#9A;#yQN#${#Kd;#9(e#$(Y"#'(Y$#Kf'#Kd;#9(e#9;4#'(Y$1#f>#94'#$%z#
'*ă'#qf"#Ku#KV)9#*<M\#D;>#9?9#IJ'(#TUit#$(&#$;#'3'#DE#FG'*#9?9#'*ă'#'(H#j^#w^#.#
B1B111#9A;#yQN#$(>`9#9?9#$(;'(#*(<#yj#Kf'#y-#9A;#Că'*#-^#Că'*#$(;'(#*(<#\c9#Kd'(1#
P<J9#$ă'*#'78#9A;#94'#$%z#'*ă'#qf"#Kr<#BH<#9?9#IJ'(#TUit#9ũ'*#KM\#CM4#%ằ'*#'*ă'#
qf"#Ds#g(Z'*#BH<#$H<#'*ă'#'(H#-#9A;#yQN#kK?8#9A;#yQNn#B7#F4#B!8#Ds#'(M8#%;#g(z<#
g(Z'*#*<;'#F7'(#9(4#'*ă'#qf"1#5>8#'(<3'#9_#BY'#Kp#'M8#D<'(#BH<#$(<f$#I!"#\c9#Kd'(#
9A;#'*ă'#qf"1#P@#FG#iT#=#-j#g(<#, /#KV)9#C!$#'*>ồ'#'3'#yQN#B7#9ũ'*#$(>`9#Bp#
$(;'(#*(<#y-#9A#Că'*#$(;'(#*(<#Dr#/1#t;8#'_<#9?9(#g(?9#Că'*#$(;'(#*(<#Dr#/#B7#'*ă'#
qf"#K;'*#FW'*#9(>'*#\`$#g(Z'*#*<;'#9A;#C`#'(H#yQN1#f>#9(VL'*#$%&'(#Ku#9(4#
96'#DE#FG'*#9?9#Că'*#$(;'(#*(<#Dr#/#B7#Dr#0#$;#9_#$(X#Kc$#I[<#BW'*#'(H#yQN#9(4#
'*ă'#qf"1#P@#FG^#$;#9_#$(X#9Y"#Bd#$%@#'*ă'#'(H#w-t#9A;#yQN#B7#9;4#(L'#9(4#'*ă'#
qf"#$%4'*#B@#FG#01/-1#
Ví dụ 2.10:
2<X>#F<ễ'#'*ă'#qf"#B7#94'#$%z#'*ă'#qf"#Kr<#BH<#9?9#IJ'(#D;>h#
MOV SP, #5FH ; Đặt ngăn nhớ từ 60H của RAM cho ngăn xếp
MOV R2, #25H
MOV R1, #12H
MOV R4, #0F3H
PUSH 2
PUSH 1
TUit#4#
Lêi gi¶i:

Sau PUSH 2 Sau PUSP 3 Sau PUSH 4

63

63 63 63
62

62 62 62 F3
61

61 61 12 61 12
60

60 25 60 25 60 25
B¾t ®ÇuSP=5F SP = 60 SP = 61 SP = 62
#
#
#
#
ĐHQG – HN CNTT Ngôn ngữ máy ASSEMBLY

1
Các ngắt của hệ thống hỗ trợ cho lập trình ASSSEMBLY
Có 4 hàm hay dùng nhất:
Hàm 1: Chờ 1 ký tự từ bàn phím:
Mov ah, 1 ;AL chứa mã ASCII ký tự mã vào
Int 21h
Hàm 2: Đưa 1 ký tự dạng ASCII ra màn hình tại vị trí con trỏ
đang đứng
Cách 1: Nhờ ngắt của BIOS
Mov al, mã ASCII của ký tự
Mov ah, oeh

Int 10h
Cách 2:
Mov dl, mã ASCII của ký tự
Mov ah, 2
Int 21h
Hàm 3: Hiện 1 xâu ký tự kết thúc bằng dấu $ ra màn hình
Mov dx, offset tên biến xâu
Mov ah, 9
Int 21h
Hàm 4: Trở về DOS
Mov ah, 4ch ;[int 20h]
Int 21h
Các DIRECTIVE điều khiển SEGMENT dạng đơn giản: dễ viết, dễ
liên kết nhưng ch
ưa bao hết mọi tình huống về điều khiển SEGMENT
.Model thuê vùng nhớ RAM thích hợp cho chương trình
.Model kiểu_tiny code+data≤64KB
.Model kiểu_small code≤64KB;data≤64KB
.Model kiểu_compact code≤64KB;data≥64KB
.Model kiểu_medium code≥64KB;data≤64KB
.Model kiểu_large code≥64KB;data≥64KB song khi khai báo1 array
không ≤64KB
.Model kiểu_large code≥64KB;data≥64KB song khi khai báo1 array
không >64KB
.Stack Độ lớn (Byte) → Xác lập độ lớn stack cho chương trình
.Data Xác lập vùng nhớ cho dữ liệu của chương trình khai báo
biến nằm ở segment này
.Data Khai báo biến (có 3 loại biến)
Với các loại biến số thì kiểu db có độ dài 1 byte
dw có độ dài 2 byte

dd có độ dài 4 byte
dp/df có độ dài 6 byte
dq có độ dài 8 byte
dt có độ dài 10 byte
Với các loại biến xâu có các cách khai báo như sau:
tên_biến_xâu db ‘các ký tự’
tên_biến_xâu db độ_lớn dup(‘1 ký tự’)
tên_biến_xâu db độ_lớn dup(?)
Với các loại biến trường số (array) có các cách khai báo như sau:
tên_biến_trường kiểu_thành_phần (các số cách nhau bởi dấu ,)
tên_biến_trường kiểu_thành_phần độ_lớn dup(giá trị 1 số)
tên_biến_trường kiểu_thành_phần độ_lớn dup(?)
.Code Xác lập vùng nhớ truy xuất ngẫu nhiên dùng cho phần mã máy
.Code
nhãn_chương_trình:
mov ax, @data
mov ds, ax

thân chương trình

mov ah, 4ch
int 21h
[các chương trình con]
end nhãn_chương_trình
Các DIRECTIVE điều khiển SEGMENT dạng chuẩn: _SEGMENT;
_GROUP; _ASSUME
_SEGMENT Xác lập các segment cho chương trình
tên_segment SEGMENT align combine use ‘class’
{thân segment}
tên_segment ENDS

trong đó:
tên_segment là 1 identifier (không chứa dấu cách, dấu \ ; : )
align là cách xác lập khoảng cách giữa segment đang khai báo với
segment trước nó
align
byte khoảng cách 1 byte
word khoảng cách 2 byte
paka kho
ảng cách 16 byte
page khoảng cách 256 byte
combine có hai chức năng:
+cho phép đặt segment vào 1 địa chỉ mong muốn (theo yêu cầu) của
bộ nhớ RAM
tên_segment SEGMENT at địa_chỉ_dạng_vật_lý
{thân}
tên_segment ENDS
+cho chương trình đa tệp: cách gộp các segment có cùng tên nằm ở
các tệp khác nhau khi liên kết. Ví dụ: Tệp 1 có DATA SEGMENT; Tệp 2
có DATA SEGMENT.khác
_COMMON tức là độ dài của segment sau liên kết bằng độ dài
segment lớn nhất
_PUBLIC tức là độ dài của segment sau liên kết bằng tổng độ dài cả
2 segment
_PRIVATE tức là độ dài của segment sau liên kết bằng độ dài của
chính nó (không quan hệ với nhau, đây là chế độ default)
_STACK giống như _PUBLIC
_CLASS sắp xếp các segment lại gần nhau sau khi liên kết
(Sau khi liên kết thì những segment nào cùng một nhóm thì ở gần
nhau)
_GROUP gộp các segment có cùng kiểu lại với nhau cho dễ dàng qui

chiếu
tên_ nhóm GROUP tên_các_segment (cách nhau bởi dấu , )
_ASSUME cho biết tên segment thuộc loại segment nào
_ASSUME tên_thanh_ghi SEG : tên_seg
Cấu trúc một chương trình Assembly thường thấy: Khai báo
MACRO, STRUCT, UNION, RECORD, SEGMENT
Dạng đơn giản
.Model kiểu
.Stack độ lớn
[.Data
khai báo biến]
.Code
nhãn_chương_trình:
mov ax, @data
mov ds, ax

thân chương trình

mov ah, 4ch
int 21h
[các chương trình con]
END nhãn_chương_trình

Dạng chuẩn
_Stack segment
db độ_dài dup(?)
_Stack ends
Data segment
khai báo biến
Data ends

Code segment
Assume cs:code ds:data ss:stack nhãn_chương_trình:
mov ax, data
mov ds, ax

thân chương trình

mov ah, 4ch
int 21h
[các chương trình con]
ENDS
END nhãn_chương_trình
*Chương trình con:
1, Cơ chế khi 1 chương trình con bị gọi:
Bước 1: Tham số thực đưa vào STACK
Bước 2: Địa chỉ của lệnh tiếp theo được đưa vào STACK
Bước 3: Hệ điều hành quản lý địa chỉ đầu của chương trình con do vậy
Hệ điều hành sẽ đưa địa chỉ đó vào CS:IP → rẽ nhánh vào chương trình
con
Bước 4: Thực hiện thân chương trình con cho đến khi gặp lệnh RET thì
vào STACK lấy địa chỉ lệnh tiếp theo (đã cất ở Bước 2) và cho vào
CS:IP, rồi quay về chương trình đã gọi nó
Bước 5: Tiếp tục thực hiện chương trình đang đợi
2, Cú pháp của chương trình con Assembly:
Tên_chương_trình_con PROC [NEAR/FAR]
Bảo vệ các thanh ghi sẽ bị phá vỡ ở thân chương trình
Thân chương trình con
Hồi phục các thanh ghi mà chương trình con phá vỡ
RET
Tên_chương_trình_con ENDP

a, Vấn đề NEAR – FAR:
ĐHQG – HN CNTT Ngôn ngữ máy ASSEMBLY

2
NEAR chương trình con cùng nằm trên 1 segment với chương trình gọi
nó → địa chỉ lệnh tiếp theo cất vào STACK (Bước 2) chỉ cần 2 byte
offset
FAR chương trình con nằm khác segment với chương trình con gọi nó
→ địa chỉ lệnh tiếp theo cất vào STACK (Bước 2) cần đến 4 byte offset
* Với khai báo segment dạng đơn giản thì directive model sẽ xác định
hiện chương trình con NEAR hay FAR
. Model tiny → chương trình con là NEAR
. Model small → chương trình con là NEAR
. Model compact → chương trình con là NEAR
. Model medium → chương trình con là FAR
. Model large → chương trình con là FAR
. Model huge → chương trình con là FAR
* Với khai báo dạng chuẩn thì mặc định là NEAR
b, Chương trình con Assembly không có đối số → cơ chế kích
hoạt chương trình con Assembly không có Bước 1
3, Chuyển giao tham số:
Cách 1: Nhờ thanh ghi
Chương_trình_chính Chương_trình_con

mov ax, 10 mov bx, ax
call Chương_trình_con

(khi đó bx = 10)
Cách 2: Nhờ biến nhớ
Chương_trình_chính Chương_trình_con


mov value, 20 mov bx, value
call Chương_trình_con

(khi đó bx = 20)
Cách 3: Thông qua STACK (dùng khi liên kết với ngôn ngữ lập trình
bậc cao)
4, Bảo vệ thanh ghi:
Khi thân chương trình con sử dụng các lệnh làm giá trị thanh ghi thay
đổi như and, xor, thì phải bảo vệ các thanh ghi đó trước khi dùng
Cách 1: Dùng các lệnh POP, PUSH
Cách 2: Chuyển vào biến hoặc thanh ghi khác sau đó hồi phục
Tệp include
Tệp INCLUDE cho phép người lập trình viết gọn chương trình
- Thiết lập 1 tệp ngoài (gọi là tệp INCLUDE) mà trong tệp này chứa
khối lệnh Assembly .ASM
- Sau đó dùng lệnh INCLUDE để chèn khối lệnh đó vào tệp chương
trình đang viết. Cú pháp:

INCULDE X:\đường dẫn\tệp INCLUDE

- Cơ chế của chương trình dịch Assembly khi gặp INCLUDE: chương
trình dịch của Tubor Assember khi gặp INCLUDE thì thực hiện các
bước:
* Mở tệp INCLUDE theo sau Directive Include
* Sao chép và chèn toàn bộ khối lệnh Assembly có trong tệp INCLUDE
vào vị trí Directive Include đứng
* Tiến hành dịch khối lệnh đó
- Cách tìm tệp INCLUDE để chèn
* Nếu tệp đứng sau Directive Include có tên đĩa, đường dẫn thì chương

trình dịch tìm đến, nếu không có thì đó là thư mục hiện hành, còn nếu
không có nữa thì sai
* Nếu sai thì chỉ có cách sửa lại chương trình nguồn. Khi dịch chương
trình dùng thêm tham số TASM -i A:\ \*.ASM
- Hạn chế của INCLUDE là không được phép có nhãn nhảy trong khối
lệnh của tệp INCLUDE khi gọi nó 2 lần
macro và các vấn đề liên quan
1, Các lệnh lặp khối lệnh khi dịch chương trình:
REPT dịch khối lệnh theo số lần đi sau REPT
REPT n
Khối_lệnh
ENDM
IRP dịch khối lệnh theo số lượng danh sách
IRP tên_đối <danh sách>
Khối_lệnh
ENDM
- Các Directive điều khiển điều kiện khi dịch chương trình
Chức năng: Dịch khối lệnh khi điều kiện đúng TRUE
IF <điều kiện> IF <điều kiện>
Khối_lệnh Khối_lệnh_1
ENDIF ELSE Khối_lệnh_2
ENDIF
Lệnh IFE giống như lệnh IF nhưng ngược điều kiện
Chức năng: Dịch khối lệnh khi biểu thức <điều kiện> = 0
IFB <biểu thức>
Khối_lệnh
ENDIF
Lệnh IFNB giống như lệnh IFB nhưng ngược điều kiện
Chức năng: Dịch khối lệnh khi <biểu thức 1> = <biểu thức 2>
IFIDN <biểu thức 1>, <biểu thức 2>

Khối_lệnh
ENDIF
Lệnh IFDIF giống như lệnh IFIDN nhưng ngược điều kiện
Chức năng: Dịch khối lệnh khi nhãn theo sau đó đã được khai báo
IFDEF nhãn
Khối_lệnh
ENDIF
Lệnh IFNDEF giống như lệnh IFDEF nhưng ngược điều kiện
*Macro là 1 cơ chế giúp người lập trình tạo 1 lệnh mới trên cơ sở tập
lệnh sẵn có của Assembly
- Trước khi được dùng thì phải khai báo
Cú pháp:
Tên_Macro MACRO[đối]
Bảo vệ các thanh ghi sẽ bị phá vỡ ở thân chương trình
Thân MACRO
Hồi phục các thanh ghi mà chương trình con phá vỡ
ENDM
- Cách dùng lệnh mới đã xác lập ở MACRO: Sau khi macro đã được xác
lập thì tên của Macro trỏ thành một lệnh mới của ASM
- Cách dùng: Gọi tên macro và thay vì đối sẽ là tham số thực
Chương trình Macro hiện xâu ra màn hình:
HIENSTRING MACRO XAU
Push ax, bx
Lea dx, XAU
Mov ah, 9
Int 21h
Pop dx, ax
ENDM
Chương trình Macro xóa màn hình:
CLRSCR MACRO

Push ax
Mov ah, 0fh
Int 10h
Mov ah, 0
Int 10h
Pop ax
ENDM
tính ưu việt của macro
a, So sánh Macro với chương trình con:
Tốc độ: Khi chạy chương trình thì Macro nhanh hơn vì không phải dùng
lệnh CALL và RET
Tiết kiệm bộ nhớ: Chương trình con chiếm ít bộ nhớ hơn
Macro cho phép chuyển giao tham số thông qua đối và cho phép sử
dụng các Directive lặp khidịch chương trình. Các Directive điều khiển
điều kiện khi dịch chương trình.
b, So sánh Macro với tệp INCLUDE:
Cơ chế: Giống nhau khi dịch
Tốc độ: Khi chạy chương trình thì Macro nhanh hơn vì không phải mở
đóng tệp
Macro cho phép có nhãn nhảy trong lệnh của Macro nhờ Directive
Local. Trong thân Macro cho phép có các Macro khác
Chương trình dạng *.com và *.exe
Chương trình .EXE có 3 segment {code, data và stack}. Có thể không
cùng nằm trên 1 segment
Chương trình .COM có 3 segment {code, data và stack} nằm cùng
trên 1 segment. Khi chạy chương trình .COM cần 256 byte đầu của
segment đó để nhảy. Do vậy, lệnh đầu của chương trình .COM sẽ đặt ở
offset → người lập trình phải khai báo cho hệ điều hành Directive ORG
Khai báo chương trình dạng .COM có 1 segment và là Code Segment →
biến cũng được khai báo ở Code Segment

.Code
Nhãn_chương trình:
Jmp nhãn_khác
[nếu có khai báo biến]
Khai báo biến
Nhãn_khác:

mov ah, 4ch
int 21h
Dạng thường thấy của chương trình .COM thuần túy [Khai báo
MACRO, STACK, UNION, RECORD]
Dạng đơn giản Dạng chuẩn
.Model tiny .Code segment
(hoặc small) ORG 100h
ĐHQG – HN CNTT Ngôn ngữ máy ASSEMBLY

3
.Code assume cs:code,ds:code,ss:code
ORG 100h Nhãn_chương_trình:
Nhãn_chương_trình: Jmp nhãn_khác
Jmp nhãn_khác Khai báo biến
Khai báo biến Nhãn_khác:
Nhãn_khác:
int 20h
int 20h [các chương trình con]
[các chương trình con] code ends
END nhãn_chương_trình END nhãn_chương_trình
Directive public
Chức năng: Báo cho chương trình dịch biết những nhãn ở Model này
cho phép các tệp khác cũng có thể dùng

Cú pháp: Public tên_nhãn
Khai báo kiểu nhãn
.Với hằng: Public tên_hằng = hằng
Public Port
Port = 038h
.Với biến: Public tên_biến
Khai báo biến
.Với tên chương trình con:
Public tên_chương_trình_con
tên_chương_trình_con PROC

RET
tên_chương_trình_con ENDP
Directive public
Chức năng: Báo cho chương trình dịch biết Module này xin phép được
dùng các nhãn mà các Module khác đã cho phép
Cú pháp: Extrn tên_nhãn: kiểu
.Nhãn là tên hằng: Extrn tên_nhãn: ABS
Extrn Post kiểu
.Nhãn là biến nhớ: Extrn x: word (hoặc byte hoặc dword)
.Nhãn là chương trình con:
Extrn tên_chương_trình_con:PROC

Directive global
Chức năng: Không phải chương trình nào cũng có Directive này, nó
thay cho Public và Extrn
Cú pháp: GLOBAL tên_nhãn: kiểu
Khai báo biến
Liên kết C với Assembly
INLINE ASM là chèn khối lệnh ASM vào chương trình được viết bằng

C
Cú pháp: khối lệnh C
ASM lệnh ASM

ASM lệnh ASM
khối lệnh C
Dịch và liên kết
TCC -ms :IC\TC\INCLUDE -LC
Hạn chế: Các lệnh ASM được chèn thì dịch nhờ bởi chương trình dịch
của TC. Do đó 1 số lệnh khó của ASM dịch không đúng. Không cho
phép có các nhãn nhảy trong ASM → khối lệnh chèn vào yếu (vì không
có LOOP, nhảy có và không có điều kiện)
Viết tách biệt tệp cho c và tệp cho asm
Phải giải quyết 3 vấn đề:
1, Vấn đề đa tệp: (khai báo Public) với Module của C, bất kỳ khai báo
nào của C đều là khai báo Public. Khai báo External ngôn ngữ C phải
xin phép dùng các nhãn đã cho phép từ tệp ngoài. Với Module ASM
giống như đa tệp thuần túy
2, Vấn đề dấu (-) (underscore) người viết chương trình ASM phải
thêm dấu – vào trước trên các nhãn dùng chung với C và thêm ở mọi
nơi mà tên đó xuất hiện
3, Vấn đề giá trị quay về của hàm ASM: qui định với giá trị 2 byte
thì trước khi RET ax = bao nhiêu thì tên hàm ASM có giá trị bấy nhiêu.
Với giá trị 4 byte trước khi RET dx:ax có giá trị bao nhiêu thì hàm ASM
có giá trị bấy nhiêu
cơ chế khi một ngắt và chương trình con được kích hoạt
Chương trình con bình thường:
CALL
Bước 1: Tham số thực → STACK
Bước 2: Địa chỉ lệnh tiếp theo → STACK

Bước 3: Hệ điều hành quản lý địa chỉ đầu của chương trình con → Hệ
điều hành đưa địa chỉ đầu của chương trình con → cs:ip → rẽ nhánh
vào chương trình con
Bước 4: Thực hiện các lệnh của chương trình con → RET thì vào
STACK lấy địa chỉ lệnh tiếp theo (đã cất ở bước 2) → cs:ip và trở về
chương trình đang dở
Bước 5: Tiếp tục chương trình đang dở
Chương trình con phục vụ ngắt:
Int n (tác động linh kiện)
Bước 1: Flag → STACK;Tham số thực → STACK
Bước 2: Địa chỉ lệnh tiếp theo → STACK
Bước 3: Hệ điều hành quản lý địa chỉ đầu của chương trình con phục
vụ ngắt. Song địa chỉ đầu của chương trình con phục vụ ngắt nằm
trong ô nhớ tương ứng của bảng vectơ ngắt → máy tính vào vectơ ngắt
lấy địa chỉ đầu của chương trình con phục vụ ngắt đưa vào cs:ip → rẽ
nhánh vào chương trình con phục vụ ngắt
Bước 4: Thực hiện các lệnh của chương trình con cho đến khi gặp
IRET thì vào STACK lấy địa chỉ lệnh tiếp theo (đã cất ở bước 2) → cs:ip
và trở về chương trình đang dở
Bước 5: Trước khi tiếp tục chương trình đang dở thì vào STACK lấy cờ
đã cất
Bảng vectơ ngắt: là vùng nhớ RAM chứa địa chỉ đầu của chương trình
con phục vụ ngắt. Máy tính có 256 ngắt → có 256 chương trình con
phục vụ ngắt. Địa chỉ ô bằng n * 4 (mỗi địa chỉ 4 byte)
Các bước để xác lập chương trình con phục vụ ngắt:
Bước 1: Viết chương trình con theo yêu cầu của thuật toán
Cú pháp: Tên_chtrình_con_pvụ_ngắt PROC [NEAR/FAR]
Bảo vệ các thanh ghi
Thân chương trình
Phục hồi các thanh ghi

IRET
Tên_chtrình_con_pvụ_ngắt ENDP
Bước 2: Sau khi viết xong chương trình con phục vụ ngắt thì tìm địa
chỉ đầu của chương trình này đưa vào vị trí tương ứng của bảng vectơ
ngắt
Khởi động máy tính với hệ điều hành DOS
Với máy tính của INTEL, khi bật máy thì thanh ghi CS = F000h; IP =
FFF0h và sẽ nhảy vào thực hiện lệnh ở ô nhớ F000:FFF0. Lệnh này là
lệnh jmp và nó nhảy đến chương trình khởi động máy tính đều nằm ở
ROM-BIOS
ROM-BIOS là vùng nhớ chỉ đọc, không ghi được và chứa 2 loại chương
trình khởi động máy và chương trình phục vụ ngắt của BIOS
Các chương trình khởi động máy tính:
Test CPU: kiểm tra các thanh ghi. Tống vào các giá trị 00, 55 và FF vào
các thanh ghi và kiểm tra lại có bằng 00, 55 và FF không. Đồng thời
kiểm tra một số lệnh ASM nếu có lỗi thì hiện FATA ERROR.
Kiểm tra ROM-BIOS: trong ROM có 1 byte CHECKSUM (tổng các byte
của ROM) khi khởi động thì có 1 chương trình cộng các byte của ROM
lại lưu kết quả vào 1 byte và so sánh byte này với CHECKSUM. Nếu
bằng nhau thì tức là ROM tốt, ngược lại là tồi.
Kiểm tra một số linh kiện quan trọng của mainboard
8259 là chip phục vụ ngắt
8250 UART (COM)
8253 Timer
8237 DMA
Kiểm tra RAM (giống hệt CPU và thanh ghi) tức là cho toàn bộ các byte
của RAM các giá trị 00, 55, FF liệu RAM có chấp nhận các giá trị này
không
Xác lập bảng vec tơ ngắt của BIOS
Đưa mọi địa chỉ đầu của các chương trình con phục vụ ngắt vào bảng

vec tơ ngắt
Đưa các thông số máy tính đang dùng vào vùng nhớ biến BIOS
Kiểm tra liệu có ROM mở rộng: với màn hình và ổ đĩa thì về phần cứng
cho các Card điều khiển không giống nhau → không thể viết 1 driver
chung và nạp vào ROM-BIOS chuẩn → thỏa hiệp của các hãng: Ai sản
xuất phần cứng thì viết driver cho nó và nạp vào ROM và ROM đó sẽ
được đặt trên Card đó
Int 19h: Lôi boot sector xuống RAM và trao quyền cho chương trình
nằm trong boot sector
Trong boot sector là sector 512 byte chứa tham số đĩa và chứa chương
trình mồi
Chương trình mồi lôi 2 tệp ẩn xuống RAM (hệ điều hành DOS)
Kiểm tra thiết bị ngoại vi
Lôi COMMAND.COM vào vùng nhớ RAM – là chương trình dịch các lệnh
của DOS → Mã máy
CONFIG.SYS
AUTOEXEC.BAT
C:\>










ĐHQG – HN CNTT Ngôn ngữ máy ASSEMBLY


4






Bài tập 1:
Hiện 1 xâu ký tự “Hello TASM!” ra màn hình
Cách 1:
.MODEL small
.STACK 100h
.DATA
Message db ‘Hello TASM!$’
.CODE
ProgramStart:
Mov AX,@DATA
Mov DS,AX
Mov DX,OFFSET Message
Mov AH,9
Int 21h
Mov AH,4Ch
Int 21h
END ProgramStart
Cách 2:
_STACK segment stack ‘stack’
db 100h dup(?)
_STACK ends
DATA segment
Message db ‘Hello TASM!’,0

DATA ends
CODE segment
Assume CS:CODE, DS:DATA, SS:_STACK
ProgramStart:
Mov AX,DATA
Mov DS,AX
Mov SL,OFFSET Message
cld
L1:
Lodsb
And AL,AL
Jz Stop
Mov AH,0eh
Int 10h
Jmp L1
Stop:
Mov AH,1
Int 21h
Mov AH,4Ch
Int 21h
CODE ends
END ProgramStart
Bài tập 2:
So sánh 2 số nguyên nhập từ bàn phím xem số nào bé hơn
Cách 1:
include C:\HTDAT\INCLUDE\lib1.asm
_stack segment stack 'stack'
db 100h dup(?)
_stack ends
data segment

m1 db 10,13,'Vao so thu nhat:$'
m2 db 10,13,'Vao so thu hai:$'
m3 db 10,13,'So be la:$'
m4 db 10,13,'Co tiep tuc khong (c/k)?:$'
data ends
code segment
assume cs:code,ds:data,ss:_stack
ps:
mov ax,data
mov ds,ax
clrscr
hienstring m1
call Vao_so_N
mov bx,ax
hienstring m2
call Vao_so_N
cmp ax,bx
jl L1
xchg ax,bx
L1:
hienstring m3
call Hien_so_N
hienstring m4
mov ah,1
int 21h
cmp al,'c'
je ps
mov ah,4ch
int 21h
include C:\HTDAT\INCLUDE\lib2.asm

code ends
end ps
So sánh 2 số nhập vào từ bàn phím xem số nào bé hơn
Cách 2:
hien_string MACRO xau
push ax dx
mov dx,offset xau
mov ah,9
int 21h
pop dx ax
ENDM
;
.model small
.stack 100h
.data
sohex dw ?
temp dw ?
m1 db 0ah,0dh,'Vao so thu1: $'
m2 db 0ah,0dh,'Vao so thu2: $'
m3 db 0ah,0dh,'So be la: $'
.code
ps:
mov ax,@data
mov ds,ax
hien_string m1
call VAOSO
mov ax,sohex
mov temp,ax
hien_string m2
call VAOSO

mov bx,sohex
hien_string m3
cmp ax,bx
jl L1
xchg ax,bx
L1:
call HIENSO
mov ah,1
int 21h
mov ah,4ch
int 21h
;
VAOSO PROC
push ax bx cx dx
mov bx,10
xor cx,cx
mov sohex,cx
VS1:
mov ah,1 ; Ham nhan 1 ki tu va >al
int 21h
cmp al,0dh
je VS2
sub al,30h
mov cl,al
mov ax,sohex
mul bx
add ax,cx
mov sohex,ax
jmp VS1
VS2:

pop dx cx bx ax
ret
VAOSO ENDP
;
HIENSO PROC
push ax bx cx dx
mov bx,10
xor cx,cx
HS1:
xor dx,dx
div bx ; tuc lay dx:ax chia cho bx kq thuong >ax va du >dx
ĐHQG – HN CNTT Ngôn ngữ máy ASSEMBLY

5
add dx,30h ; de dua ra dang ASCCI
push dx ; tong 1 chu vao stack
inc cx
cmp ax,0
jnz HS1
HS2:
pop ax
mov ah,0eh
int 10h
loop HS2
pop dx cx bx ax
ret
HIENSO ENDP
end ps
Bài tập 3:
Tính trung bình cộng 2 só nguyên nhập từ bàn phím

INCLUDE C:\INCLUDE\LIB1.ASM
_STACK segment
db 100h dup(?)
_STACK ends
DATA segment
M1 db ‘Hay vao so thu 1: $’
M2 db 0ah,0dh,‘Hay vao so thu 2: $’
M3 db 0ah,0dh,‘Trung binh cong cua 2 so nguyen la: $’
M4 db ‘-$’
M5 db ‘.5$’
M6 db 0ah,0dh,’ Co tiep tuc khong (c/k) ?: $’
DATA ends
CODE segment
assume cs:code,ds:data,ss:_stack
ps:
mov ax,data
mov ds,ax
clrscr
HienString M1
call VAO_SO_N
mov bx,ax
HienString M2
call VAO_SO_N
HienString M3
Add ax,bx
And ax,ax
Jns L1
HienString M4
Neg ax
L1:

Shr ax,1
Pushf
Call HIEN_SO_N
Popf
Inc L2
HienString M5
L2:
HienString M6
Mov ah,1
Int 21h
Cmp al,’c’
Je TT
Mov ah,4ch
Int 21h
TT:
Jmp ps
INCLUDE C:\INCLUDE\LIB2.ASM
CODE ends
END ps
Bài tập 4:
Nhập một số nguyên dương n từ bàn phím và tìm giai thừa của

Cách 1:
include C:\HTDAT\INCLUDE\lib1.asm
_stack segment stack 'stack'
db 100h dup(?)
_stack ends
data segment
fv dw ?
fac dw ?

m1 db 10,13,'Vao so n:$'
m2 db 10,13,'Giai thua cua $'
m3 db ' la:$'
m4 db 10,13,'Co tiep tuc khong(c/k)?: '
data ends
code segment
assume cs:code,ds:data,ss:_stack
ps:
mov ax,data
mov ds,ax
clrscr
hienstring m1
call vao_so_N
hienstring m2
call Hien_so_N
hienstring m3
call S_N_T
mov ax,fv
call hien_so_N
hienstring m4
mov ah,1
int 21h
cmp al,'c'
je ps
mov ah,4ch
int 21h
include C:\HTDAT\INCLUDE\lib3.asm
include C:\HTDAT\INCLUDE\lib2.asm
code ends
end ps

Chương trình tính giai thừa của một số n nhập từ bàn phím
Cách 2:
code segment
assume cs:code,ds:code
org 100h
start: jmp do
msg1 db 'nhap vao mot so:$'
msg2 db 'ket qua la:$'
giaithua dw 1
so dw 0
m db 'ok $'
do :
mov ah,09h
mov dx,offset msg1
int 21h
call nhapso
call cr_lf
mov bx,1
mov cx,ax
lap:
mov ax,giaithua
mul bx
inc bx
mov giaithua,ax
loop lap
mov ax,giaithua
push ax
push dx
mov ah,09h
mov dx,offset msg2

int 21h
pop dx
pop ax
call inra
mov ah,01h
int 21h
int 20h
;
cr_lf proc near
push ax
push dx
mov ah,02h
mov dx,0dh
int 21h
mov dx,0ah
int 21h
pop dx
pop ax
ret
cr_lf endp
;
nhapso proc near
push dx
push cx

×