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
ENDM490 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 20hChuong 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_bufCluiong 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 2th494
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 tepChuong 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
ENDIF496 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 dia498 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, data500 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éc502 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 5Chuiong 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é layS04 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 diaChuong 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 NEARChuiong 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 60h510 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 beepChuoug 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:DX5l4
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
-ENDIF516
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
: NewTimerClucong 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éiSTB . ‘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 vnChucoug 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 AX522 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:DIChute 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]