1) 思路:
可以參考第 13 章中的例子
2) int 7ch 中斷例程代碼:
文件名:exp132.asm
assume cs:code
code segment
start:
mov ax, cs
mov ds, ax
mov si, offset lp ; 設(shè)置 ds:si 指向源地址
mov ax, 0
mov es, ax
mov di, 200h ; 設(shè)置 es:di 指向目的地址
mov cx, offset lpend - offset lp ; 設(shè)置 cx 為傳輸長(zhǎng)度
cld ; 設(shè)置傳輸方向?yàn)檎? rep movsb
; 設(shè)置中斷向量表
mov ax, 0
mov es, ax
mov word ptr es:[7ch * 4], 200h
mov word ptr es:[7ch * 4 + 2], 0
mov ax, 4c00h
int 21h
lp:
push bp ; 將 bp 的值入棧斋攀,并且當(dāng)前棧頂 sp 改變 (sp)=(sp)-2
mov bp, sp ; 將當(dāng)前棧頂?shù)闹邓腿?bp 中
dec cx
jcxz lpret ; 如果 cx 為 0已卷,則不改變棧中的偏移地址淳蔼,直接返回
add ss:[bp + 2], bx ; ((ss)*16 + (bp) + 2) 就是棧中的偏移地址,加上位移鹉梨,就等于了 s 標(biāo)號(hào)處的地址
lpret:
pop bp
iret ; 未改變的棧中的偏移地址 或 改變了的棧中的偏移地址,此時(shí)也出棧
lpend:
nop
code ends
end start
3) 跟蹤程序代碼:
文件名:exp132d.asm
assume cs:code
code segment
start:
mov ax, 0b800h
mov es, ax
mov di, 160*12
mov bx, offset s - offset se ; 設(shè)置從標(biāo)號(hào) se 到標(biāo)號(hào) s 的轉(zhuǎn)移位移
mov cx, 80
s:
mov byte ptr es:[di], '!'
add di, 2
int 7ch ; 如果 (cx) != 0晌坤,轉(zhuǎn)移到標(biāo)號(hào) s 處
se:
nop
mov ax, 4c00h
int 21h
code ends
end start