关于《汇编语言》王爽版的又一个问题,P88

yoshubom 2006-09-11 10:19:07
代码如下:

assume cs:codesg
codesg segment
mov ax,2000H
mov ss,ax
add 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

编译并link之后生成EXE文件t1.exe,我用debug t1.exe 并使用命令T进行单步调试,但是执行到第一个POP AX的时候出现了错误程序自动退出。请高手们帮看看这段程序有错吗?小弟初学汇编。
...全文
601 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
paullbm 2007-03-03
  • 打赏
  • 举报
回复
这里作者提前介绍了一下中断的问题。
也就是说:中断在搞鬼!!
保定风云软件 2007-02-27
  • 打赏
  • 举报
回复
楼上原来是大亮兄。大亮解释得很准确、简洁。
主要是debug程序中的t命令程序中用到系统的中断,在调用之前,把CPU现场保存在当前栈中,但是当前栈只有4个字节大小,不够用,所以,当系统终端完成后恢复原来的CPU现场时出现了错误。可以把当前栈的空间扩大来解决这个问题。
randaliang 2006-09-12
  • 打赏
  • 举报
回复
因为单步中断涉及到压站,同时sp=4所以不够用了 ,出现了错误
wankong 2006-09-12
  • 打赏
  • 举报
回复
是啊,和我说的意思一致啊,正是因为程序涉及的地址被系统保护了,所以才会弹出异常嘛。
yoshubom 2006-09-12
  • 打赏
  • 举报
回复
呵呵,确实是打错了,不过我觉得应该是 “安全地址”的问题,

assume cs:codesg
codesg segment
mov ax,0H ;<----将地址设置为安全地址
mov ss,ax
mov sp,200H ;<----书上P111说的,0:200 ~ 0:300 是安全地址
add sp,4
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00H
int 21h
codesg ends
end

这样就不会出错了。^^
shuiyunjianlw 2006-09-11
  • 打赏
  • 举报
回复
你的程序我調試了一下,有同樣的問題.正在解決.有結果相告....
yoshubom 2006-09-11
  • 打赏
  • 举报
回复
我是按照书上一步步写的,2000H赋值是可以成功的。小弟初学,请高手说得再直白一点。
Peter_Cheung 2006-09-11
  • 打赏
  • 举报
回复
mov ax,2000H
mov ss,ax

stack 初始化會不會有問頭? 2000h這個位真的可以用?
建議還是編做.com吧
wankong 2006-09-11
  • 打赏
  • 举报
回复
上面的最后结果,我发错了,这个数值不确定的,主要观察SP的值就好了,AX和BX的值是2000:0到4之间的值。
wankong 2006-09-11
  • 打赏
  • 举报
回复
不好意思,首先你的程序是否打错了原书中是mov sp,0。
我进行过调试,同样在pop时出现问题,初步可能和保护模式有关,这里对于栈的弹出会造成异常。我在DOS下调试不会出现错误,ax和bx的值均为0。
yoshubom 2006-09-11
  • 打赏
  • 举报
回复
呵呵,多谢shuiyunjianlw,期待你的回答,谢谢。

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧