Chuang 4: Lap winh bing hop ngit 435
co sa cée doan, nhung néu sit dung todn tir gid STARTUP cua
assembler sé tiét kiém hon.
Todn tr gia EXIT thye hién tré vé he diéu hanh (dau nhac eta hé
digu hanh), va c6 ct phap diy dit 1a:
EXIT [value]
Gid tri value tra vé bing 0 néu khong c6 164i trong chuong trinh,
va bing | néu co Ii. Gis tri ua vé mam trong thanh ghi AL. Néu
khong c6 gid tri déi s6 6 EXIT thi EXIT sé tra vé bat ky gid tri nao
trong AL:
MOV AL, value
MOV AH, 04Ch
INT 2th
Nhu vay khung module chinh cia chuong trinh viét 6 muc 4.4.2
khi sit dung dia chi dau tuung tinh sé duoc viét lai nhu sau:
Vidu 4.21:
MODEL memorymodel ; khai bao kigu bd nha
STACK [size]; khai bao ngan xép véi kich thuGe tinh bang byte
DATA ; két thiic doan ngan xép, khai bao dif ligu
: cc khai bao di ligu: cdc bién, hang sé...
CODE | két thuc doan dif ligu, khai bao doan ma
start: ; bat du thuc hién chang trinh day
MOV AX, @DATA
MOV DS, AX;
MOV AL, value
MOV AH, 04Ch436 Gido trith KS thudt vi xit by
INT 21h; két thie chung trinh, tr vé hé diéu hanh vai ma
+ (code) tra vé
END start ; két thc doan ma, kélt thc module chinh
4.4.7, Dinh nghia day di cdc doan
Néu ching ta mudn cé kiém tra day dit d6i véi cdc doan thi cé
thé dinh nghia day di céc doan trong phin khai bio chting. Oi phip
dinh nghia day di céc doan nhu sau:
name SEGMENT |[[align}][[READONLY]]{[combine}][[use]
[(class']] statements
name ENDS
Trung t2n (name) xdc dinh tén cha doan. Cé thé chon tén bat
ky, nhung phai ding cu phap cla mdt nhin tén. Cac chon lua di sau
toain tit SEGMENT déng trong céle ngoge vudng [[ ]] 66 § nghia IA c4c
kiéu cia doan va cé chide nang phy sau:
Sap xép (align)xac dinh ranh giéi bd nhé ma 6 d6 bat dau mor
doun mdi.
Chi doc (Readonly} dit doan chi duge doc, cm ghi. Khi cé mot
Isnh nao dé ¢6 tham chiéu ghi vio doan thi assembler lap béo cdo Idi.
Két hep (combine) xic dinh cho trinh Linker sé két hgp nhu
thé nio edie doan ti ce module khdc nhau khi xéy dug cdc tép thuc
hign due.
Sté dung (use) chi ding trong vi xit ty 32-bit vii xée dinh kich
thude cua doun. Todn ti USEI6 chi ra gid ui dé dich IA 16-bit va
USE32 chi ra gid tri dO dich 1 32-bit,
Lop (class) Ya ten mot lép cia doan. Linker nr dong nhém cde
doun ¢6 cing lop trong bé nhd.
Cae kigu chon lua c6 thé xép dat khong theo thi ty nhung khong
duge lap lai 2 lan trong cau enh SEGMENT.Chung 4: Lap tinh bing hop ngic 437
a) Sap xép (align) cde doan
Kigu sip xép (align) eng todn tr SEGMENT xdc dinh mot
Khoang cdc dia chi cila bo nhé ma 6 dé dia chi bat dau cia doan cé thé
duge chon, Cé mot sé loai sip xép nhu sau:
BYTE dia chi bat dau 1A dia chi byte sau do.
WORD dia chi bat dau 1a dia chi ti sau dé.
DWORD dia chi bit diiu IA dia chi tt kép sau d6.
PARA dia chi bat diu 1d dia chi doan tin (paragraph) sau dé, mac
dinh m6t doan tin c6 16 byte.
PAGE dia chi bat dau 1a dia chi trang sau dé. Méi mot trang cé
256 byte
b) Tao dean chi duoe doc
Kigu chon Iya Readonly tao cho dogn khéi tao cé thude tinh
duge bao vé, chi duoc doc, hoac Khi ching ta viét chuong trinh dé cai
dat lén ROM.
ce) Két hop cae doan
Chon lua combine kiém soat hanh vi cilia trinh lién két (Link), va
né gdm cde loai nhu sau:
PRIVATE khong két hop dogn vi doan tir cde module khéc
nhau, ngay khi ching ¢6 cling tén. Dat 12 mac dinh.
PUBLIC két hop tat ca cdc doan tring tén (6 cde tep nguén khée
nhau) dé tao ra mér doan riéng va lign tuc,
STACK keét hgp tat ca cdc doan tring tén va gay ra cho hé diéu
hanh thiét lap $$:00 cho diy (bottom) va SS:SP cho dinh (top) cla
dogn ngan xép két qua.
COMMON chéng lan cae doan. DO dai ca ving két qua la do
dai cia dogn dai nhat trong cde doan két hgp.
MEMORY st dung nhw 1a loai PUBLIC.438 Gidio trink KF thude viwit ty
AT address coi dia chi (address) 18 vi tri ca doan. Mét doan AT
khong thé chia bat k¥ ma hoae dit ligu nao nhung né ti¢n dung cho
dinh nghia cde cAu tric hoae bién tuong Ung véi céc vi tf nhé xa, nhu
bé dém cia man hinh hode ving nhé thap. Chting ta khong thé ding
AT combine trong cdc chuong trinh 6 ché do bao vé.
d) Thiét lap thit tw cdc doan theo lop
Hai doun khong cing lép khong thé két hop véi nhau dugc. Dé
két hgp nhanh, tinh Linker sép xép cdc doan sao cho cdc doan cé
cling I6p 6 ké can nhau trong mét tép thuc hién va theo mot trat tr ma
cdc loan tir gid ALPHA, .SEQ, vi DOSSEG xéc dinh trong timg tép
déi tugng (.OBJ). Mét trat tu céc doan thudng ding IA cdc doan ma
phai xudt hign trudéc trong tép thuc hién, Déi véi cdc chuong trinh kiéu
TINY dang .COM, cdc doan ma phai xudt hién dau tién trong tép thye
hign, béi vi su thuc hign phai bat dau 6 dia chi 100h.
Toan tr SEQ sép xép cdc doan theo thi tu ma ching duge
khai bio.
‘Todn tit. ALPHA sap xép céc doan theo thét ty bing chit cai.
Toan tr .DOSSEQ sap xép cdc doan theo thit iy chuan ctta cic
ngon ngit cia Microsoft. Khong thé ding .DOSSEG trong module
duge goi tit module khac, Thit tu xap xép ma DOSSEQ thuc hién 12:
1, Cée doun ma
2. Cac doan dit ligu va theo thet ny la:
a. Cdéc doan khong thudec lép BSS hoac ngan xép
b, Cic doan BSS
c. Cie doan ngan xép
¢} Khéi tao thanh ghi doan mdc dinh cho cde doan
Toan wr gia ASSUME duge sit dung dé chi dinh thanh ghi doan
cho mét doan. Nhu vay mét doan mic dinh hay céc dia chi cla nhém
duge chi dinh cho céc thanh ghi doan nham diam bao cho assemblerChuciag 4: Lap tinh bing hop ngit 439
khi tham chigu dén mot dia chi né biét duge doan nao cé chtia dja chi.
Ci phdp cla ASSUME nhu sau:
ASSUME segregister: seglocation [, segregister: seglocation}
ASSUME dataregister: qualifiedtype [, dataregister: qualifiedtype]
ASSUME register: ERROR |, register: ERROR]
ASSUME [register:] NOTHING [, register: NOTHING]
ASSUME register: FLAT [, register: FLAT]
Trudng thanh ghi doan vj uri doan (seglocation) phai 1a tén cia
doan hay cua nhém duge chi dinh cho mot thanh ghi doan cé tén trong
trudng thanh ghi doan (segregister). Vi du:
ASSUME CS: MY_CODE; chi dinh doan code tén [a MY_CODE.
cho CS
Tu khéa NOTHING xéa tat cd cdc chi dinh cdc thanh doan da
thyc hign bang ASSUME truéde d6.
Binh thudng, chi bang mot dong lenh ASSUME dé chi dinh tat ca
cdc thanh ghi doan: CS, DS, ES, va SS (va FS va GS trong 80386/
80486/Pentiums) 6 ngay diu module chinh cia chuong tinh nguén.
Nhung c6 thé sit dung ASSUME @ bat k¥ diém n&o trong chuong trinh
dé thay déi cde chi dinh doan.
C6 thé ngan chan sy sit dung mét thanh ghi nio dé bang tir khoa
ERROR;
ASSUME register: ERROR; register la tén thanh ghi bi cm
isurdung.
Chang han véi lénh ASSUME CS: ERROR assembler sé thong
bao Idi khi sir dung cdc todn tit cho cdc doan don gidn héa dé tao cde
doan dit ligu,
P) Khéi tao céc nhém doan
Mot nhém doan 1a mot tap hop céc doan ma téng dung lugng cua
chting khong 1én hon 64 kbyte trong ché dd 16-bit. TS chtte nhém cac
doan cho phép phat trign cdc doan logic rieng biét d6i véi cdc loai dit440. Gido trink Ky thadt vi xit ly
ligu khdc nhau va sau d6 két hop ching lai thanh mot doan, tic [A mot
nhém cdc doan, cho tat ca cée dit ligu. Sir dung nhém cé thé tiét kigm
ce thanh ghi doan dé truy cap dén cde doan khéc nhau, va di nhién
chuong trinh sé cé it lénh hon, thuc hién nhanh hon.
Mot sé doan ding trong Microsoft nhu DATA, _BSS, CONST,
va STACK duge két hop thanh mot nhém cé tén 1a DGROUP cho cae
dit ligu gan. Cac ngon ngit cao dat tat cdc céc doan dit li¢u gin
trong nhém nay. Mac dinh ngain xép cling duge dat trong nhém nay.
Todn tu gia MODEL ty dong xéc dinh DGROUP. Binh thuéng thanh
ghi DS trd dén noi bit dau cia nhém DGROUP qua dé c6 thé tray cap
tuong déi dén tat ca dit ligu trong nhhém DGROUP. Cit phap cia khai
bao nhém 1a:
name GROUP segment [[, segment]...
Truéng tén (name) 1a tén cia nhém. N6 c6 thé tham chiéu dén
nhém da dugc khai bdo trude dé, Digu ny cho phép bé sung cdc doan
vao nhém mot lan, vi dy, néu nhém 6 tén la MYGROUP da duoc
Khai béo trude dé nhém cae doan cé tén 1a ASEG va BSEG vio, thi
dong Iénh:
MYGROUP GROUP CSEG
1a hop [é, né bd sung doan tén 1a CSEG thém vao nhém MYGROUP
ma khong loai bé cdc doan ASEG va BSEG khdi nhém.
Trong trudng tén dogn (segment) cé thé viet bat ky mot tén nao.
cla doan da dugc khai bdo trudc dé, Chi c6 mot gidi han 1a tén doan
d6 chi nim trong mot nhém ma thdi, No khéng thé nim wong hai
nhém duge.
Toan tit GROUP khong anh hudng dén trat ty ma cdc doan trong
nhém sap xép. Chting ta cé thé dua vao nhém bao nhiéu doan trong
ché dQ 16-bit (ché dQ 8086/8088) ty ¥ mign lam sao cho téng dung
lugng cha tat cd cdc doan khong vuot qua 64 kbyte (65536 byte).Chucnrg 4: Lap tinh bang hop agit 441
Trudng hop phai thuc hién 14 tao ra mot tép tin dang .COM, trong
d6 kich thude tong thé cita tat cd cde doan trong chuong trinh khéng
vuot qué 64 kbyte, thi chung ta cé thé str dung todn ttt GROUP nhém
c&c doan Khéc nhau: ngan xép, dit liu va ma vao chung mét nhém,
khi dé cau lénh nhém 1a:
CGROUP GROUP code, data, stack
Trong dé, code, data, va stack 1a tén cfc doan ma, dif ligu va
ngan xép tong tng, cdn tén cla nhém 1a CGROUP. Nhu vay cée
thanh ghi CS, DS, SS cing tré dén dia chi dau cia nhom.
&) Khung ctia module chinh cia chuong trinh véi cde dink nghia
day dii cée doan
Cfing nh khi ding c4c todn tr gid khai b4o cée doan don gidn
héa, cdu utc khung cia module chinh cia chuong tinh ngudn dé
dich ra tép thyc hién ngay dang EXE voi dinh nghia day di céc doan
nhu sau:
Vi dye 4.22:
; Doan ng&n xép:
stack SEGMENT STACK
DB 46 DUP (‘STACK ')
stack ENDS
: Doan dif ligu:
data SEGMENT
. ; cc khai bao dir ligu
data ENDS
; Doan ma:
code SEGMENT
ASSUME CS: code, DS: data
main PROC FAR ; bat dau thé tuc chinh xa442 Gido tinh K¥ thadt vi xe ie
start:
MOV AX, data
MOV DS, AX ; dat DS tr dén doan dir ligu mang
7 tén data
| ec lénh thy hién
main ENDP. } két thc thd tuc chinh
code ENDS ; két thuc doan ma
END - start
Doan ngan xép duge khai bdo tén 1A stack va kich thude 108 byte
(16 x 8) vdi 8 byte dau tién chita STACK (va 3 khoang tréng [am day
8 byte). Doan dit ligu duge khai béo tén 1a data. Doan ma duoc khai
bdo tén 1a data, va bat déu bang todn tir gid ASSUME dé chi dinh cdc
thanh ghi C$ va DS cho cée doan va doan dit ligu. Khi mot chuong
tinh dang .EXE bat ddu thc hién thi thanh ghi CS tro dén déu cha
doan lenh, edn thanh ghi DS phai tré dén dau cia doan dit ligu. Nhung
cdc thanh ghi DS va ES phai trd dén dia chi dé é vé DOS sau khi
chuong tinh két thiic, Do vay cong viée dau tién chuong module thue
hign chuong trinh Ia phiai edt gitt dia chi tra vé DOS trong DS vao ngan
xép (PUSH DS) trudc khi dat DS tré dén doan dit ligu moi mang tén
data. Vi dia chi tro vé DOS 1a DS: AX, trong dé AX = 0, do vay can
x6a AX (bang Iénh XOR AX) va cit gitt AX = 0 vao ngan xép (PUSH
AX). Buéc tiép theo la dat DS td dén doan data bing cap lenh: MOV
AX, data; MOV DS, AX. Phai ding AX lam ung gian vi cde thanh
ghi doan chi trao déi dit li¢u véi cdc thanh ghi.
Ben trong doan ma cdc lénh thudng t6 chife trong mot hay nhiéu
th tuc. M6t thé tuc duge bao bdi cde todn tir gid:
label PROC [[distance}]f[...]]
cc lénh thuc hién trong tht tueClutong 4: Lap tinh bang hop ugit 3
RET
label ENDP
Trudng label 1a tén thu tuc. PROC vi ENDP [a cap todn tir gia dé
Khai béo va két thiic thit tue. PROC c6 cde déi cé thé chon tua (ching
sé duoe xét & muc 4.5) vi dy cée thuge tinh Khodng céch [[disstance}}:
FAR, NEAR... Cac chong tinh dich ra dang EXE thudng {A nhimg
thd tuc xa nén trong ci phap chon FAR. Két thtic thii tuc bao gid cing
6 chi din cia vi xi ly RET (tro vé tir mot thi tuc). Nhu vay sdu chi
din cia vi xit ly sau day 14 13i cla module chinh cla mot chuong tinh
nguén dé dich va lién két thinh tép dang .EXE:
PUSH DS
XOR AX, AX
PUSH AX
MOV AX, data
MOV DS, AX
RET
Phai lu6n luén c6 séu chi din nay cia vi xit ly néu nhu chuong
Irinh .EXE duge két thtic bing RET. Voi kiéu khai bao ddy di thi
doan code cé thé viet:
Vi dy 4.23:
; oan ma:
code SEGMENT
ASSUME CS: code, DS: data
main PROC FAR ; bat d4u thd tue chinh xa
start:
Mov AX, data
MOV DS, AX ; dat DS tré dén doan dit liu mang
| tan data444
Gido trink KY thudt vi xt
; ¢dc Jénh the hién
RET ; tr vé tU thé: tye chinh
main ENDP > két thc thd: tue chinh
code ENDS : két thie doan ma
END - start
VA véi kiéu khai bo doan don gin, doan ma 6 thé viet:
; Doan ma:
.CODE
main PROC FAR
start:
: c&c [nh cia thd tue chinh
RET
main ENDP
END start
Tuy nhién, nhimg phién ban sau nay cla MS-DOS khong céin cat
gitt vao ngan xép dia chi iro vé DOS c6 trong DS, va cling khong can
¢6 RET trong thi tuc chinh, ma chi céin cho DS trd dén doan dit liu,
sau d6 két thdc chuong tinh bang Idi goi tré vé DOS bing ngat chic
nang DOS 1a INT 21h voi ma chite ning AH = 4Ch. Nhu vay chi cdn
6:
MOV AX, data
MOV DS, AX
MOV AH, 4Ch
INT. 2th
Vi du dudi day 14 mét module chuong trinh ding dé két hop tat
cd cde doan cling ten 6 cc tép ngudn khac nhau dé tao thianh mot doanChung 4: Lap trink bing hap ngit 445
tiéng va lién tuc (SEGMENT PUBLIC), voi chite nang doc tir bang ma
ban phim ASCIL Lénh INT 21h la ngat chie nang DOS voi ma AH = 7
dé doe ky ty ban phim va tra vé 6 AL = ma ASCII, AH = | néu 14 ma
ASCII, va AH = - 1, néu 1a mii dac biét.
Vi dy 4.24:
CGROUP
CODE_SEG
RD_BYTE
GROUP CODE_SEG
ASSUME CS: CGROUP, DS: CGROUP
SEGMENT PUBLIC
PUBLIC} RD_BYTE
PROC NEAR
Mov AH,7
; doc ky ty tir bang phim khéng 4 echo
INT 21h; dat ma vao AL
OR AL, AL; kiém tra ma mé r6ng?
Jz EXTENDED_CODE
: dang la ma mé réng
NOT_EXTENDED:
DONE_READING:
EXTENDED_CODE:
RD_BYTE
CODE_SEG
MOV AH, 1; bao la ma ASCII binh thydng
RET
INT 24h ; doc ma mé réng
MOV AH, OFFh ; tin higu ma mé réng
JMP DONE_READING
ENDP
ENDS
END446 Gido trink K¥ thad vi xiv
Mot vi du khéc, chuong tinh in ra chudi ky ty két thtic bang ky
hiéu $ bang chic nang DOS: INT 21h, AH = 9. Chuong trinh dich ra
dang .EXE va khong cain RET:
Vi dy 4.25:
PAGE 132 1 dinh trang véi 132 cét
TITLE HELLO : #én chuong trinh la HELLO
COMMENT * Inra man hinh mét chudi ky ty*
MODEL = SMALL
STACK —100h
-DATA
msg OB CHello, world of the macro assembler.$0
-CODE
main PROC
Mov AX, @DATA
MOV DS, AX
; hién thi ra man hinh théng bao
MOV DX, OFFSET msg
MOV AH, 9
INT 21h
; trd vé DOS.
Mov AH, 4Ch
INT 2th
main ENDP
END main
Hod cé thé viet phiin doan ma khéc khong c6 tht tye:
«CODE
start:
MOV AX, @DATA
Mov DS, AXClaong 4: Lép trink béng hop ngit 4a7
MOV OX, OFFSET msg
MOV AH, 9
INT 21h
MOV AH, 4Ch
INT 2th
END start
4.4.8, Cae céu (ric chuong trinh nguén khi dich ra dang .exe va .com
MS-DOS hé trg té chite b6 nhé phan theo ede doan la mot dac
(rung cia cic vi xir ly Intel ti 16-bil dé 32-bit. Tuy nhién, nhu ching
ta da thay, & ché dd 16-bit (8086/8088) cdc doan nhé chi c6 dung
lugng tdi da 1a 64 kbyte (65536 byte). Nhung bé nhé trong co ché
phan doan 64 kbyte Iai chia thanh cdc doan géi lén nhau (overlapping
segments), cit 16 byte thi bat diéu mot doan mdi (hinh 4.1).
Baan 0
9000:0000
9001.0000
64 kbyte
(65535)
Tro
dén
6a Kbyte. 66535,
(69536)
Tw16
déa
85551
oo0o:FFFF
oot FFEF
Boan 1
Hink 4.1: Céc doun dogn 64 kbyte got ten nhaw,
cit 16 byte thi bat ddu mot doan méi448 Gido trinh Ky thudt vi witty
Theo co ché sdp xép nay, doan dau tien (SEGMENT 0) duge bat
dau 6 vi tri 0 cita bd nhé, doan thi hai (SEGMENT 1) bat dau & vi tri
16 (hay 10h), doan thir 3 (SEGMENT 2) bat dau 4 32 (20h)...
C&c chuong trinh hop ngit viet dé chay trong MS-DOS khi duoc
dich va lién két cd thé c6 hai dang thuc hign duge ngay 1a EXE va
.COM. Dé tao .EXE chi cfn ding hop dich va sau dé 1a trinh lin két
(Link). Nhung dé tao tép .COM thi phai thyc hién ding chuong trinh
EXE2BIN dé chuyén tép tit EXE sang COM, Nhung diém khéc biét
quan trong 18 chuong trinh nguén dé dich sang .EXE c6 cu tric khdc
véi chuong trinh nguén dé dich ra. COM.
M61 chung tinh ngudn dé dich ra EXE 06 cau tric day dit cde
khai bao cho ede doan: ngan xép, dit 1igu va ma thi cing sé c6 mot su
sip xép goi diu. Chang han, néu mot chuong trinh c6 céc doan SS, DS,
ES, va CS thi ce doan nay c6 suf sip xép gi Ién nhau.
Khiic véi EXE, tep dang .COM chi cé mot doan duy nhét. Khi
hap vaio bé nhé va thy hi¢n chuong trinh .COM thi ca 4 thanh ghi
doan: SS, DE, ES va CS déu wé dén ddu cla ving mao déu doan
chuong trinh PSP (Program Segment Prefix), PSP cé dung luong 256
byte (100h) va chita mor s6 théng tin cdn cho MS-DOS str dung nhu:
dé thodt khdi chuong tinh nhd iénh INT 20h hay INT 21h v6i AH =
4Ch (ngay dau cia PSP 1a chi dan INT 20h néu ding INT 20h dé thoat
Khoi chyong trinh tré DOS); tai do dich (offset) SCh va 6Ch cla mao
dau PSP 1a hai khdi diéu khién tép FCB (File Control Block); tai dd
dich SDh cé chita bién thdi gian (time argument); bat déu tai d6 dich
80H cla mao du PSP chia nhiing ky ty gd vao ngay sau tén clia
chuong tinh cia dong Iénh do ngudi sit dung danh vio sau dau nhic
cua MS-DOS.
Nhu vay trong tép .COM phan ma thuc hién ngay luon bat dau &
dQ dich 100h trong doan ma, ngay sau ving PSP, tie J dat IP = 100h,
Trong khi dé & tp .EXE gid tri ban dau cia IP = 0. Vi vay trong
chuong tinh nguén luén phai ¢6 todn ti gid:Chicong 4: Lap trink bang hop ngit 449
ORG 100h
ngay sau dong lénh .CODE déi véi céc khai bdo cdc doan don gidn
héa va sau dong Iénh ASSUME di v6i cdc Khai béo day dit cac doan.
Toan tit gid ASSUME phai chi dinh cdc thanh ghi CS, DS, ES, va
SS cing trd dén mot doan chung - doan ma (hinh 4.2),
CS, DS, ES, SS ——> psp
(258 byte)
IP = 400h ——»
Chyong tinh,
aitieu,
ngan xép
Hinh 4.2: Chuong wink COM trong b6 nhé
Cau tréc cia mot chuong trinh nguén dang .COM sé nhw sau:
Vi du 4.26:
TITLE progname
.MODEL SMALL
.CODE
ORG 100h
start:
JMP main
msg DB "Hello, world of the macro assembler"
main PROC
MOV DX, OFFSET msg
MOV AH, 9
INT. 21h450
main
MOV
INT
ENDP
END
Gido irink K¥ thudt vi xt hh
AH, 4Ch
21h
start
Khong can thiét trong tép dang .COM phi khdi tao thanh ghi DS
(13 t6i doan dit ligu:
MOV
MOV
AX, @DATA
DS, AX
Hoac voi Khai béo day di céc doan, tép dang .COM nhu sau:
Vidu 4.27:
code
start:
msg
main
main
code
TITLE proname
SEGMENT
ASSUME
ORG
JMP-
DB
PROC
MOV
Mov
INT.
Mov
INT
ENDP
ENDS
END
NEAR
CS: code, DS: code
100h
main
“Hello, worid of the macro assembler”
DX, OFFSET msg
AH, 9
21h
AH, 4Ch
21h
startChuong 4: Lap winh bang hop ngit 451
4.5. CO CHE LAM VIEC VA CAU TRUC CHUGNG TRINH CON
MOt chuong trinh duge viet ngdn gon, dé kiém tra khi n6 duoc
viet thanh cdc module, ggi 1a céc thi tuc (procedure). Cac thi tuc ¢é
thé nim trong cing mot doan, khi d6 chiing duoc goi 1A cdc thi tuc
gin (NEAR). Chuong trinh hay thi tye khai béo bing MODEL véi
cdc kiéu bé nhé: TINY, SMALL, COMPACT va FLAT duge coi 1a
NEAR. Khi cdc thii tuc nim & khdc doan thi chiing duge goi li céc thi
tuc xa (FAR). Chuong trinh hay thi tuc khai bdo bing MODEL véi
céc kiéu b6 nhé: MEDIUM, LARGE va HUGE duge coi Ia FAR, Mot
chuong trinh hay m6t thi tue goi dén mot thi tuc khdc bing chi din
eta vi xitl¥ CALL, ci phap:
CALL procedure_name
‘Tha tuc [& mét chuong trinh con, va lénh CALL goi dén thi tuc
kéo theo phai thuc hién cat gift vio ngin xép (PUSH) dia chi tras vé
chuong trinh chinh hay thé tuc goi. Ching ta da khdo sat c4c lénh
CALL va RET véi cic thao t4e ngan xép va chuong trinh khi néi vé
tap Iénh cla vi xi ly réi. Nhung 6 day xét theo hop ngif thi cn phai cé
nhitng todn tir gia dé khai bdo cdc thi tuc hay chvong trinh con.
4.5.1. Khai bao tha tuc
Nhu da tinh bay, cp todn tir gid PROC va ENDP ding dé khai
béo thi tuc, PROC xc dinh bit dau thi tuc va ENDP xéc dinh két
thiie tha tuc. Ci phap khai bdo day dl mot thi: tue 1a:
label PROC [[NEAR|FAR]]
we ; cdc lénh thuc hién trong thd tuc
RET 3 tré vé chung trinh hay thd tuc goi
label ENDP [[constant]]
Label 14 tén thi tue, 1enh CALL label (trong chuong trinh hay
thi tuc goi) chinh 1 dé goi t6i thi tuc, Lénh RET dé tr vé chuong
trinh hay thi tuc goi. N6 phuc héi (POP) tir ngéin xép cdc noi dung452 Gido trink Kj thudt vi xit is
thanh ghi va dia chi (da duge cat giit vao ngan xép khi thyc hién Iénh
CALL label) cha lénh tép theo (sau Iénh CALL label) phai thuc hién
trong chuong tinh hay thi tuc goi. Khoang cdéch gan hay xa
(NEAR/FAR) déi véi cdc loai vi xit ly 80386/80486/Pentiums lap
uinh Khi lap voi cde doan 16-bit va 32-bit 6 thé sit dung: NEARI6,
NEAR32, FARI6, va FAR32. Gia tri chon Iya hang s6 (constant)
sau RET 18 s6 byte duge cOng thém vao gi4 tri cla thanh ghi SP sau
khi tré vé.
Ching ta cé thé khai bdo cdc thd tuc khong cin PROC va ENDP
nhung khi dé cain phai bit duge chic chan kich thuéc cua lenh CALL
tring voi kich thudc cia lénh RET, ti’c 1 néu goi xa thi phai tré vé xa,
néu goi gan thi phai tro vé gan. Néu goi gan ma wé vé xa thi gid tri
phuc héi tir ngan xép sé khong dting voi gid tri cat gid cla goi gan, boi
vi goi géin cat gitt mt tir dia chi cia IP, con ué vé xa thi phuc héi hai
a chi: mot ti dia chi cla IP va mot tir dia chi ca CS. Co thé sit
dung RETN (tré vé gan) hoac RETF (1rd vé xa) thay cho RET dé bd
qua kich thuée mac dinh, chang han, véi truéng hop nh sau:
CALL NEAR PTR task ; CALL dugc khai bao la goi gan
” 7 ré vé tir thé tuc gan (lask) sé thyc hién tiép 6 day
task: ; thd tuc bat déu véi nhan gan
; Cac lénh cia thi tuc 6 day
RETN ; tr vé tirthd tuc gan
Ci phdp cla RETN:
label: | label LABEL NEAR
RETN [[constant]]Chuong 4: Lép tink bang hp ngit 453
Cu phdp cha RETF:
label LABELFAR
RETF [[constant]]
4.5.2. Goi cdc tha tuc xa va gan
Goi dén mét thi gan goi IA goi gin (NEAR CALL), goi dén cac
thii tuc xa goi 1A goi xa (FAR CALL). C6 thé ding cdc todn tir gia
RETN (tré vé gan) hay RETF (tré vé xa) thay cho RET.
CSc lénh goi gan bi gidi han trong mot doan, ching chi thay déi
noi dung con trd Iénh (IP) ma khong thay déi n6i dung cia thanh ghi
CS. Ciing do vay ma cdc Jénh goi g4n con duge coi 1a goi trong doan.
Céc lénh goi xa thay d6i cA ndi dung CS va IP, vi [A goi cha mot
tht tuc trong mét doan dén mér thi tuc 6 doan khac, Dé 1 goi giita
cde doan.
Goi gan trong hé 16-bit cét gift vao ngan xép mot tir (16-bit) dia
chi cia IP, dé 1a dia chi tré vé thi tuc goi. Lénh tré vé gn tir thi tuc bi
goi (RETN) phuc héi lai ti dia td ngan xép vao IP.
Déi véi goi xa thi mot tir dia chi IA khong di, ma cén phai cAt gitr
2 tw dia chi: tir dia chi trong IP va ty dia chi trong CS. Lénh trd vé xa
(RETF) tir tha tuc bi goi phuc héi 2 tt dia chi 1 ngan xép: mot tir vao
CS va tir thir 2 vao IP, Hinh 4.3 mo td goi xa, gan va trd vé gan va xa.
Chuong trinh dich assembler sit dung khai b4o thi tuc bi goi dé
x4c dinh goi xa hay gdn. Trong hinh 4.3, Thi tuc goi PROC_2 duoc
khai bao 18 gdn nhung thi tuc bi goi PROC_! duge khai bdo 18 xa nén
CALL PROC_1 trong tha tuc gin PROC_2 18 goi xa vi né xde dinh
theo thi tuc xa PROC_1, Nguoc lai assembler lai sit dung khai bao ca
tha tuc trong dé ¢é RET dé xéc dinh tro vé xa hay gan. Thi te
PROC_1 duoc Khai b4o xa nén RET cia nd 1A tr vé xa, COn RET
trong thi tuc PROC_2 1a tré vé gan.454 Gido irinh K§ thudt vi xit ly
PROG NEAR
CALL PROC!
Golxa
RET
PROC_2 ENDP
PROG_1 PROC FAR
RET
PROC_1 — ENDP
Hinh 4.3: Goi xa va tro vé xa va gan
4.5.3, Ngdt la goi dén tha tuc xa
Trong IBM PC cde lénh ngét dugc thyc hién rat giéng voi enh
CALL, chi khde 1a n6 phat sinh tir su kign ngat, Ngét trong vi xir ly
Intel th 16-bit dén 32-bit cd 2 loai. Ngat cing xudt hién ti tin hiéu
ngat bén ngoai (thiét bi ngoai vi cé yeu cdu dure phue vu chang han)
gay ra vi xir ly thyc hién mét thi tuc phuc vu yéu cdu ngét va tro vé
noi bi dimg trong chuong trinh dang thuc hién khi phyc vu ngat xong.
Ngat mém 1a trong chyong trinh hay thi tuc c6 lénh ngat INT goi t6i
thil tuc phuc vu ngat va sau do tré vé tir thi tuc phuc vu ngdt
Giéng nhu CALL, ngat cing gay ra cat gitt 2 tir dia chi tré vé noi
dang thuc hién trudc khi bj ngat: 1 tir cla CS va 1 tit cba IP. Nhu vay
ngat cing 1A got xa. Thyc chat 1a nhu vay vi cdc ngat chite nang DOS
va BIOS déu goi t6i mot viing ROM rieng goi la ving BIOS cé dia chi
doan riéng & ving cao nhat cla khong gian nhé cia IBM PC, va dé a
noi chita cdc chyong trinh hay tht tuc xa phuc vu céc loai ngat cia hé
théng IBM PC. Nhung khdc véi CALL Ia ngat ddi héi phai cat git vao
ngan xép cdc gid tri cd ciia thanh ghi cd trong vi xtt ly trude khi edt gitt
2 ti dia chi. Vi dy voi ngat chic nang DOS: sau khi thuc hién INT
21h, ngan xép duge sap xép nhu sau:
Dinh (TOP) cia ngan xép: Old IP (tit dia chi tht nhat)
Old CS (tit dia chi thi hai)
Old Flag registerChuoug 4: Lap trinh bang hop ngit 455
Dia chi cla thi tc bi goi duoc x4c djnh theo sé hiéu ngat o
(interrupt number) trong lénh INT n, Nhu n = 21h trong lénh INT 21h.
Qua sé higu ngat dia chi cha thi tuc bi goi (thi tue phuc vu ngat)
trong ving BIOS duge xc dinh trong 2 tir cba bang véc-to ngat (ving
256 byte thap nhat cia bd nhé). Dia chi ca 2 tir trong bang véc-to
ngat duge tinh bang: n x 4.
Vay INT 21h té téi dia chi 84h (4 x 21h). Trong 2 tir nay cda
bang véc-to ngat chia 2 tir dia chi cla thd tuc phuc vu ngét trong
BIOS. Van dé nay ching ta xét t6i khi xét vé ngét trong cdc vi xir
Intel ri.
Truong tu, khong thé ding RET wong céc thi tuc phuc vu ngét
duge ma thay vio dé 18 cdc I¢nh TRET (tré vé tir phuc vu ngat). IRET
phuc héi khong chi 2 ti dia chi IP va CS ci ma ca cdc cd cil,
4.5.4. Truyén dit liéu gita cdc tha tuc
Truyén dif liu giita cc tha tyc xay ra khi c6 Idi goi tir mot tha
tuc dén mot tha tuc khdc. Cé 3 cach truyén dif ligu; ding cdc bign toan
cuc, truyén dia chi cia dif li¢u nh@ cdc thanh ghi va sit dung ngan xép.
a) St dung cdc bién todn cuc
Todn tr gid PUBLIC va EXTERN duge dat truéc tén thi tuc va 1a
dong lénh khai béo thi tuc chi din cho assembler ring thi tuc ed tén
dimg sau PUBLIC hay EXTERN phai I& chung hay cé trong cdc tép
Khéc. PUBLIC ndi rang cdc tép khdc 6 thé goi cc thi tuc c6 tén ding
sau PUBLIC, con EXTERN néi rang thi tuc cé tén ding sau nd nam &
trong tép khdc. Chti ¥ ring PUBLIC ditng sau SEGMENT dé trinh lién
két (Link) két ndi céc doan cig tén véi nhau nhung nam trong céc tép
kh4c nhau thinh mot doan chung. Co thé ding EXTERN dé khai
béo dé ligu trong mot tht tuc va tham chiéu dén dif ligu dé tir mot tha
tuc khac.456 Gido trinh K¥ thudt vi xit ly
Vi du 4.27:
Tao mét tép Video_io.asm chifa 3 thi tuc gan (nam cing chung
mét doan ma) va duge khai béo véi PUBLIC. Chuong tinh dich ra
dang com.
TITLE VIDEO_IO
-MODEL SMALL
CODE
ORG 100h
TEST_WRITE_HEX PROC NEAR ; module chinh
MOV DL, 3Fh :kiém tra véi 3Fh
CALL WRITE_HEX
iNT 20h ; tr vé DOS.
TEST_WRITE_HEX ENDP
PUBLIC WRITE_HEX ; thd tye WRITE_HEX
; la ding chung
; Day [a thi tuc chuyén déi mét byte trong DL thanh ma HEX
1 va ghi 2 chit sé
; HEX cia né lén man hinh 6 vi tri con td. Tha tuc nay goi téi tha
; tuc hién thi chit sé HEX WRITE_HEX_DIGIT
WRITE_HEX PROC NEAR
PUSH cx
PUSH DX
MOV DH, DL
MOV Cx, 4
SHR OL, CL
CALL WRITE_HEX_DIGIT ; hién thi chiv sé HEX
i dau tién
MOV DL, DH
AND DL, OFhChuang 4: Lap tinh bang hop ugit 457
CALL
POP
POP
RET
WRITE_HEX ENDP
PUBLIC
WRITE_HEX_DOGIT ; hign thi chit sé HEX
ithe 2
Ox
cx
WRITE_HEX_DIGIT
: WRITE_HEX_DIGIT {a diing chung thi) tuc nay chuyén adi 4 bit
; thép eda DL thanh mét chi? s6 HEX va hign thi ra man hinh. Tha
; tuc nay goi tdi thd tue hién
; WRITE_ "CHAR
WRITE_HEX_DIGIT
PUSH
cmp
JAE
ADD
JMP
HEX_LETTER:
ADD
WRITE_DIGIT:
CALL
PoP
RET
WRITE_HEX_DIGIT
PUBLIC
WRITE_CHAR PROC
PUSH
MOV
INT
man hinh mot ky ty
PROC. NEAR
DX
DL, 10
HEX_LETTER
DL, "0"
SHORT WRITE_DIGIT
DL, "A" - 10 ; chuyén déi thanh chi sé HEX
WRITE_CHAR
DX
ENDP
WRITE_CHAR ; thi tue WRITE_CHAR la
; toan cuc
NEAR
AX
AH, 2 ; chic n&ng hign thi mét ky ty
21h458
Gido tink K¥ thudt vi wit 15
POP AX
RET
WRITE_CHAR ENDP
END TEST_WRITE_HEX; két thuic module chinh
Trong chuong trinh nay c4c tht tuc dugc khai béo géin nhung co
cc lénh INT 20h va INT 21h goi tdi cdc thi tuc cia BIOS, d6 1A c4c
lénh goi xa.
Vi dy 4.28:
Tao chuong trinh disk_io.asm doc mot séc-to tir dia mém ding
khai béo day di cic doan gp thanh nhém, va toén tit EXTERN dé
Khai béo tht tue va bién toan cuc nam 6 tép khéc:
tp disk_io.asm
CGROUP GROUP —- CODE_SEG, DATA_SEG
ASSUME CS: CGROUP, DS: CGROUP
CODE_SEG SEGMENT PUBLIC
EXTERN — DISP_HALF_SECTOR: NEAR
; thd tue nay dgc sector dau tién trén dia A va két xuat mét nita
: sector lén man hinh
READ_SECTOR PROC NEAR
mov AL, 0 ; 86 higu é dia (A)
MOV CX,1 5 chi doc 1 sector
Mov DX, 0 ; 86 higu sector
LEA BX, SECTOR ; nap dia chi (EA) cla bé dém
; noi luu trifnéi dung sector
INT 25h ; doc néi dung sector vao
+ be
POPF ; phuc héi cae co
XOR DX, DX ; lap d6 dich 0 cho sectorChutong 4: Lap trink bang hop ngit 459
CALL DISP_HALF_SECTOR
INT 20h
READ_SECTOR ENDP
CODE_SEG ENDS
DATA_SEG SEGMENT PUBLIC
EXTERN SECTOR: BYTE ; bién SECTOR toan cuc
DATA_SEG ENDS
END READ_SECTOR
Chuong trinh disk_io.asvi sit dung EXTERN dé Khai bdo sit dung
mot thi tuc nm trong mot t@p khéc_ 1a DISPLHALF_SECTOR (hién
thi noi dung mot nifa séc-to), va khai b4o bién toan cuc SECTOR nam
trong tép Disp_sec.asm dé c6 thé tham chiéu t6i n6 tw cdc tha tuc
khdc. Cach dimg EXTERN dé khai bao bién to’n cuc la mot tong
nhéng phuong phdp truyén dif li¢u giita cdc thi tuc ma ta sé dé cap
ngay & muc tiép sau day. Thi tuc DISPLHALF_SECTOR 18 thi tuc
gan nam trong m6t tép tin khdc 6 tén 1a disp_sec.asm.
; tép tin disp_sec.asm
CR EQU 13 | Carriage return
LF EQU 10 ; Line feed
CGROUP GROUP CODE_SEG, DATA_SEG
ASSUME CS: CGROUP, DS: CDROUP
CODE_SEG SEGMENT PUBLIC
PUBLIC. DISP_HALF_SECTOR
DISP_HALF_SECTOR PROC NEAR
XOR Dx, DX
PUSH cx
PUSH DX
Mov CX, 16Gido trink K5 thud vi xit by
HALF_SECTOR:
CALL DISP_LINE
CALL SEND_CRLF
ADD DX, 16
LOOP HALF_SECTOR
POP Dx
POP Cx
RET
INT 20h
DISP_HALF_SECTOR ENDP
PUBLIC SEND_CRLF
SEND_CRLF PROC. NEAR
PUSH AX
PUSH Bx
MoV AH, 2
MOV OL, CR
INT 21h
MOV DL, LF
INT 21h
POP Dx
POP AX
RET
SEND_CRLF ENOP
PUBLIC DISP_LINE
DISP_LINE PROC NEAR
XOR BX, BX
PUSH BX
PUSH cx
PUSH OXChuong 4: Lap trinh bang hop ngit 461
MOV
Mov
PUSH
HEX_LOOP:
Mov
CALL
Mov
CALL
MOV
POP
XOR
ASCII_LOOP:
Mov
CALL
INC
LOOP
PoP
POP
Pop
RET
INT
DISP_LINE
PUBLIC
WRITE_HEX PROC
PUSH
PUSH
MOV
MOV
SHR
BX, BX
CX, 16
BX __ ; c&t giif offset cho ASCII_LOOP
DL, SECTOR[BX]
WRITE_HEX
DL,'' ; ghira dau cach chif gitta cdc sé
WITE_CHAR
CX, 16
BX
BX, BX
DL, SECTORIBX]
WRITE_CHAR
BX
ASCII_LOOP
Dx
cx
Bx
20h
ENDP
WRITE_HEX
NEAR
cx
DX
DH, DL
CX,4
DL, CL462
Gido trink K¥ thugt vi xt
CALL WRITE_HEX_DIGIT ; hién thi chit sé HEX
: dau tién
MOV DL, OH
AND DL, OFh
CALL WRITE_HEX_DIGIT ; hién thi chit sé HEX
i thé hai
POP Dx
POP Cx
RET
WRITE_HEX ENDP
PUBLIC. WRITE_HEX_DIGIT ; WRITE_HEX_DIGIT
; la ding chung
WRITE_HEX_DIGIT PROC NEAR
PUSH DX
CMP DL, 10
JAE HEX_LETTER
ADD DE, “o"
JMP- SHORT WRITE_DIGIT
HEX_LETTER:
ADD DL, "A" - 10; chuyén déi thanh chif sé hex
WRITE_DIGIT:
CALL WRITE_CHAR
POP DX
RET
WRITE_HEX_DIGIT ENDP
PUBLIC WRITE_CHAR ; thi tue WRITE_CHAR la
; toan cuc
WRITE_CHAR PROC NEAR
PUSH AXChuomg 4: Lap winh bing hop ngit 463
MOV AH, 2 j chife nang hién thi mot ky ty
INT 2th
POP AX
RET
WRITE_CHAR ENDP
CODE_SEG ENDS.
DATA_SEG SEGMENT PUBLIC
PUBLIC SECTOR
SECTOR DB 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
; mau thir
DB = 18h, 19h, 1Ah, 1Bh, 1Ch, 1Dh, 1Eh, 1Fh
DATA_SEG ENDS.
END
b) Truyén dit liéu nho ngdn xép
Mot phuong phdp hay duge ding dé truyén dif ligu gitta cde thi
tuc goi va bi goi 1a sit dung ngan xép va dit ligu duge thi tuc bi goi
duoc truy cap théng qua véi céch d4nh dia chi dit liéu gidn tiép trong
ngan xép. Cap thanh ghi SS:BP ding dé danh dia chi gidn tiép dit lieu
trong ngan xép. Chi ¥ rang cap thanh ghi SS:SP chi ding dé danh dia
chi truc tiép dif liéu cat git trong ngan xép,
Qué trinh dién ra nhu sau: trong thi tuc goi, truéc lénh CALL, cé
cAe lénh cat gitt (PUSH) cde dit ligu 06 thé cén cho thé tuc bi goi va
cho tré vé tir tha tuc bi goi. Tiép theo, lenh CALL trudc hét cat gitt dia
chi tré vé vao dinh ngan xép va nap dia chi thi tuc bj goi dé thyc hién
thi tuc bi goi. Trong tha tuc bi goi phai cé lénh dau tién 18 cat gitt ndi
dung ci cia thanh ghi BP (PUSH BP), Iénh tiép theo 1a phai chuyén
noi dung SP vio BP (MOV BP, SP), nh dé ma BP tré dén dinh cita
ngan xép nhu SP. Tiép sau 1a thuc hién lay dit ligu tit ngan xép (ma
truGe d6 thi wwe goi da cat gid vao ngin xép) ra dé thuc hi¢n nhung464 Gido trinh KF tude vi xit ly
khong phai bang cdc lénh POP va dia chi SS:SP ma bing cdc lénh bink
thudng véi dia chi SS:BP. Vi du 4.29 dudi day gidi thich qué trinh nay.
Vidu 4.29;
; trong thi tuc goi
MOV AX, 10
PUSH AX __; c&t vao ng&n xép dif ligu th nhat
PUSH data2 ; cdt vao ng&n xép dif liéu th hai
PUSH CX — ; cat _vao ngan xép dif ligu thir ba
CALL addup ; cat vao ngain xép dia chi trd vé,
; dinh con tré dinh vi tai day, va goi
, dén thi tuc gan
: thd tue bi goi
addup PROC NEAR
PUSH BP _; cat vao ngan xép gia tri cila cila BP
Mov BP, SP : nap dinh con tré vao BP
Mov AX, [BP+4] _ ; lay tirngain xép di liu thir
; ba (ndi dung CX)
ADD AX, [BP+6] — ; cOng v6i dif lidu thir hai
} trong ngan xép, tlic 1a
; AX = CX + data2
ADD AX, [BP + 8] ; cong véi dif ligu ther nhat
; trong ngan xép, tie la
; AX = CX + data2 + 10
POP BP : phuc héi ni dung cfi cla BP
RET ; tr vé thi tue goi
addup ENDPChitung 4 Lap wink bang hop agit 465
¢) Truyén dia chi ciia dit liéu nhé cdc thanh ghi
Tha tuc goi chuyén dia chi cla cdc dit ligu (ma thi tuc bi goi sé
ding) vao trong cdc thanh ghi truée khi cé lénh CALL. Thi tuc bi goi
thyc hin lay di ligu cla thd tuc goi véi dia chi cla ching cat giit
trong cic thanh ghi dé thuc hign. Vi du 4.30 duoi day mo ta sy thuc
hign tinh todn trong thit tue bi ggi duge wa vé cho tha tuc goi nho su
dung su danh dia chi cfc dé ligu bing cdc thanh ghi SI, DI va BX.
Vi du 430:
; this tue goi, chung trinh tén {a tinhtong1.asm
TITLE tinh_tong1
EXTERN TINH_SUM; NEAR,
MODEL SMALL
“STACK 100h
-DATA
msg DB ‘Enter two digits: $'
msg1 DB 9Dh, OAh, The sum of'
digit DB ?
DB AND’
digit2 DB?
OB oS
sum DB -30h,'S'
CODE
main PROC
MOV AX, @DATA
MOV DS, AX : chi dinh DS tré tdi doan di ligu
MOV AH,9
LEA DX, msg lay dia chi EA cla chudi thong bao
i msg (offset)466
Gido trinh K¥ thudt vi wit ly
high thi két qua tinh
main
INT 24h ; hién thi théng bao msg nhan ti ban
; phim 2 chit sé va AL dé tinh (digit1
: va digit2)
MOV AH, 1
(NT 21h ;nhan sé thir nhat
MOV. digit, AL
INT 24h ;nhan sé thir hai
MOV digit2, AL
LEA SI, digitt | eat dia chi (d6 dich) cia digit
LEA Di,digit2 —_; cat dia chi cua digit2
LEA BX, sum 7 cat dia chi cla sum
CALL TINH_SUM
LEA DX, msg1
MOV AH, 9
INT 24h
MOV AH, 4Ch
INT = 21h 7 1rd vé DOS:
ENDP
END main
; chung trinh tinh t€n fa tinhtong2.asm cling doan véi
; tinhtong1.asm
TITLE tinh_tong2
PUBLIC TINH_SUM
MODEL SMALL
CODE
TINH_SUM = PROC NEAR
PUSH AX
MOV AL, [Sl] + Idy $6 thi nhatChung 4: Lap tinh bang hyp ngit 467
ADD AL, [DI] ; céng sé thi hai
ADD [BX], AL ; c6ng vao sum
POP AX
RET
TINH_SUM = -ENDP
END
4.5.5, Thu vién cac thi tuc
Khi cé nhigu th tue phai sit dung thi cé thé tao lap mét thu vién
cc thit tuc dé tiét kigm dung luong ca chyong trinh nguén, Thy vién
1a mot t¢p tin c6 phén mé rong -LIB. Chuong trinh tham khdo téi thu
vien bing chi din INCLUDE. Vi thu vign cdc thi tuc chtta céc lénh
céin duge thuc hién ngay nén phai chi y dat chi din INCLUDE ding
noi ma cdc thi tuc can xuat hign.
Vidu 4.31:
Tao mot thu vién cé tén 1a get_one.lib chia 3 thd tuc: get_path,
get_name, scan_pa dé xt fy dutng dfn tén tép tin nhap vao tir ban
phim. Xir ly during tén 6 ving dém 80h do ngudi str dung g5 vio hoac
nhac ngudi sit dung g6 vao néu chua cé, dat thém 0 4 cudi dutng tén
(hanh chuéi ASCI). Ving dém phy duge dat sau thi tuc get_path.
Két qua ra cia get_path: SI tro dén ky uy dau tién cia tén tép tin, DI
tro d&n O 6 cudi dutmg tén tép. Thi tuc chinh get_path str dung 2 thi
tuc gdn get_name va scan_pa,
get_path PROC
; kiém tra c6 tham sé trén dong lénh
MOV DL, OFFSET buffer
MOV CL, [DI-1] ;CL=s6 ky tyda nhap
MOV CH, 0
OR CX, CX 1 CX = 07
JNZ ck_par468
Gide twink K9 thudr vi nie ly
no_parm:
write_r
macro write_r
MOV DI, OFFSET buff_in
; tré dén ving dém phu
CALL get_name
ck_par:
CALL scan_pa
JC no_parm
RET
get_path ENDP
hand) OW ? ; thé tép tin
mak_buf buff_in, 45
; macro tao vung dém phu buff_in
: Thi tuc nhan dudng dan tén tép te ban phim va vung dém buff_in
: Input cho get_name: DI tré dén dau cia buff_in
; Output tlr get_name: DI trd dén ky ty dau tién cla tén, CX= sé ky
; tu da nhap
get_name PROC
read_bf DI
; macro doc vung dém ban phim co dia chi tai DS:dia_chi?
write_r
INC DI + bd qua sé ky tu téi da
MOV CL, [Di] : CL= sé ky tu thu su nhap
MOV CH, 0
INC DI Ditrd dén ky ty nhap dau tién
get_name — ENDP
+ Tha tye xt ly duéng tén: bd di cac khoang trong thifa, them 0
| ao cusi uéng tén (tr thanh chudi ASCIIZ)Chuoug 4: Lap tinh bang hop ngit 469
; Input cho scan_pa: Dl trd dén ky ty dau tién cla dung tén
; CX = 86 ky tu. da nhap
; Output tur scan_pa: SI tré dén ky ty dau tién cia tén, DI tré dén 0
34 cudi tén cd CF = 1 khi c6 16!
scan_paPROC
sdi:
MOV AL, blank
REPE SCASB ; tim ky tu dau tién khde khoang tréng
DEC DI | Di trd dén ky ty nay
INC CX 1 OX = soky tur
MOV SI, DI
CMP AL, [SI]
JZ no_parms —_; khi toan la khoang tréng
REPNE SCASB
JNZ sdi -néu la CR
DEC DI ; blank
; thém 0 vao cudi duéng tén
MOv [DI], CH
INC) DI
cLe
RET
; dat cd CF = 1 khildi dudng tén
no_parms:
STC
RET
scan_paENDP
; Kat thc thu vién & day
Chiing ta sé khao sat edich chuong tinh chinh tham khao dén thu
vién cdc thu tuc nhy thé nio khi néi 161i MACRO,470 Gido tinh Ky that vi nitty
4.6. MACRO VA CAC VAN DE LIEN QUAN
Macro a tén tugng trung gdn cho mot chudi céc ky tu (macro
van ban) hodc cho mot hoac mot 36 cdc phat biéu (cdc thi tuc hodc
ham macro). Chuong trinh dich assembler khi duyét c&c dong cia
chuong trinh ngudn, néu gap tén macro, né sé thay thé tén macro bing
n@i dung van ban cla macro dé, tic 1A m& rong macro, nhu vay, ngudi
ap trinh trénh phai viét mot sé ndi dung tring lap mot s6 lan trong
chuong trinh nguén. Tén cia macro thudng gin lién véi noi dung
cia macro.
Cac macro van ban mé r6ng van ban bén trong mot phat biéu cha
chuong trinh nguén.
Cac thit tuc macro (thuimg goi 1a cdc macro) mé rong thém thanh
mot hoac mét sé phat biéu va cd thé nhan cdc thong s6.
Cc him macro gidng cdc th tue macro va cd thé duge sit dung
ging nhu céc macro vin ban nhung cé tra vé gid tr).
C&c macro cla MASM cé cdc toan tu nhy sau:
<> mo va déng chudi van ban
! coi ky tt ding sau nhu [a ky ty van ban
% dé mé rong thém mot biéu thie hang sO hay mot macro
van ban
& dé thay thé mot théng sé cila macro hay macro van ban
bang gid tri thuc cua chting.
4.6.1. Cac macro van ban
Ching ta c6 thé gan tén tuong trig cho mot chudi cdc ky ty va
sau d6 sit dung tén d6 dat wong vin ban cla chuong trinh nguén. Todn
tit gid TEXEQU duge ding dé khai béo mot macro van ban, ct phép
nhir sau:
name TEXTEQU
name TEXTEQU macrold|textmacro
name TEXTEQU %constExprChung 4: Lap tinh bang hop ngit 41
Trong dé, text 14 van bin - mot chudi cdc ky tw duge déng trong
cap dau <>, macrold 14 him macro duge khai bao truée, textmacro 1a
macro vin ban di duge khai b’o ude, va SconstExpr 1k mot bide
thie gid tri cha van ban, Dau % mé rong cdc macro van ban hay
chuyén déi cdc biéu thite hing sé thanh cde bidu dién van ban, Dudi
day 1A m6t sd vi du:
Vi dy 4.32:
msg TEXTEQU ; van ban dude gan cho tén msg
string TEXTEQU msg_ ; macro van ban gan cho tén string
msg TEXTEQU
: van ban mdi gan cho tén msg
value TEXTEQU %(3 + num)
- gid tri ca biéu thttc thé hién van
: ban gan cho value
erstr TEXTEQU 255>
;errstr = "expresion > 255, dau! cho phép dua <> nhu la mat
: phan cla gid tri van ban
Cac macro van bin thuan tign cho dat tén cde chudi van ban
khong déoh gid tri nguyén. Vi du, c6 thé sit dung mot macro van bin
dé dat tén mot hing s6 dau phay dong hodc mot biéu thie trong ngodc.
Dui day 1a vi du.
Vidy 4.33:
pi TEXTEQU = <3.1416> ) pi= <3.1416>
WPT TEXTEQU = ; mot chudi tir khéa
: duge dat tan
arg? TEXTEQU <|bp+4]> —_; biéu thic trong ngoac vuong
; duge gan tén.
a TEXTEQU << 3+4> as"3+4"
bTEXTEQU %3+4 be "7"
cTEXTEQU § %(3 +4) : "T"472 Gido trink K¥ thugt vi sat Ty
Cn phan biét céc chi din EQU dé chi dinh gid tri hang sé va sit
dung macro van ban, nhv trudng hop sau day:
num QU 4 num =4
numstr TEXTEQU <4> : numstr = <4>
aTEXTEQU = %3+num jas<7>
bTEXTEQU = %3 + numstr b=<7>
4.6.2, Cac thu tue macro
Néu chuong tinh phai thyc hi¢n mot nhiém vu nbiéu [dn thi ta c6
thé tranh phai viet ting dy lin nhiing phat bidu dé thuc hién trong
chuong trinh bing céch chi cain viet mot thi: tuc macro thay thé. Chang
han, khi thue hign véi nhiéu thi te, hay chuong tinh con, ching
thudng phai thue hien cat git mot s6 ni dung cdc thanh ghi vio ngan
xép nhiéu Jan, nhu:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
Khi 46 ta thuc hién tao m6t thi: tuc macro nhu sau:
push_abed MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
ENDM
Céc thu tue macro, hay thutng goi don gidn 1A ede macro, Ia co
ché ty dong phat sinh nhing van ban lip lai. Néi dén th tuc macro,
ude 14 phai cd goi dén tha tye macro, va khai béo mét thi tuc macro
cing tuong tu nhu khai bao mét thi tuc.Chung 4: Lap irinh bang hop ugt 473
a) Khai bdo cde macro (thi tue macro)
Ci phap khai bio mot thé tue macro niur sau;
name MACRO val1, val2,..., valn
ENDM
+) cac phat biéu
Phan binh Juan cla thd tuc macro phai bat dau bang dau +;
Trong d6, name 14 tn cla macro, vall, val2,..., valn 1a danh sach
cée bién gia tuy chon.
Vi du 4.34:
Dua ra mot chudi ky tu, chudi ky tu 1a mét bin macro.
write_msg MACRO ehuoi_kt
LOCAL
PUSH
PUSH
MOV
MOV
INT
POP
POP
JMP-
msg DB
Kthue:
ENDM
Vidu 435:
msg, kthue
AX
Dx
AH, 9
DX, OFFSET msg
21h
Dx
AX
SHORT kthuc
chuoi_kt.’$'
Chuong trinh cin dua ra tiéng beep méi khi xuat hign Si nao dé.
Nhu vay c6 thé viet mot thi tuc macro xdc dinh tiéng beep.474 Gido tinh KS thudt vi xtt 16
beep MACRO
MOV AH, 2 ;; chic nang DOS dua ra man hinh ma ky tu
ij trong DL
MOV DL, 7 ;; chon ma ASCII [a 7 (bell)
INT 21h — ;; goi chtfe nang DOS
ENDM
Vi dy 4.36:
Tro vé DOS bang INT 20h
go_dos MACRO.
(NT 20h
ENDM
Cae khai bio céc macro nén dé 6 déu chuong winh. Mot khi da
Khai bao thi tue macro, thi ching ta cé thé thuc hién thong qua tén cia
ching 6 bat ky diém no trong chuong tinh bing ci phdp goi thu sau:
name 11, r2,..., 1m.
Trong d6, name [a tén cua macro da duoc khai béo truée va rl,
12,...,m [A danh sach cde bién thye. Chang han, ta 6 thé thuc hién goi
tdi thyc hién 2 lan tha tue macro beep cho trong vi dy khi ¢6 1éi:
JAF error
beep
beep
ENDF
Hoae ggi tdi macro cho trong vi du 4.34 dé dua ra mot dong
thong béo trén man hinh, thi thue hign dong inh:
write_msg ‘Hello, world of the Microsoft macro’
6) Dinh nghia cde nhdn cuc bé trong cde macro
Toan tit gid LOCAL duge ding dé dinh nghia cdc nhan cuc bd
trong macro ngay sau dong MACRO, Vi du 4.34 ¢6 dinh nghia céc