标题: 16位dos汇编的棘手问题
[打印本页]
作者: 20024804
时间: 2007-6-13 03:17
标题: 16位dos汇编的棘手问题
mcode segment
assume cs:mcode
start:
main:
mov sp, 0000h
mov sp, 2000h
mov sp, 5000h
mov sp, 0a000h
mov sp, 0f000h
mov sp, 0fffeh
mcode ends
end start
这个程序很奇怪,在windows下的dos可以运行,可是在真正的纯dos下却会出错.可是理论上不该出错的
作者: 20024804
时间: 2007-6-13 04:27
运行环境特殊,这只是部分测试代码
好像单独放出来不会出错
现在怀疑是调试器td的问题
如有哪位明白dos是如何截获非法指令的或者dos是如何修改内存布局的(dos7.1把高端内存移到低端等)请跟帖
作者: 本是
时间: 2007-6-13 08:25
INT 6是处理非法指令的中断,KILLER.EXE能截获非法指令,但它是直接返回DOS。当然,也可能将处理改成忽略错误、继续执行。如果需要改,发站内短信。
作者: 本是
时间: 2007-6-13 08:26
INT 6是处理非法指令的中断,KILLER核心中断处理我可以只用2个字节,继续执行的处理只需1个字节。加上驻留预处理,总共只需3、40字节。当然是不带版本、作者信息的纯执行核心版!
Last edited by 本是 on 2007-6-13 at 08:30 AM ]
作者: 20024804
时间: 2007-6-13 13:41
mov sp或者之类的修改sp的指令可能触发什么中断吗?
好像不应该触发吧
作者: 20024804
时间: 2007-6-13 14:36
不能上传附近
现在极度怀疑是td的bug
因为恰好引起down机的非法指令在两条指令之后
当前的mov sp指令是绝对不会有问题的
作者: 本是
时间: 2007-6-13 15:06
应该说,SP的修改有时会对调试器产生致命“打击”,我以前也碰到过实机正常运行的程序引起调试器或虚拟机shutdown的情况。
作者: 本是
时间: 2007-6-13 15:15
1楼的代码编译执行在2003的CMD窗口,得到出错信息:
90 BA
FCB unailable
Abort, Fail?
但加一行INT 20H就能正常执行。
作者: 20024804
时间: 2007-6-13 20:00
原来是这样啊
实在是太感谢你了
作者: 20024804
时间: 2007-6-13 20:01
抱歉,那只是部分代码片段
如果要这段代码不出错,加个
mov ah,4ch
int 21h
也可以的
作者: henrya2
时间: 2007-6-15 21:19
把完整的源代码贴出来
另外你是用什么模式编译的,最好把Stack段定义贴出
作者: henrya2
时间: 2007-6-15 21:26
我在Virtual PC用DOS的DEBUG命令调试好像没有问题.
作者: henrya2
时间: 2007-6-15 21:35
稍加修改了一下代码,用Tiny模式(COM文件)编译
我在Virtual PC用td调试没问题????
作者: henrya2
时间: 2007-6-15 21:36
没有给出完整的源代码和编译模式和调试环境,我也是刚学汇编语言.实在不明白
作者: henrya2
时间: 2007-6-15 21:41
怎么我不管怎么样单步,断点,直接运行,td都没有出错????????????????
作者: taowentao
时间: 2007-6-15 21:59
main:
mov sp, 0000h
mov sp, 2000h
mov sp, 5000h
mov sp, 0a000h
mov sp, 0f000h
mov sp, 0fffeh
之后没有返回指令,下一条指令可能非法;
就算有返回指令,由于修改了栈顶指针,也可能返回到一个非法指令处。
这就是原因所在...
作者: henrya2
时间: 2007-6-15 22:21
之后没有返回指令,下一条指令可能非法; 就算有返回指令,由于修改了栈顶指针,也可能返回到一个非法指令处。 这就是原因所在...
我也同意楼上的观点,可是楼主说执行到第二条指令出错,怎么在我的机子上一点事也没有
稍加修改了一下用Tiny模式编译
mcode segment
assume cs:mcode,ds:mcode,ss:mcode
org 100h
start:
main:
mov sp, 0000h
mov sp, 2000h
mov sp, 5000h
mov sp, 0a000h
mov sp, 0f000h
mov sp, 0fffeh
mov ah, 4ch
int 21h
mcode ends
end start
Last edited by henrya2 on 2007-6-15 at 10:24 PM ]
作者: taowentao
时间: 2007-6-15 22:50
调试器会在程序栈上或两条指令之间插入一些数据或指令,而程序擅自修改了栈指针,可能因此导致调试器的数据遭到破坏,故而DOWN机...
如果不用调试器,仅执行这几条指令不会出现任何问题。
作者: henrya2
时间: 2007-6-15 23:01
可我用td并没有出错
作者: henrya2
时间: 2007-6-15 23:09
也许是刚学汇编,很多东西都不懂.
调试器会在程序栈上或两条指令之间插入一些数据或指令,而程序擅自修改了栈指针,可能因此导致调试器的数据遭到破坏,故而DOWN机...
如果不用调试器,仅执行这几条指令不会出现任何问题。
不是很明白
作者: netwinxp
时间: 2007-7-25 20:01
你修改了堆栈偏移量指针到关键部分,当DEBUG时,如果堆栈段地址SS在高位,这很可能导致堆栈指向ROM段,结果当然是死机,当SS在低端,发生堆栈操作时可能会破坏DOS关键数据表的数据,结果当然也是死机。
作者: sunx
时间: 2007-7-26 13:29
用官话来说就是: 无效的sp值可能导致不可以预料的后果
并且,程序有头无尾
作者: zyl910
时间: 2007-8-6 16:07
启动EXE时,DOS将返回地址放在sp[0]
现在你修改了sp...