程序如下(shy12.asm):
assume cs:code
code segment
start: mov ax,code
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end-offset do0
cld
rep movsb
mov bx,0
mov es:[bx],word ptr 200h
mov es:[bx+2],word ptr 0
mov ax,4c00h
int 21h
do0: jmp short begin
db 'Divide Error!'
begin: mov ax,0b800h
mov es,ax
mov ax,cs
mov ds,ax
mov si,202h
mov di,12*160+34*2
mov cx,13
next: mov al,[si]
mov es:[di],al
inc di
mov al,71h
mov es:[di],al
inc di
inc si
loop next
mov ax,4c00h
int 21h
do0end: nop
code ends
end start
用于产生溢出的测试程序如下(testint.asm):
assume cs:code
code segment
start: mov ax,65535
mov bl,10
div bl
mov ax,4c00h
int 21h
code ends
end start
调试如下:
先将中断处理程序装入内存,并将入口地址写入中断向量表。
D:\masm>shy12
D:\masm>debug
-d 0:0 f
0000:0000 00 02 00 00 8B 01 70 00-16 00 9E 03 8B 01 70 00 ......p.......p.
-d 0:200
0000:0200 EB 0D 44 69 76 69 64 65-20 45 72 72 6F 72 21 B8 ..Divide Error!.
0000:0210 00 B8 8E C0 B8 00 00 8E-D8 BE 02 02 BF C4 07 B9 ................
0000:0220 0D 00 8A 04 26 88 05 47-B0 71 26 88 05 47 46 E2 ....&..G.q&..GF.
0000:0230 F1 B8 00 4C CD 21 00 00-00 00 00 00 00 00 00 00 ...L.!..........
0000:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-q
D:\masm>
然后,运行测试程序:
D:\masm>debug testint.exe
-u0 a
0B60:0000 B8FFFF MOV AX,FFFF
0B60:0003 B30A MOV BL,0A
0B60:0005 F6F3 DIV BL
0B60:0007 B8004C MOV AX,4C00
0B60:000A CD21 INT 21Divide Error!
-t
AX=FFFF BX=0000 CX=000C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0003 NV UP EI PL NZ NA PO NC
0B60:0003 B30A MOV BL,0A
-t
AX=FFFF BX=000A CX=000C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0005 NV UP EI PL NZ NA PO NC
0B60:0005 F6F3 DIV BL
-t
Program terminated normally
-q
D:\masm>
这个中断处理程序,没有保护现场,也没有用到iret,是因为除法错后结束程序返回dos了,就无所谓保护现场也不需要返回断点了吧。
另外,还有两点模糊:
1.P75题中,IP前面的那个0000和2000是何值?
2.如何跟踪到中断处理程序中?引发中断后,硬件自动执行中断过程,将TF置0,从而无法单步执行了。
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50