鱼C论坛

 找回密码
 立即注册
查看: 2859|回复: 2

求助: 除法中断

[复制链接]
发表于 2011-9-16 19:38:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mт、__宠爱 于 2011-9-16 20:27 编辑

assume cs:code
                                                    ;data:db"overflow!"  不可以在这里定义,
                                                   ;因为执行完此程序后,空间会被释放,
                                                   ;而do0被放到了0:200处,它随时都会因为除法中断而被CPU执行
                                                  ;这样就很难保证do0程序从原来程序中取得要显示的字符串“overflow”
                                                   ;所以我们的字符串“overflow”也要放到安全空间中,防止释放
code segment                  
start:mov ax,cs
      mov ds,ax
   mov si,offset do0
   
   mov ax,0                                  ;为了防止do0段中的数据被覆盖,
   mov es,ax                               ;我们先将do0段中的代码存放到一个安全的空间中(0000:0200~0000:02ff)
   mov di,200h
   mov cx,offset do0end2-offset do0      ;offset只是为了更清楚的显示偏移地址
   cld                                                      ;用do0end2的偏移地址减去do0的偏移地址就得到了do0段的代码长度
   rep movsb
   
   mov ax,4c00h
   int 21h
   
do0:jmp short do0end                           ;注意:db "overflow!"
db "overflow!"                                       ;          jmp short do0end   
                                                             ;这样写是错的因为db "overflow!"它不是可以执行的代码
                                                            ;它只是为了定义“overflwe”这个字符串而存在的
do0end:                  
      mov ax,cs
      mov ds,ax
      mov si,202h   
                     
     mov ax,0b800h
     mov es,ax
     mov di,12*160+36*2
                                                           ;将字符串“overflow”送入显示缓冲区中
     mov cx,9
s:  mov al,[si]
    mov es:[di],al
    inc si
    add di,2
    loop s
   
    mov ax,4c00h
    int 21h
   
do0end2:nop                                    ;nop没有任何意义在这里只是为了知道do0段的代码长度

code ends
end start



为什么这个中断怎么好像不起作用啊,我先将除法溢出的程序和此程序编译了一下,然后执行了一下此程序在去debug了一下
除法溢出的程序,为什么还是Divide  overflow 啊   




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-16 21:52:06 | 显示全部楼层
本帖最后由 ytrfamli 于 2011-9-16 21:59 编辑

呵呵,LZ的中断例程确写入内存了,但忘记了要改写中断向量表,
第0号中断(除法溢出)也就因此不会受影响.

0000:0000 IP低 IP高 CS低 CS高
改写这四个byte指向你的除法溢出中断例程的入口(这个例子就是0:0200)就成了.
(结果在debug可以查看,应该是0000:0000 00 02 00 00)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-17 17:15:03 | 显示全部楼层
嗯嗯昨晚已将发现了 谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 06:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表