|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 啊
|
|