努力学习 发表于 2012-3-18 17:36:01

请教一个关与实验十二的问题

在实验十二中,当我们写好程序,进入dubug运行后,随便写一个溢出的程序就会显示我们自己的中断程序,但如果关掉debug在进入写一个溢出的程序,就不会显示我们的中断程序,这么说中断向量表不是只读存储?    为什么我们能改掉其中的一项,重新进入时又恢复原样?

wAterLoo 发表于 2012-3-18 17:36:02

本帖最后由 wAterLoo 于 2012-3-18 22:35 编辑

windows里面运行dos是虚拟出来的8086,打开一个dos窗口就会虚拟一次,你在里面操看到的内存地址其实并非内存的真正地址,也就是你第二次使用的dos窗口和第一次的dos没有一点一点联系,如果你在执行完内存中断程序,然后用q命令退出debug程序,记住,这时候别关掉dos窗口,继续用这个窗口运行你的溢出程,你会发现结果还在,而你关掉窗口后dos虚拟的这段内存可能已经被销毁了,而且打开的新的dos程序也不一定会分配到原来的内存空间
你修改的只是dos虚拟出来的中断向量表

wAterLoo 发表于 2012-3-18 18:09:46

本帖最后由 wAterLoo 于 2012-3-18 18:15 编辑

中断向量表里的值在修改后重启电脑前都是有效的
朋友,还是先贴出你的代码吧
我估计是你代码里面有些小问题
可能呢是你将中断向量表里面的除法中断的地址指向代码段的地址
你试试我的

assume cs:code code segmentstart:mov ax,cs      mov ds,ax      mov si,offset do0               ;设置ds:si指向源地址       mov ax,0      mov es,ax      mov di,200h                     ;设置es:di指向目标地址       mov cx,offset do0end-offset do0 ;设置cx为传输长度       cld                           ;设置传输方向为正      rep movsb       mov ax,0      mov es,ax      mov word ptr es:,200h      mov word ptr es:,0       ;设置中断向量表               mov ax,4c00h      int 21h do0:    jmp short do0start      db 'divide error!' do0start:mov ax,cs         mov ds,ax         mov si,202h                  ;设置ds:si指向字符串          mov ax,0b800h         mov es,ax         mov di,12*160+34*2             ;设置es:di指向显存空间的中间位置          mov cx,13                      ;设置cx为字符串长度s:       mov al,         mov es:,al         inc si         add di,2         loop s          mov ax,4c00h         int 21h do0end:nopcode endsend start



努力学习 发表于 2012-3-18 22:03:43

wAterLoo 发表于 2012-3-18 18:09 static/image/common/back.gif
中断向量表里的值在修改后重启电脑前都是有效的
朋友,还是先贴出你的代码吧
我估计是你代码里面有些小问 ...

不会呀,重新关掉dos,再进入就恢复原样了,你这个也一样,不信你试下

努力学习 发表于 2012-3-19 11:15:23

知道了,谢谢
页: [1]
查看完整版本: 请教一个关与实验十二的问题