根号3 发表于 2011-12-23 14:39:59

百思不得起解!求大虾帮忙。。。(解决)

本帖最后由 根号3 于 2011-12-25 14:05 编辑

题目是这样的:
把 程序提供的8个字单元顺序放到 DW 0,0,0,0,0,0,0,0 中,用上栈
程序开头制定这样:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0

我的程序如下:


assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0
start:
mov ax,codesg
mov ds,ax
mov ss,ax;栈的段地址在AX 中
mov sp,0h
mov bx,10h
mov cx,8
s:pop ; 出栈,将SP指向的内存地址数据送到便宜地址为BX 的内存单元中!
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start

请各位大牛帮我看看! 我的实现方案完全OK! 完全正确 ! 为什么执行到add bx,2 的时候 程序就死亡了?
到底哪里错了???
DEBUG 的调试信息如下:
http://bbs.fishc.com/data/attachment/album/201112/23/1437468ugcv7ggpddp0yg1.jpg




ytrfamli 发表于 2011-12-23 20:20:31

阿,记得几个月前曾经有网友遇到类似的问题...来!再贴一次当时的回答,呵呵.

汇编语言论坛asmedu.net上mess网友的解答:
在虚拟dos下,当sp过小,比如4,在执行t命令时会发生程序错误,
这个涉及到後面学习的中断和系统保护,把sp设置大些就行了。

"中断和系统保护"指的是你使用DEBUG调试的时候,栈里面会压入额外的东西,
所以,虽然说你的解法逻辑上行得通,运行时应该都会崩溃

另外,栈的机制是,推栈则SP减少,出栈则SP增加,
因此我们可以把SP视成是表示栈内空间大小的一个数值
你初始化SP时给0,那就等於说是预设栈已经满了

无论如何,这样的想法还是漫有创意的,值得鼓励,呵呵.

根号3 发表于 2011-12-25 13:48:52

是在太感谢了~~~~~~~~总算解除疑问~~~

根号3 发表于 2011-12-25 13:49:25

ytrfamli 发表于 2011-12-23 20:20 static/image/common/back.gif
阿,记得几个月前曾经有网友遇到类似的问题...来!再贴一次当时的回答,呵呵.

汇编语言论坛asmedu.net上mes ...

是在太感谢了~~~~~~~~总算解除疑问~~~
页: [1]
查看完整版本: 百思不得起解!求大虾帮忙。。。(解决)