|  | 
 
| 
本帖最后由 mт、__宠爱 于 2011-9-16 20:27 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 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 啊
 
 
 
 
 
 | 
 |