Tailieuxanh Ky Thuat VI Xu Ly 1 Split 9 9386

You might also like

You are on page 1of 54
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, 04Ch 436 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 assembler Chuciag 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 dit 440. 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 xa 442 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 tue Clutong 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 data 444 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 doan Chung 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 END 446 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, AX Claong 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éi 448 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. 21h 450 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 start Chuong 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 dung 452 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 register Chuoug 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, OFh Chuang 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 21h 458 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 sector Chutong 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, 16 Gido 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 OX Chuong 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, CL 462 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 AX Chuomg 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 nhung 464 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 ENDP Chitung 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 nhat Chung 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_par 468 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 %constExpr Chung 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

You might also like