You are on page 1of 51
Chitwnig 4: Lap wink bang hap ngi 489 Nhu vay cau lénh nay khéi tao bién var bang s6 24 (gid wi ua vé cua tinh giai thiva cla 4) Vidy 4.52: Co thé sit dung FOR dé xi ly cac théng s6 véi thuéc tinh VARARG trong ham macro xéc dinh truéc cha MASM 6.1: @ArgCount MACRO arglist VARARG 7. day la ca phap khai bao ham LOCAL count count = 0 FOR arg, count=count+ 4 — ;; tinh sé bién ENDM EXITM %count ENDM Hode trong ham xite dinh trude @Argl: Vi dy 4.53: @Argl MACRO. index:REG, arglist' VARARG LOCAL count, retstr retstr TEXTEQU <> 1 khdi tao count count =0 31 khdi tao chudi tra vé FOR arg, count = count + 1 IF count EQ — index retstr TEXTEQU EXITM ENDIF ENOM EXITM retstr 1s thoat khdi ham ENDM 490 Gido trink K¥ thud vi xit b) 4.6.4. Thu vién macro Trong thc t6, ngudi lap trinh phai goi dén nhiéu macro khée nhau, va néu nhu cdc macro nam rai rc 6 nhiéu noi khdc nhau thi sé khong hiéu qua cho viét chuong trinh ngu6n cing nhu khi tham chiéu dén cdc macro. Céc macro cé lién quan chic nang v6i nhau cé thé dat chung trong mot tép riéng, nhu thé dé tham chiéu dén tat céc cdc macro chi can cé lénh ghép (INCLUDE) tép thu vién macro dé vao chuong tinh nguén dat & dau chuong trinh, va cau lénh tham chigu dén cde macro c6 thé dat & bat ky ché nao trong chuong tinh. Thu vién macro li mét tép tin c6 tén phan mé rong JA MAC. Trong t@p thu vin cdc dong binh luan du tin 1a danh séch cdc macro - gOm tén, cdc tham sé (néu c6) va cong dung. Cc khai bao cla cdc macro 66 trong danh sch duge dat trong cfu triie diéu kién: IFA ; cac khai bao cac macro trong thu vién ENDIF Mot khi thu vign macro dugc ghép vio chuong tinh chinh (bing INCLUDE), tat cA cdc khai bdo macro cia thy vién sé xudt hién trong tép -LST do assembler tao ra, tham chf ngay ca khi thu vién duge tham chigu dén trong chuong tinh chinh. Dé tanh diéu nay, cdc khai bdo macro phai dat trong khung diéu kien IF] ... ENDIF. Nhu vay IFI chi dan assembler chi truy cp thu vign macro trong lan bién dich thit nhat khi cdc macro duge mé rong ma khong truy cp thém nia trong bién dich lén thit hai khi t¢p .LST duge tao ra, Vi dy sau day tao mot thir vin macro tén 1A mylib.mac gdm m6t s6 macro, Vidu 4.54: : Thu vién Macro cho MASM, tén tép [a mylib.mac ; Cc macro trong thu vién : head MACRO tieu_de?: cai tigu dé chuong trinh trong bd nhe ; go_dos MACRO: trd vé DOS bang INT 20h Chuong 4: Lap with bang hap ngit 491 > write_msg MACRO chuoi_kt?: dua ra man hinh chudi ky tur ;fead_bf MACRO dia_chi?: doc viing dém ban phim cd dia chi ; tai DS:dia_chi? ; mak_buf MACRO ten?,do_dai?: tao 1 vung dém nhap tif ban phim + d_char MACRO par?, dva 1 ky tyra man hinh : wite_r MACRO. dia_chi?: dua ra man hinh chudi ky ty & dia_chi? ;d_write MACRO the_file?,con_tro?: ghi 1 tép tin c6 thé I ; the_file? :d_read MACRO the file?,con_tro? : doc 1 tép tin cé thé la ; the_file? - create MACRO con_tro? : tao 1 tép tin trén dia ; open MACRO con_tro?,den_dau?: mé 1 tép tin trén dia ; close MACRO the_file?: déng tép tin c6 tén la the_file? ; Than eda thu vién macro IF4 ; Cac hang sé cila thu vien blank EQU 32 : dau cach hay khoang tréng comma EQU 44 ; dau phdy cR EQu 13 :vé dau dong LF EQU 10 ; chuyén dong EOF EQU 1Ah ; két thc tép tin esc EQU 1Bh , escape period EQU 46 i dau cham tab EQU 9 : nhay cach 8 khoang tréng ; Khai bao macro head head MACRO tieu_de? LOCAL qua_data JMP SHORT qua_data DB tieu_de? 492 Gidio tvinh KS thiege vi xi by qua_data: ENDM ; Khai bao macro go_dos go_dos MACRO iNT 20h ENDM ; Khai bao macro write_msg write msg MACRO chuoi_kt? LOCAL msg, kthuc PUSH AX PUSH DX MOV AH, 9 MOV DX, OFFSET msg INT 2th POP DX POP AX JMP- SHORT kthuc msg DB chuoi_kt.'$' kthuc: ENDM ; Khai bao macro read_bf read_bf MACRO dia_chi? PUSH DX MOV DX, dia_chi? MOV AH, OAh. INT 2th POP Ox ENDM ; Khai bao macro mak_buf Cluiong 4: Lap wink bang hop ugit 493 mak_buf MACRO __ ten?, do_dai? ten? DB do_dai? : 86 ky ty téi da DB ? ; cdc sé ky tu thc nhap OB do_dai?DUP(?); tao ving dém OB CR ; ky ty vé dau dong ENOM : Khai baa macro d_char | CG phap: d_char AL + in ra néi dung thanh ghi AL d_char “ yin ra hang sé d_char ; in ra ngi dung DL d_ichar MACRO par? IFNB PUSH DX MOV Dl,par? ENDIF MOV AH,2 INT 2th IFNB PoP DX ENDIF ENDM : Khai bao macro write_r write. MACRO dia_chi? PUSH Dx MOV AH,9 MOV DX, dia_chi? INT 2th 494 Gido tink K§ thudt vi xt ly POP ENDM DX ; Khai bao macro d_write + ghi tép tin c6 tén the_file?, con_tro? trd dén ving dém chita ; théng tin c&n ghi PUSH MOV IFNB MOV ENDIF MOV INT POP ENDM Ox DX, con_tro? BX, the_file? AH, 40h 2th DX ; Khai bao macro d_read ; doc tif dia véi thé tép tin d& duc gan trude ; con_tro? tré dén ving dém, CX chita sé byte cdn doc tu dia, | 08 CF = 1 khi c6 Idi doc PUSH MOV IFNB MOV ENDIF MOV INT POP ENDM Dx DX, con_tro? BX, the_file? AH, 3Fh 21h DX : Khai bao macro create | Con_tro? [a dja chi cia dudng dan tén tep Chuong 4: Lap trink being hop ngit 495 ; duéng dan tén phai két thiic bang 0 ; thé tép hay ma Idi ndm trong BX | et phap: create [Di] create PUSH DX PUSH cx Mov DX, con_tro? XOR CX, CX MOV AH, 3Ch INT 2th POP. Cx POP DX MOV BX, AX ENDM ; Khai bao macro open ; md tép tin trén dia dé chi doc ; BX chira thé tép the_file? hoac ma [31 ; con_tro? tré dén ving dém chia théng tin can ghi PUSH Dx MOV DX, con_tro? MoV AL,O : ehl doc, khéng ghi MOV AH, 3Dh INT 2th MOV BX, AX ; thé tép POP DX IFNB Jc den_dau? ENDIF ENDM ENDIF 496 Gido tinh K§ thuge vi xb ly Bay gid tao mot tép chuong trinh chinh dua ra théng bao mong muén. T8p c6 1én 1A hellos.asm. Trong tép nay dé sir dung duge cdc macro go_dos va write_msg cua thu vi¢n macro can phai cé dng toan tir gids INCLUDE mylib.mac Vid 4.55. TITLE loi_chao -MODEL SMALL INCLUDE — mylib.mac -CODE ORG 100h start: write_msg ‘Hello, world of the macro assembler’ go_dos END start Ciing c6 thé tao mot thu vién macro gém cde khai b4o cic macro nhung khéng déng khudn trong cu tric diéu kién IPL... ENDIF. Khi d6 trong chuong winh phdi cé dua vao déng lénh INCLUDE mylib.mae trong cau trie didu kién IFA INCLUDE mylid.mac ENDIF Vidu 4.56: Ket hop sit dung thu vign macro va thy vién cdc thi tuc, lip chuong trinh tén 1a typew.asm dé xem mét t ap tin wen man hinh, Chuong trinh su dung dinh ngitia doan day di. Chntong 4: Lap tinh bang hop ngit 497 PAGE 1132 TITLE TYPEW : chung trinh sir dung cdc macro: d_char, go_dos, head, ; Mak_buf, open, read_bf, ; write_r cla thu vién macro mylib,.mac va cac thd tuc cia thu vin ; get_one.lib {INCLUDE mylib.mac blk_siz EQU 512"20 ; kich thuéc khéi dir liéu doc vao code SEGMENT ASSUME _ CS:code, DS:code ORG 80h bufent DB? +86 ky tu trong dudi lénh buffer LABELBYTE ; vung dém tai 81h ORG 100h ; bat dau chugng trinh dang .COM start: head 'TYPEW' ; dua ra tigu dé chuong trinh ; ay dung tén cia tép CALL get_path ; goi dén thi tuc cia thu vién get_one.lib open Sl, error ; thd tuc mé tép tin cla thu vién ;get_one.lib ; doc tép tin, BX chifa thé tép tin newbuff: MOV CX, blk_siz ; lay s6 byte can doc d_read, ;dgc 1 tép tin 66 thé [d the_file? JC error 103 CF = 1 khicé Idi doc ; AX chifa sé byte vita doc tu dia 498 Gido trink KY thudt vi xirly OR AX, AX JZ exit ; hién thi viing dém tép tin via doc ra man hinh MOV CX, CX ; 86 ky ty'sé dua ra MOV SI, OFFSET datbuff CALL do_char; do_char 1a thd: tuc gan cua ; chung trinh JMP newbuff exit: go_dos ; tra vé DOS: error: write_r “Error’ ; hién thi bao Idi doc tép tin CMP AX, 2 JNZ e2 Write_r "Khéng tim thay tép tin” 22: go_dos : tham chigu thu vién eae thi tye INCLUDE — get_one.lib ; thd tue gan do_char xtrly ting byte cia tép tin | 86 két thc khi hét tp tin : input cho do_char: SI tré dén ving dém datbuff 1 CX = 86 ky ty can xirly do_char PROC newchar: MOV ODL, [SI] ; lay mét ky tu + d6i thanh ASCII bang cach sta bit thas AND DL, 7Fh CMP DL, EOF 1 d& két thie tép chva? Chuong 4: Lap trinh bang hop ugit 499 JE done ; két thie tép d_char + dua ky tu nay ra man hinh INC SI sky tu tiép theo LOOP newchar RET done: POP AX go_dos do_char ENDP. datbuff LABELBYTE s vung dém cho dif ligu doe tirdia code ENDS END start 5 két thie chuong trinh typew.asm 4.6.5, Cac toan tir gid PTR va LABEL @) Todn te PTR Chting ta da 06 dip sir dung PTR trong khai béo cc loai dit tigu. PTR duge sit dung chil yéu dé dinh lai kiéu da khai béo cia mét biéu thite dia chi. PTR c6 ci phép si dung nhu sau: type PTR address_expession Trong do, type [a kiéu cia dit lieu: BYTE, WORD, DWORD. Va bigu thie dia chi (address_expression) cé kiéu di theo IA DB, DW, va DW. Vi du khai bdo: data1 DB 15h data2 DB 25h va muén thyc hién chuyén gid tri datal vao AL, gid tri data? vao AH chi bang mot lénh: MOV AX, data 500 Gido trinh K¥ thuadt vi xit ly thi Ignh nay khong hop 1é, béi todn hang dich (AX) IA mét ti, cdn toan hang nguén datal lai dugc khai bao 1a mot byte. Dé hap 1é, ta phai ding lénh cé PTR: MOV = AX, WORD PTR data‘ Nhu vay AH nhan gid tri data2 = 25h va AL nhan gid tri datal = 15h. Trudng hgp sau day cling khong hop Ié: MOV [BX], 15h Vi khéng thé biét ngan nhé ma dia chi [BX] wd 16i 18 byte hay Ia tir, Dé hop lé, cn phai chi dinh ngiin nho 1a mot byte bang PTR, vA cau lénh sau day 1a hop Ié: MOV BYTE PTR [BX], 15h b) Todn tit LABEL Todn tt LABEL thudng ding dé dinh dang kiéu dir ligu nhimg cho phép gan cde dit ligu cé cing dia chi nham khac phuc mau thudn vé kiéu trong cdc lénh thao tc vot dit liéu. Trong vi du trén, néu khai bdo: datat DB 15h data2 DB 25h khéng thé ding duge cho lénh: MOV AX, data1 dé khac phuc truéng hop nay ta sir dung LABEL nby sau: dtt2. LABELWORD datal DB 15h data2 DB 25h LABEL chi dinh dtl2 14 mét bién tix, datal va data2 JA cdc bién byte, nhung datal va data2 duge gén cho cing mot dia chi mot tir, Nhu vay ding lénh sau day la hgp le: Chuicnrg 4: Lap tinh bang hop agit 501 MOV AX, dt12 ; AH = data2, AL = data1 Néu ta khai bdo khoan dir li¢u nhu sau: -DATA dtt DW 1525h dt2 LABELBYTE DW 3545h dt3 LABELWORD dt4 DB 45h dts DB 54h th} trong doan ma nhing lénh sau day: MOV AX, di2 ; khéng hap I6, vi dt2 khai bao la mét byte MOV AL, dt2 i hdp 1é, vi dt2 va AL 1a byte MOV = DX, WORD PTR dt2 ; hgp lé, vi dt2 khai bao lai 1a tl, DX = 3545h MOV CX, di3 [ hgp 16, vi CX va di3 déu la ti MOV AH, BYTE PTR dt2 i hgp |g, vi AH va dt2 la byte MOV BX, WORD PTR dt3 i hgp 16, vi dt3 la ti, BX = 5445h MOV DL, BYTE PTR dt3 ; hgp Ie vi dt8 khai bao lai la byte, DL = 45h LABEL cing c6 thé ding dé khai bdo dé ligu ki€u FAR trong nhing trudng hop nhu can tham chiéu dén dir ligu trong mot doan khac (FAR): databuff LABELFAR 4.6.6. Tham chiéu dén dir liéu trong mot doan khac Trong chuong tinh dang .COM ching ta cé thé dinh nghia mot doan dé ligu hoac mot doan ngan xép riéng biet dé tham chiéu toi. Tuy nhién, ciing c6 thé tham chiéu dén dit ligu chia trong mot doan khéc 502 Gido trink Ky thudt vi xi ty néu dua ra dia chi doan bang chi din AT (xem muc 4.4.7 (e)) trong cti phap khai bao doan day di: seg_name SEGMENT AT address seg_name ENDS Gia sir viét chuong trinh dang .COM tham chiéu dén ROM BIOS dé lay thong tin vé hé théng may tinh, nhu: ma s6 may, ngay san xudt ra ROM BIOS. Dé don gian, ta ldy hé thong IBM PC/AT 16-bit. Chuong trinh cé tén 1a ROMDATE.ASM. Vi du 4.57: ; chuong trinh doc ma sé may va ngay thang cia ROM BIOS ; cho cac loai PC : Cau tric dua ra 1a: : Ngay san xuat Ma sé Loai PC » 04/24/81 FF PC 1 10/19/81 FF PC : 10/27/82 FF PC : 11/08/62 FE PC XT, xach tay : 01/10/84 FC PC AT, 20 MB HDD ; 06/10/85 FC PC AT, 30 MB HDD ; 01/10/86 FB PC XT, ban phim 101 phim INCLUDE — mylib.mac ; Ving thd tuc ROM BIOS romdate SEGMENT AT OFFFFh : dia chi doan FFFFh cilia ROM BIOS ; cht ma sé mat, ngay sdn xuat , ROM BIOS. ORG 5 Chuiong 4: Lap tinh bang hop ugit date romdate code start: 503 LABELFAR ENDS ; doan ma chinh otia chuong trinh ROMDATE.ASM SEGMENT ASSUME — CS: code, DS: code, ES: code ORG 100h Mov AX, romdate ; Nap dia chi doan cla ROM BIOS ASSUME DS: romdate | chi dinh lai DS trd tai doan ROM ; BIOS MOV DS, AX MOV SI, OFFSET date ; dia chi nguén DS:SI trong doan ; ROM BIOS MOV Dl, OFFSET r_cate ; dia chi dich ES:DI trong doan code ; cla chung trinh ROMDATE MOV CX, OFFSET st_end - OFFSET r_date 3 86 byte sao chép dif ligu ngay ang cla ROM BIOS dén doan )1énh ma REP MOVSB. ASSUME DS: code ; chi dinh lai DS tré eting CS: code MOV AX, CS MOV DS, AX ; tré vé lai doan cia chudng trinh ; ROMDATE.ASM sau khi dé lay S04 Gido trinh K¥ thuat vi xit by i duge dif liéu ti’ doan cia ; ROM BIOS ; 06 thé la cac lénh xtrly dé in ra ; théng bao cac théng tin vé ROM ; BIOS va ma sé may go_dos macro tré vé DOS bang INT 20h ; vung dif ligu & day r_date DB 'xx/xx/87" st_end LABEL BYTE code ENDS END start Trong chuong trinh nay khai bao doan cita ROM BIOS chita cdc théng tin can lay: romdate SEGMENT AT OFFFFh; ORG 5 date LABEL FAR romdate ENDS Vi ngay sin xuat ROM BIOS 6 tai dé dich 5 so véi cua doan ROM BIOS (OFFFFh) nén can ¢6 lénh: ORGS ving dif ligu nguén date dugc khai b4o kiéu FAR nhd LABEL vi né lay theo dia chi co sd cla doan ROM BIOS (DS:SD, chuong trinh ROMDATE cia ta phai tham chiéu tdi ving dé li¢u nguén trong ROM. BIOS vé ving dit liéu r_date, dia chi trong ES:DI. ja chi c& so 4.6.7. Phuong phap xép chong doan Trong ché do dia chi gidn tiép thanh ghi, ndi dung cia cdc thanh ghi BX, SI, DI Ja con tro chi dia chi EA (offset), hay d6 dich so véi dia Chuong 4: Lap winh bang hop ngit 505 chi co sé doan trong DS, Nhung 6 thé dinh nghia dia chi cla ngan nhé bing gid tri offset trong cdc thanh ghi BX, SI, DI so véi co sé cia doan khéc (khong phai DS nhu binh thudng), Ca phdp cia lénh nay nhu sau: segment_register: [point_register] Vi du: MOV AX, ES:SI Todn hang nguédn cia Iénh nay 1a ngiin nhé cé dia chi trong cap thanh ghi ES:SI, trong do ES chtta dia chi co sd doan dif ligu, cdn ST 1a gid trj offset (1é ra, binh thuéng phai la cap DS:SI. Phuong phdp xép chéng nay cé thé thuc hién duge cho ca véi cdc ché do dia chi true Giép (gid tri dé dich 14 mot hang s6) va dia chi co sé. 4.6.8. Tao mot chuong trinh thudng tra trong bé nh Thong thudng mét chuong winh (mg dung chi duge nap vao bo nhé RAM Khi thuc hién va khi két thic, né a vé hé diéu hinh DOS hay Windows, Hé diéu hanh sé giai phéng ving nhé danh cho tinh img dang dé dé nap mét tinh ting dung khéc cé nhu cau thye hign. Nhiéu khi, dac bigt 14 nhing chuong trinh nhé thudng xuyén duge truy cap dé thuc hién, vi du, nhu cdc chuong trinh diéu khién vao/ra cdc ngoai vi (goi IA drives), hay ca hé diéu hanh phai duge dat thudng tri trong bd nhé chinh dé tang téc dé xit ly. Thudng tri trong bo ahd tic 1a khi két thtic thyc hicn chuong {rinh vin chiém gift ving nhé danh cho né. Cac chuong winh thudng trd goi tit la TSR (Terminate And Stay Resident), Dé khéng chiém nhiéu khéng gian nhé, cdc chuong trinh thudng tri phai nhd, khong Ién hon 64 kbyte. Ching cé dang .COM, va sit dung Iénh ngét INT 27h hay INT 21h véi ma chtic nang AH = 31h dé két thiic va thudng tr. Khi da thudng tri trong bé nhé, chi cn g6 tén chuong tinh thudng tri hoac sit dung mét 16 hop phim nao dé kich hoat la chay duge nd. 506 Gido trinh K§ thudt vi xa by Dé thuc hign duge lénh INT 27h, dat DX = do Ién cia phan thudng tra. Vi du 458: Chuong trinh trong vi du 4.55 cé thé duge vist dé dat thuéng tré trong bo nhé, start: pg_len TITLE loi_chao ‘MODEL SMALL INCLUDE mylib.mac -CODE ORG 100h write_msg ‘Hello, world of the macro assembler’ MOV Dx, OFFSET start - OFFSET pg_len INT 27h; két thie va G lai thuéng tra LABELBYTE END start Trong chuong trinh nay, c6 hai dong lénh dé dat thudng tri 1a: MOV INT DX, OFFSET start - OFFSET pg_len 27h — ; két thuc va & lai thudng tra Dong ddu dat DX bang 46 én cia phan chuong trinh duge thudng tri. Dong thif hai két thtic chuong trinh va 6 lai thudng tri, DO 16n phan thudng tri duge assembler tinh todn thong qua c4c nhan dia chi du (start) va dia chi cudi (pg_len). Vidu 4.59: LA mot cach tao ni dung DX dé thuéng tri code TITLE loi_chao INCLUDE — mylib.mac SEGMENT NEAR Chuiong 4: Lop tinh bing hop ugit 307 ‘ ASSUME CS; code, DS: code ORG 100h wrkt PROC NEAR write_msg ‘Hello, world of the macro assembler’ LEA DX, wr_kt —; ly gia tri dé dich (dia chi + hiéu dung) INT 27h _ két thc va 6 lai thudng tra wr_kt ENDP code ENDS END wr_kt Dé thyc hign duge ténh INT 21h voi AH = 31h, va AL = ma léi khi tra vé, va phai dat DX = kich thuéc doan tinh theo s6 doan, mdi doan cé kich thuéc bang 16 byte: Vidu 4.60: ; doan lénh dat thuéng tra bang AH = 31h, INT 21h MOV AH, 31h MOV AL, err_code ; ma Idi MOV DX, 100h ; kich thuéc bang 100h doan ; (1000h byte) INT 21h a) Cau tric ca chuong trinh thudng tré Cau tric cha mét chuong tinh thudmg tnd (TSR) gém cé hai phan phan biét thuc hién trong nhimg thi gian khdc nhau. Phan the nhat 1 phan cai dat, va chi thuc hién mot lan khi MS-DOS nap chuong trinh. Phan cAi dat thuc hign bat ky nhing nhiém vu khéi tao nao ma TSR yéu cdu va sau dé thodt vé DOS nhd chite nang két thc va 6 fai thudng tra. 508 Gido wink KJ thugt vi xut ¥5 Phan thi hai cia TSR goi Jd phan thudmg trd. N6 gém cd ma va di ligu nam lai bé nhé sau khi két thtic chuong trinh. Phan loai TSR thanh thu dong va tich cuc. b) TSR thu dong M6t cach don gian thyc hién mot TSR 14 chuyén diéu khién cho TSR mdt céch £6 rang tit mot chuong trinh khdc. Trong truémg hop nay TSR l& thu dong. Néu chuong trinh goi cé thé xde dinh duge dia chi viing nhé ctia TSR thi né cé thé cung cap diéu khién thong qua mot Ionh goi hay lénh nhdy xa. Thudng thi mot chuong trinh kich hoat TSR thu dong théng qua ngét mém. Khi dé, trong phan cdi dit cia TSR phai viét dia chi ciia phan thudng trd 6 vi tri phd hop trong bang véc-t0 ngil. Cac TSR thy dong thudng thay thé cdc ngdt mém. Vi du, mot TSR thy déng cé thé thay thé INT 10h phuc vu man hinh nhd 6 cdc 1i goi ghi doc man hinh véi su truy cap truc tigp vao b6 dém cia man hinh. Cac TSR thu dong cho phép tray cap gidi han béi ching thuc hien duge chi nh& mot chuong tinh khdc. Ching cé uu diém khi thue hién trong pham vi cita chuong trinh goi va gay tro ngai qué trinh khdc. c) TSR tich cue Mot phuong phap khdc dé thyc hign TSR la chuyén diéu khién cho TSR thong qua mot sy kign phan cimg, ching han nu dinh nghia truée mét chudi cée phim dn. Trong trudng hop nay TSR goi Ia tich cuc bdi vi né phai lvén luon tim kiém tin higu khdi dong. Cac TSR tich cuc c6 uu diém chinh 1a 6 kha nang truy cap clia ching. Ching nhan diéu khién tir bat ky mort tmg dung ndo dang hoat déng dé thuc hién va tra vé diéu khién theo yeu cdu. Nhung TSR phai 6 thém ma xdc dinh thoi diém thich hop dé thyc hign. Ma them dé gém mét hodc mot sé cdc chuong trinh con - goi la "xt fy ngat" (interrupt handler). Ciuong 4: Lap trink bang hop ngit 509 d) Cae chuong trinh con xit ly ngdt trong cdc TSR tich cuc Khoan thudng tra cla TSR tich cue gém 6 hai phin: phan thit nhat chifa than (body) cita TSR - code va dé liu thyc hién nhimg nhiém vu chinh cia chuong trinh. Phan cdn lai chita céc chuong trinh con xi l¥ ngat (interrupt handlers). Mét chuong trinh con xi ly ngdt (doi khi goi 18 phuc vu ngat) nhan diéu khién khi xuadt hien mot ngat dae biet, Nhung thuéng thi chutong tinh con cia TSR khong phuc vu cho ngat, ma thay vao dé né chuyén diéu khién cho chuong trinh con xt ly ngat co sé dé phuc vu ngdt. Méi mot chuong tinh con xi ly ngét trong TSR thue hién m6t hoac mot sO chiic nang sau day: kiém sodt cde su kién phan cting 6 thé phat tin higu yéu cau tdi TSR, theo déi trang thai cla he théng, va xc dinh yéu cau n&o phai dugc TSR phuc vu dia vao trang thai hién thi cia hé thong, Kiém sodt cdc su kién phan cing yéu cdu TSR phuc vu: ‘TSR tich cy thudng sit dung mot chudi cdc 4n phim hode su kién cia bd théi gian (timer) nhu [a tin higu yéu cdu phuc va. Nhu vay phai c6 chuong tinh con xir ly cde chuéi an phim. Chuong tinh xt ly dn phdm nhan diéu khién méi khi cé mot chudi cdc dn phim. Né kiém tra timg phim, tim kiém tin higu phi hgp hodc "phim néng". Khi phat hién 66 tin higu cia "phim néng", né chi don thudn thiét lap c& yeu cdu va thoat (exit) chuyén dén xi ly chudi cdc 4n phim tiép theo. Vidu 4.61: Mét TSR tich cyc kiém soat cdc phim &n théng qua chuong trinh con xit ly ngat INT 9, ngat cla ban phim: keybrd PROC FAR STI ; lap cd cho phép ngat PUSH AX + cat AX vao ngan xép IN AL, 60h 1 doc ma quét cla phim an ; vao AL qua céng doc ban him 60h 510 Gido rink K¥ thudt vi xit 19 CALL CheckHotKey ; goi thu tuc kiém tra ; phim néng AIF carry? :néu phim néng duge an keybrd ENDP Theo di trang thai ctia hé thong: Mot TSR ma sit dung cdc thiét bi phan ctmg nhu dia hose man hinh thi khong thé ngét khi thiét bi dang tich cuc. TSR theo doi thiét bi nhd xir ty ngat thiét bi dé, Méi chong trinh con xir ly ngdt thiét lap c& béo thiét bi dang duge sit dung va sau 46 x6a cd khi xu ly ngat thue hién xong. Chi nhimg thiét bi dugc TSR st dung méi can cé theo dai. Vi du, mot TSR thyc hign vao/ra véi thiét bj dia phai theo déi su sit dung dia thong qua ngét INT 13h, Chuong trinh con xt ly ngar dia thiét lap c@ tich cuc dé bdo dia dang ban nhim ngan chan su thyc hién cla TSR trong khi dang cé thao téc vao/ra dia. Néu khOng, thao t4c vao/ra dia cua chinh TSR sé lam thao tac vao/ra dia dang xay ra va chuyén dich dau tir, diéu nay din dén vige thao tac dia bi ngimg sé iep tuc véi dau tir bi dinh vj khong ding khi TSR wa digu khién vé cho chuong trinh bi ngat, Xe dinh yéu cdu dé TSR phuc vu: Mot khi chuong trinh con khi nhan duge tin hiéu yéu cau téi TSR, n6 kiém tra cdc cd trang thai dang tich cuc, néu cé bat ky cd ndo duge thiét lap thi chuong trinh con loai bd yéu cdu va thoat vé. Nhung néu cdc c& bi x6a, chung tinh con goi TSR thong qua lénh goi (xa hodc gan), Vi di 4.62: Chuong trinh ALARM.ASM dua ra loa tiéng beep vao thdi gian bao thie dinh ra bang cach dua vao déng Iénh: ALARM time trong dé time [i bign thdi gian dat bao tht, vi du néu dat 7:45 AM thi vict: Chuong 4: Lap trinh bang hop ngit su ALARM 0745 bién time duge chuong trinh tiép nhan khi ta gd dong lénh nay. Ngat thdi gian INT 8h duge xt ly G day, Chuong trinh két thic va G lai thudng trd bang chife nang 31h cha INT 21h. Mot ngat thoi gian xuat hién 18,2 lan trong 1 s hodc 91 lan theo tig 5 s. MODEL TINY ; tao ALARM.COM .STACK : mac dinh ng&n xép c6 1 kbyte CODE ORG 5Dh ; tai dO dich 5Dh cia PSP : (mao dau eta chung trinh) | 66 bién thei gian + (xem muc 4.4.8) countdown — LABELWORD ; dinh kiéu ti cho gia tri ; khodng cach 5 gidy dé quay i vong lap «STARTUP ; bat dau chueng trinh thyc + hign 6 day (dia chi ddu) JMP Install 7 nhay téi phan cai dat ; dif liéu phai n&m trong doan ma dé dug Install tham chiéu OldTimer DWORD ? ; dia chi etia chuang trinh xf ly thai gian géc tick_91 BYTE 1 : dém 91 nhip cho 5 giay TimerActiveFlag BYTE 0 , 08 tich cy cho chuong trinh + con xtfly thai gian ; NewTimer - chuong trinh con xif ly théi gian theo INT 8h ; Decrements CountDown titng § giay. Khéng cé tac dong gi ; trong khi Count Down chufa dat duge gid tri 0, ma 4 dé phat ; loa kéu. Day la doan xirly ngAt théi gian méi thay cho thd tue ; xir ly thai gian (dém thai gian) géc cla ROM BIOS (bang INT 8): 512 Gidio trink Ky thuat vi xit ly NewTimer PROC FAR AF CS: TimerActiveFlag !=0 i néu bé thdi gian ban ; (bidu thttc khac 0) JMP CS: OldTimer ; thi nhay dén chung trinh i thai gian géc chi dinh CS la ; dia chi doan co sé (CODE) ENDIF INC CS: TimerActiveFlag ; |p ed active PUSHF ; Gat cdc cd vao ngan xép CALL CS; OldTimer + 99i xa ti chugng trinh thdi ; gian géc stl ; lp 68 cho phép ngat PUSH DS. PUSH CS POP DS MOV tick_91, 91 ; x0a bé dém thi’ hai va DEC CountDown ; trit khong cach 5 giay AF zero? ;néu da lp 91 lan CALL Sound + 990i dén dua ra loa INC TimerActiveFlag ; bao d& dua ra loa, tang cd -ENDIF -ENDIF DEC TimerActiveFlag ; POP DS ; IRET 3rd vé tu xd ly ngat thai gian NewTimer ENDP ; Dua ra loa tiéng kéu beep véi khoang cach BEEP_TONE EQU 440 ; tn sé 440 Hz ciia ting beep Chuoug 4: Lap tinh bing hap ngit 513 BEEP_DURATION EQU 6 ; S6 nhip cia beep, véi 18 : nhip bang xp xi 1 gidy Sound PROG USES AX BX CX DX ES ; toan tir gia USES ding ; trong khai bao PROC chi i dinh tén cac thanh ghi dugc ; sf dung trong thd tuc va phai duge et gid truéc tién MOV AL, OB6h ; Khdi tao channel 2 cla chip ; timer OUT 43h, AL ; c6ng cla channel 2 cla chip 3 timer MOV DX, 12h ; chia 1193180 Hz MOV AX, 34DCh ; (tan sé nhip déng hd) cho MOV BX, BEEP_TONE _ ; tans yéu cau DIV. BX ; két qua la sé dém nhip : thdi gian OUT 42h, AL ; byte thdp cda sé dém dua ra ; chip thai gian MOV AL, AH : byte cao cla sé dém OUT 42h, AL ; dua ra chip thdi gian iN AL, 64h ; doc gia tri tit cdng 61h OR AL3 ; thiét lap 2 bit dau tién dé OUT 61h, AL ; bat loa ; Binh khodng thdi gian cho beep loa MOV AX, BEEP_DURATION SUB CX, CX ; CX: DX = sé tich cho ; khoang nghi MOV ES, CX + tr ES dén ving dif ligu ADD DX, ES:[46Ch] ; eOng 86 tich vao CX:DX 5l4 Gido trinh K¥ tuedt vi xt ty ADC CX, ES:{46EH] : két qua la s6 dém trong ; CX:DX -REPEAT MOV BX, ES:[46CH] | Rap lai MOV AX, ES:[46EH] SUB BX, OX ; dat dug thdi gian SBB AX, CX JUNTIL ‘carry? IN AL, 64h : khi d& hét ap XOR AL,3 OUT 61h, AL ; tat loa RET Sound ENOP ; phan nap Install PROC DEFAULT_TIME § EQU 3600; d&t mac dinh thi gian bao sthite la 1 gid MOV AX, DEFAULT_TIME cwD ; DX:AX = théi gian mac dinh ; tinh theo giay IF = BYTE PTR CountDown !=" ; néu khéng phai bién tréng XOR CountDown|0], ‘00° ; déi 4 byte cia bién ASCII XOR = CountDown(2], ‘00' ; thanh sé nhi phan MOV AL, 10 :nhan chit s6 (digit) dau tien ; ba gid vai 10 MUL BYTE PTR CountDown[0} ; va céng thém chit sé thi 2 ADD BYTE PTR CountDown[1]: Chong 4: Lap trinh bang hop ngit 518 MOV BH, AL ; BH = gid dé bao tat MOV AL, 10 ; lap lai thé tye cho phut MUL BYTE PTR CountDown[2] ;nhan chi sé dau tién cia 7 phut véi 40 ADD BYTE PTR CountDown[3] : va cong thém chif s6 the 2 cla phut MOV BH, AL , BH = phut dé bao tat MOV AH, 2CH ; yéu cdu chifc nang 2Ch cho y INT 21h INT 21h han thai gian (CX = thoi + gian gid/phat) MOV DL, DH SUB DH, DH PUSH DX : c&t DX = sé gidy hién hanh MOV AL, 60 + nhan sé gid hién hanh véi 60 MUL CH , dé chuyén thanh s6 phat SUB CH, CH ADD CX, AX ; cong sé phut hién hanh véi két qua 1 CX = 86 phot tirnita dém MOV AL, 60 han gi bao thi vdi 60 MUL BH ; 4 chuyén thanh sé phat SUB BH, BH ADD AX, BX AX = sd phut tirntra dém dé dat ; bao thitc SUB AX, CX ; AX = thdi gian tinh theo phut 4é lap AF carry? , néu thai gian la ngay hom sau ADD AX, 24*60 ; céng sé phut cla mét ngay -ENDIF 516 Gido trinh KV ited vi sit MOV BX, 60 MUL BX ; DX:AX = sé phut dé lap POP BX : phuc héi sé gidy hién hanh SUB AX, BX ; DX:AX = sé giay dé lap ; truGe bao thie SBB DX,0 ; bao thi tich cue IF carry? :néu gia tri am MOV AX,5 : dit 5 giay cwD -ENDIF -ENDIF MOV BX, 5 : chia kt qua cho 5 gidy DIV BX | AX = 86 khodng cach 5 gidy MOV CountDown, AX —_; dé lp tru6c khi dua ra loa MOV AX, 3508h : d&t chtte nang 36h ; (lay véc-te ngat) INT) 21h ;nhan vée-te ngat cia timer ; (INT 8) MOV WORD PTR OldTimer(0], 8X MOV MOV Mov INT ; et dia chi cia thi tuc xirly yngat thdi gian géc cha ; ROM BIOS WORD PTR OldTimer[2], ES AX, 2508h ; chic nang 25h + (48i véc-to ngat) DX, OFFSET NewTimer ; DS:DX trd dén tha tuc xi ly ; théi gian mdi 21h 1 dat véc-td ng&t méi cho : NewTimer Clucong 4: Lip trink bang hop ngit $17 MOV DX, OFFSET Install ; DX = s6 byte cfia phan : thudng tra MOV CL, 4 : chia cho 16 byte (dich phai 4 bit} dé chuyén SHR DX, CL ; thanh 6 paragraphs : (1 paragraph = 16 byte) INC) DX Ong thém 1 paragraph MOV AX, 3100h ; chtfe nang 31h, ma lai AL = 0 INT 21h ; él thc va thuéng tra Instalt ENDP END ‘Trong chuong trinh nay, chu ¥ rang: hing sé BEEP_TONE dé dat 4m cho bdo thitc. Cac gid tri 4m thutmg trong dai tir 100 dén 4000 Hz. Tht tuc nap (Install) dénh dau diém bat dau cia phin nap cla chuong tinh ALARM.ASM. Sy thuc hién bat déu @ day khi chuong trinh ALARM.COM duoc nap vio bo nhé. Mot TSR thutng dat phén ma nap vao bo nhé cla n6é sau phan thuémg tré. Bai vi phén nap chi thyc hién mot lin, Dé thuc hién thd tuc xi ly ngat théi gian méi phai két hop sir dung hai chic nang cha DOS (INT 21h) dé 18 lay véc-to ngét (AH = 35h) va déi véc-to ngdt (AH = 25h). Ta c6 thé thay déi hoat dong cia mot thi tuc cha ROM BIOS (cdc tha tue xir ly ngat) hay cla DOS bang c4ch gén mét gid wi mdi cho véc-to ngat tuong tmg (déi véc-to ngat), wic 1a cho véc-to ngat cla thi tuc ROM BIOS hay DOS tré dén dia chi cia thd we xir ly ngét do chting ta lap trinh dat 6 mot ving nhé khéc. Cach lam an toan 1a ding ham 25h cla INT 21h, Dé thuc hién déi véc-te ngat phai thuc hién thit tu nhu sau: 1, Dat DS:DX = gid tri méi_ cho véc-to ngat - 18 dia chi cha thi tuc do lap trinh tao méi STB . ‘GUO trink KF thudt vi xit I 2. Dat AL = s6 higu ngit g6c cha ROM BIOS, AH = 25h 3, Thuc hign INT 21h. Nhung dé cé thé tr lai xir 1f ngdt binh thudng cho ROM BIOS hay DOS trade khi thyc hién déi véc-to ngat phai thuc hién lay véc-to ngat cd (AH = 35h) dé cét gift, nh’im sau phuc héi ngiit géc cha ROM BIOS. Dé thu hién lay véc-to ngat phai thuc hién thi ty nhu sau: 1, Dat AL = s6 higu ngat gdc cla ROM BIOS, va AH = 35h 2. Thuc hién INT 21h Keét qua tra vé cia cdc lénh nay 1a cap thanh ghi ES:BX = dia chi thi. me.xi ¥ ngdt géc cha ROM BIOS twong tng_véi sO higu ngat trong AL. Trong truéng hop vf du 4.60. Thi tuc dém thdi gian cla ROM BIOS cé s6 hiéu ngat 1A 8 (INT 8), do dé ta c6 c&c lenh lay vée-to ngat: MOV AX, 3508h___; dat chtfe nang 35h (lay vée-ta ngat) INT 2th ;nhan vée-tc ngat cila timer (INT 8) MOV WORD PTR OldTimer{0], BX : et dla chi cla chuang trinh xi ly ngat 3 théi gian géc MOV WORD PTR OldTimer{2], ES. Tiép sau lay véc-to ngat 1a ta phai déi véc-to ngat dé trd tdi thi tue xitl¥ thdi gian méi: MOV AX, 2508h___; chife nang 25h (dé! véc-ta ngat) MOV DX, OFFSET NewTimer ; DS:DX tré dén chudng trinh xi ly thi 3 gian méi INT 2th ; d&t vée-ta ng&t méi cho NewTimer Nhu vay sau khi déi véc-to ngat, véi ngét INT 8h, mdy sé nhay téi thi tuc xtr ly théi gian méi NewTimer dé thuc hién. Module xtr ly ngat thdi gian cla chuong trinh ALARM.ASM Ia thi tuc NewTimer, Chuong 4: Lap tink bang hop ngit 519 nbung phan nap thuémg tri lai [a tha tuc Install, vi vay phai lay kich thyéc cha doan thudng td tinh theo sé Paragraphs (mdi paragraph bang 16 byte), bang.cée lenh: . - MOV DX, OFFSET Install ; DX = s6 byte cia phan thudng tru MOV CL,4 ; chia cho 16 byte ( tuong dudng dich phai :4 bit) a8 SHR = DX, CL ; chuyén thanh s6 paragraph + (1 paragraph = 16 byte) INC. DX , c6ng thém 1 paragraph MOV AX, 3100h —_; chit ning 31h, ma Idi AL = 0 INT 21h | két thc va thuéng tra e) Tach TSR khdi b6 nhé Nhiéu khi cén phai tach TSR khdi bd nhé (deinstalt), trA lai bo nhé cho hé théng ma TSR chiém git. Chuong trinh téch (deinstall program) tru6c hét phai tim TSR trong bé nhé thong qua dia chi yéu cu. Khi tim thdy TSR, chuong tinh tach so s4nh cdc dia chi trong bang véc-to ngat véi cdc dia chi cha cdc chuong trinh con cia TSR. Trong trudng hop khong tring dia chi thi chyong trinh tach ngan cém yéu cdu tach TSR. Néu tring dia chi thi qu4 tinh tach TSR duge tiép tuc thuc hién, Qué trinh tach TSR khdi bd nhé thudng gém cé 3 bude: 1. Phuc héi cho bang véc-to ngét cdc véc-to ngat cla chuong trinh xir ly ngat géc 2. Doc dia chi doan ct & offset 2Ch cia mao dau PSP cia chuong trinh TSR. Dia chi nay té dén khéi thong tin (danh sféch céc bién) ma MS-DOS sao chép vao b6 nhé khi nap mot chuong trinh, Dat dia chi khéi vio ES va vio AH mi chic nang DOS 49h (gidi phong kh6i nhé) dé tra kh6i nhé (ma TSR chiém doat) cho hé diéu hanh. 3. Thuc hién chite nang DOS véi AH = 49h, ES = dia chi cla khdi nhé, 520 Gido trink K¥ thugt vi xit by 4.6.9. Viét cdc dng dung 32-bit 4) Dinh kiéu b6 nh6 va khai béo cde doan Dé viet cc chuong trinh tng dung 32-bit bing hop ngif cé thé str dung cc todn tu gid cho cdc khai bo cdc doan don gidn héa. Chang han sit dung todn tir gia .386 cho phép lap trinh cho céc hé thong vi xu ly tt 80386 dén Pentiums. Tiép sau phai ding todn tlt MODEL véi kiéu bO nhé FLAT. Ching han mgt chuong tinh 32-bit cho kiéu bo nhé FLAT va sit dung cée goi chudn dén cdc that tue qui uée trong he diéu hanh Windows NT (stdcall) ta ding cdc khai béo ban & ddu chuong trinh nhu sau: 386 -MODEL FLAT, stdcall -STACK size_in_byte -DATA CODE : - ; ec chi dn c6 thé véi cdc dia chi va cac thanh ghi 32-bit Ngodi céc thanh doan 16-bit: CS, DS, BS, SS cdn cé hai thanh ghi doan dit lign bé sung trong cdc vi xit fy 32-bit 1a GS va FS. Trong ché d6 thyc (8086), danh dia chi cha vi xit ly 32-bit duge thue hién nhu cac vi xi ly 16-bit, ttc 14 dia chi g6m 2 phdn, phan co s& doan 16-bit trong céc thanh ghi doan va phan offset 16-bit nam trong cdc thanh ghi chung hay gid tri hang sé. Van dé lap trinh trong ché do thuc khong Khdc gi va hoan ton nhu cho vi xt ly 16-bit nh 8086/8088. Trong do dg bao ve, céc thanh ghi dogn khong ding tryc tiép nhw 1a mot gid tri dia chi co sé doan ma 1a chi s6 trd t6i bang "chon" (table of selectors), trong 46, méi mot thanh ghi chon mé t4 mét khdi nhé gém cA céc thudc tinh nhu kich thuéc, vi tri cita khéi, va cdc quyén truy cap (doc, ghi, thuc hién). chi EA cua ving nhé duge bang cong gid tri offset so v6i dia chi cd sé cita kh6i nhé mo t4 béi Iya chon. Chung ta xét vn Chucoug 4: Lap trinh bang hop ngit 521 dé danh dia chi vdi co ché diing cific Iya chon va mé ta & ché dd bao ve cla cdc vi xi ly Intel 32-bit 6 chuong 2, muc 2.4. ‘Trong khai béo doan day di (xem muc 4.4.7), kiéu use trong toan tir gia SEGMENT nham xc dinh kich thuée cla doan chi ding cho 80386/80486. Trong dé, use cé thé 1a: USR16; chi dinh do dich 1& 16-bit (ding trong ché d6 thyc 8086) USE32: chi dinh d6 dich Ia 32-bit (ding trong ché do bao vé) FLAT: danh dia chi 32-bit, khong phan doan, dung lung nhé ti da 4 GB Cc chi dinh kich thuéc nay cé thé ding trong khai bao c4c doan don gian héa, Cy thé: Néu ding: MODEL .386 —; hodic .486 ‘Thi USE16 la mac dinh. Néu ding: 386; ho&ic 486 MODEL ‘Thi USE32 Ia mac dinh. b) Cat giit néi dung céc thanh ghi vao ngdn xép Bat dau tir 80186 dén Pentiums cé c4c Iénh PUSHA va POPA thuc hién cat gitt vio ngan xép va phuc héi ti ngan xép néi dung cia lat cd cdc thanh ghi chung 16-bit cia vi xir ly. Thif tu cat git cdc thanh ghi (PUSHA) nhu sau: AX, CX, DX, BX, SP, BP, SI, va DI riéng ndi dung cia SP dugc day vao ngan xép 1a gid tri cé truée khi thanh ghi ddu tién duge c&t gitt (AX). Tht ty phuc héi (POPA) nguge lai: DI, SI, BP, SP, BX, DX, CX va AX 522 Gido trink K3 thude vi xt b§ Dé cat giita cdc thanh chung nhung 32-bit thi sit dung PUSHAD va POPAD Thanh ghi co cing thutng duoc cat gidwao.ngan xép trong cdc thao tc goi thi tuc. C6 céc Iénh cat giit va phuc héi thanh ghi cd 16- bit: PUSHF va POPF, va céc lénh cat gitt va phuc héi thanh ghi cd 32- bit trong cdc vi xit ly Intel 32-bit: PUSHFD, POPFD. Néu nhu khong céin phai cat gid ton bO ndi dung thanh ghi cé ta c6 thé sit dung lénh LAHF dé nap va cat gift byte th4p cia thanh ghi cd vao thanh ghi AH. Lénh SAHF phuc héi lai byte thap cia thanh ghi cd ti AH. 4.6.10. Truy cap dir liéu bang con tré véi toan th gia TYPEDEF Con trd truy cdp di liu 14 mot bién chita dja chi cha mot bién kh4c nao 46, Dia chi trong con trd trd dén mot d6i tuong khdc. Sir dung c4c con tré thuan tién khi thuc hién chuyén mot 46i tuong dit lieu 1én (nhu mang dé ligu) dén mot thi tuc. Bai vi khi 46 thi tuc goi chi cfn dat con trd 6 trén ngan xép, ma thi tuc bi goi sir dung dé xéc dinh mang dit ligu. Cé su phan biet gitta m6t dia chi xa va mot con tré xa. dia chi xa la dia chi cia bién nam & mot doan dif li¢u khdc. Cdn con trd xa 1a bién chita dia chi doan va dé dich cia dif liéu tham chiéu. Gidng oh bat ky mot bién nao, con trd cé thé nam 6 doan dit ligu gan (mac dinh) hodc doan xa. Khai bdo con tré: Toén tir gia TYPEDEF c6 thé xdc dinh cdc kiéu cla cdc bién trd, C6 phdp nhu sau: typename TYPEDEF _[[distance]] PTR qualifiedtype Trong d6, typename 1a tén cla kiéu cha TYPEDEF (PBYTE, PWORD, NPBYTE, NPWORD, FPBYTE, FPWORD,PPBYTE....). Distance c6 thé 1a NEAR hodic FAR. Qualifiedtype c6 thé 1a bat ky kiéu dit ligu nao cla MASM (DATA, WORD, DWORD.,...). hay cia TYPEDEF (PBYTE.,...) Chutong 4: Lap trinh baig Hop ngit 523° Vi du 4.63: PBYTE TYPEDEF PTR BYTE ; tré dén cdc byte NPBYTE TYPEDEF NEAR PTR BYTE + con trd gan tré dén cac byte FPBYTE TYPEDEF FAR PTR BYTE ; con trd xa trd dén cdc byte PWORD TYPEDEF PTR WORD i tré dén cdc tir NPWORD TYPEDEF NEAR PTR WORD . + con tré gan trd dén cdc tir FPWORD TYPEDEF FAR PTR WORD icon td xa trd dén cde tir PPBYTE TYPEDEF PTR PBYTE ; trd d&n con trd trd cdc byte : (trong C, mét mang ; eae chudi) PVOID TYPEDEF PTR 3 trd dén bat kiéu dir ligu nao PERSONAL STRUC > kiu cdu trac name BYTE 20 DUP(?) num WORD ? PERSONAL ENDS PPPERSON TYPEDEF PTR PERSON 3 tr dén kigu.cdu tric Khoang cdch (distance) cla con tr cé thé dugc dat hoac ty dong xc dinh ty dong truéc nhé kiéu b6 nhé (bing MODEL) va kich thuéc doan (16 hoac 32-bit). Néu khong ding MODEL dé Khai béo kiéu bd nhé thi cdc con tré gin 1A mac dinh. 524 Gido trinh K¥ thudt vi sat ly Trong ché 46 16-bit, con trd gén gém 2 byte chita dé dich cla Gi tung duoc tr, Con trd xa cfin phai c6 dd dai 4 byte: ca do dich va co s6 doan. Trong ché 46 32-bit, con tré gan 18 4 byte va con tré xa 1a 6 byte. C6 thé khai bdo bien trd bing mot kiéu tré tao boi TYPEDEF. Vi du 4.64: Array WORD 25 DUP (0); mang tir Msg BYTE “This is a sstring", 0 pMsg PBYTE Msg 34rd dén chudi pArray PWORD Array 1 trd dén mang ter opMsg NPBYTE Msg ; rd. gan dén chudi npArray NPWORD = Array ; tr8 gn dén mang tir fpArray FPWORD Array 3 4ré xa d&n mang tir fpMsg FPBYTE Msg } trd. xa dén chudi $1 BYTE “first”, O ; chudi ky ty $2 BYTE "Second", 0 $3 BYTE "third", 0 pS123° PBYTE $1, $2, $3, 0 ; mang cdc con tré trd dén ; cdc chudi ppS123 PPBYTE ps123 + con tré trd dén cdc chudi Andy PERSON <> ; bIén cau trac pAndy PPERSON Andy 3 tt} dén bién c&u trac Con iré tinh va dong: Nhiing khai béo con tré trén day déu 1a con tré finh, ttc 14 td dén dia chi tinh cua d6i tu¢ng dit ligu. Nhung thudng con tré phi rd dén dia chi dong, tite 1 dia chi phu thugc vao diéu kign cta théi gian chay. Vi du, MS-DOS phan phdi b6 nhé theo ham 48h cua INT 21h, va cde dia chi trong céc chi din thuc hign chudéi nhu SCAS ” CMPS, Nhting trudng hgp nay cdn khdi tao con tré déng. Chuoing 4: Lap tinh bang hop ngit 525 Vidu 4.65: fpBul FPBYTE 0 MOV AH, 48h : chife nang phan phéi bé nhé MOV BX, 10h ; cn 16 paragraphs INT 2%h ; Call DOS JC error ; Return segment trong AX MOV WORD PTR fpBuf[2], AX : nap co sd doan (offset da dat bang 0) error: y xi ly 138i Sao chép cdc con tro: Déi khi m6t bién «rd cdn phai dugc khdi tao nhd su sao chép tir con tré khdc, Cé hai céch sao chép mot con tr xa: Vi du 4.66: fpBuf1 FPBYTE ? fpBuf2 FPBYTE ? ; $ao chép théng qua cac thanh ghi MOV AX, WORD PTR fpBuft[0} MOV WORD PTR fpBuf2[0], AX MOV AX, WORD PTR fpBuft[2] MOV WORD PTR fpBuf2[2], AX : sao chép théng qua ng&n xép, khéng can dung thanh ghi PUSH WORD PTR fpBuf1[0] PUSH WORD PTR fpBuft [2] 526 Gio trink KF thudit vi xit POP WORD PTR ‘pBur2[2] POP WORD PTR fpBuf2[0] Cdc con ird la cde bién (arguments): Nhv 1a mot bign dif ligu, con tr 66 thé due chuygn cho thd tuc khéc, vi du bing ngan xép. Vi du 4.67: ; d3y vao ngan xép con tré xa PUSH WORD PTR fpMsg[2] : cat gitt co sé cla ngan xép PUSH WORD PTR fpMsg[0] : cat gill offset : ddy vao ngan xép dia chi xa nhu la con trd xa MOV AX, SEG fVar PUSH AX ; cat co sé doan MOV AX, OFFSET fVar; PUSH AX : edt offset Nap con iré xa vdo cap thanh ghi: Cé6 thé ding céc chi din LES va LDS dé nap con trd xa vo cap thanh ghi, trong dé, ty thap cia bién tro chuyén vao ES hay DS, ti cao cia bién tr6 nap vao thanh ghi chi dinh trong chi din LES hay LDS. Vidu 4.68: OutBuf BYTE 20 DUP (0) fpOut FPBYTE — OutBuf LES DI, fpOut ; nap con tré xa fpOut vao cap thanh ghi :ES:DI Chute 4: Lap rin bang hop ngit 527 4.6.11. Nap cdc dia chi vao cdc cap thanh ghi Thutmg xuyén trong chuong trinh hgp ngit chting phai thyc hién nhitng thao t4c nap dia chi vio ede thanh ghi. Déi vdi cdc dia chi gan (cing trong mot dogn) thi chi cfn nap gid tri dO dich 16-bit (offset) vao mét thanh ghi chung ndo dé dig cing cap véi thanh ghi doan nio dé tao dia chi thc 20-bit cla ving nhé, Nhung ddi voi nhimg dia chi xa (ddi hoi 2 12), ching phi nap tir dia chi cot sé doan vao thanh ghi doan va tir gid tri dé dich yao mot thanh ghi chung ding cap vi thanh ghi doan. Cé qui dinh thuéng ding nhimg cap thanh ghi segment: offset dé danh dia chi b6 nhé nhu sau: DS:SIL dia chi nguén cho cdc lénh chudi ché do 16-bit DS:ESI dia chi nguén cho cac lénh chudi ché do 32-bit ES:DI dia chi dich cho cdc lénh chudi ché do 16-bit ES:EDI dia chi dich cho cde lénh chudi ché 46 32-bit DS:DX dia chi vio cia m6t s6 chtte nang DOS (vi du déi vée-to ngiit) ES:BX dia chi ra cla mot 86 chic nang DOS (vi du Idy vée-to ngat) CSIP dia chi cla Ignh trong doan ma ché do 16-bit CS:EIP dia chi cia lénh trong doan ma ché 46 32-bit SS:SP hoic SS:BP dia chi ngan nhé trong ngin xép ché do 16-bit SS:ESP hoac SS:EBP dia chi ngan nhé trong ngin xép ché do 32-bit Cfc Iénh tham chiéu dén bd nho doi khi cdn phai chi r6 cap thanh ghi dia chi chang han: MOV AX, ES:[BX] ; AX < [ES:BX] ES: MOV AX, [BX] ; AX < [ES:BX] MOV AX, CS:[BP] ; AX < [ES:BP]

You might also like