Board logo

标题: 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


  Quote:
之后没有返回指令,下一条指令可能非法;  就算有返回指令,由于修改了栈顶指针,也可能返回到一个非法指令处。  这就是原因所在...

我也同意楼上的观点,可是楼主说执行到第二条指令出错,怎么在我的机子上一点事也没有
稍加修改了一下用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
也许是刚学汇编,很多东西都不懂.

  Quote:
调试器会在程序栈上或两条指令之间插入一些数据或指令,而程序擅自修改了栈指针,可能因此导致调试器的数据遭到破坏,故而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...