注册 登录
编程论坛 汇编论坛

“NTVDM CPU遇到无效的”指令错误

chenaiyuxue 发布于 2009-09-22 20:48, 2782 次点击
如下一段程序:
assume cs: codesg

codesg segment

start:    mov ax, 2000h
    mov ss, ax
    mov sp, 0
    add sp, 4
    pop ax
    pop bx
    push ax
    push bx
    pop ax
    pop bx

    mov ax, 4c00h
    int 21h

codesg ends

end
在CMD下用DEBUG调试,为什么一单步运行到第一个pop ax就出现如题的错误?
15 回复
#2
zklhp2009-09-22 21:20
---------------------------
16 位 MS-DOS 子系统
---------------------------
Command Prompt - debug dostest.exe
NTVDM CPU 遇到无效的指令。
CS:0000 IP:0077 OP:f0 37 05 10 02 选择“关闭”终止应用程序。
---------------------------
关闭(C)   忽略(I)   
---------------------------

果然是这样~~~
#3
zklhp2009-09-22 21:20
为什么啊~~~
#4
zklhp2009-09-22 21:21
只有本站会员才能查看附件,请 登录
#5
zklhp2009-09-22 21:25
end start

这样对吗?
#6
chenaiyuxue2009-09-22 21:35
回复 5楼 zklhp
还是不行
#7
东海一鱼2009-09-23 08:07
assume cs: codesg
 
codesg segment
 
start:    mov ax, 2000h
    mov ss, ax
    mov sp, 0
    add sp, 4                     //糊涂啊,堆栈增长是向下的。怎莫能用‘+
    pop ax                        //直接'溢出'
    pop bx
    push ax
    push bx
    pop ax
    pop bx
 
    mov ax, 4c00h
    int 21h
 
codesg ends
 
end

所以        add sp, 4  -----> 改为: sub sp,4 或 add sp,-4 就好
#8
makebest2009-09-23 08:35
1  SS怎么可以任意设置值2000H ?
2  SP的确是应该往小减才可以POP
#9
东海一鱼2009-09-23 08:47
回复 8楼 makebest
在DOS VM下它当然可以任意设置SS,只是风格不佳罢了。
#10
zklhp2009-09-23 12:27
以下是引用东海一鱼在2009-9-23 08:07的发言:

assume cs: codesg
 
codesg segment
 
start:    mov ax, 2000h
    mov ss, ax
    mov sp, 0
    add sp, 4                     //糊涂啊,堆栈增长是向下的。怎莫能用‘+
    pop ax        ...

没想到~~~

偶把数改大了 貌似可以~
#11
东海一鱼2009-09-23 20:18
以下是引用zklhp在2009-9-23 12:27的发言:


没想到~~~

偶把数改大了 貌似可以~
老大,你改到多大可以了?
#12
zklhp2009-09-23 21:00
assume cs: codesg
 
codesg segment
 
start:     
    mov ax, 2000h
    mov ss, ax
    mov sp, 0
    add sp, 8
    pop ax
    pop bx
    push ax
    push bx
    pop ax
    pop bx
 
    mov ax, 4c00h
    int 21h
 
codesg ends
 
end start


这样就没出错~~~~
#13
chenaiyuxue2009-09-24 10:08
7楼的回答并不是出错的原因。这个问题还真有些诡异。。。到底是怎么回事儿呢
#14
东海一鱼2009-09-24 19:12
回复 12楼 zklhp
在DOS VM里+8还真能跑,不过在dos 7.1里面还是挂掉了。DOS VM的仿真度的还是有限啊。

#15
东海一鱼2009-09-24 19:22
回复 12楼 zklhp
是,虽然堆栈操作方式不对,但不是‘指令异常’的直接原因。


#16
zklhp2009-09-24 19:24
以下是引用东海一鱼在2009-9-24 19:22:32的发言:

是,虽然堆栈操作方式不对,但不是‘指令异常’的直接原因。

我认为是更改堆栈段造成debug异常~

不懂dos 不知道原因 还是请老大研究一下~~
1