汇编网首页登录博客注册
sissim的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
友情链接

[2010-02-12 21:03] 实验12

程序如下(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,从而无法单步执行了。
评论次数(0)  |  浏览次数(575)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码