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

王爽《汇编语言》 第四章 实验3 的问题?

guancracker 发布于 2007-05-14 14:05, 2048 次点击
assume cs:codesg
codesg segment
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
把上面的程序保存为QQ.ASM文件,将其生成QQ.EXE 这个我会。
下面问题来了。
用DEBUG 跟踪 QQ.EXE 的执行过程,(即在CMD下bebug qq.exe 然后,T单步 查看寄存器和栈顶的内容)
TT单步执行 pop ax 时,出现 NTVDM CPU 遇到无效指令 对话框。
这是什么原因啊????
9 回复
#2
菜鸟上路2007-05-14 16:11
assume cs:codesg
codesg segment
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
红的可以去掉,用系统默认的,如果自己定义堆栈的话,要声明堆栈段
stack segment
db 100 dup(?)
stack ends
assume code:codesg, ss:stack
codesg segment
mov ax, stack
mov ss, ax
codesg ends
#3
guancracker2007-05-14 16:43
谢谢你!
我找到原因了。试验了一个下午。
mov ax,2000h
mov ss,ax
mov sp,0 ;栈顶为2000:0

(到这里系统会中断,会把标志寄存器,CS ,IP的值在栈顶为2000:0
处压入,可以通过d 2000:fff0 查看到;)
add sp,4 ;栈顶为2000:4

( 到这里系统,会把标志寄存器,CS ,IP的值在栈顶为2000:4 处压入,丢失IP 值)
改为add sp,6 程序正常运行。

[此贴子已经被作者于2007-5-14 17:20:25编辑过]

#4
爱以走远2007-05-14 20:36
呵呵 还有就是你进栈和出栈错拉哈
lz还是先理解一哈入栈和出栈哈
是先进后出
#5
guancracker2007-05-14 21:04
哪里错了呀。  可以说说吗?
#6
爱以走远2007-05-14 21:28
pop ax
pop bx
push ax
push bx
pop ax
pop bx
先进后出 你看你是不是先进后出呢
#7
guancracker2007-05-14 21:55
当然了,但那个代码是交换 AX 和BX的值。
#8
爱以走远2007-05-14 22:07
哦  那不好意思  
#9
菜鸟上路2007-05-15 12:30
好象现在的32位程序的程序入口点处一般都有add sp, 4,不知道是不是和这有冲突?
#10
guancracker2007-05-15 12:43

不清楚呀。

1