鱼C论坛

 找回密码
 立即注册
查看: 3571|回复: 4

[争议讨论] P118.asm代码可能有误,求解!

[复制链接]
发表于 2011-5-26 12:22:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
就是逆序存放的那道题:按你把堆栈设为8个字单元,用debug跟踪到压栈中bx=000c时值开始出错,但用g到mov bx,0这行时值能正常到栈中,同样出栈中bx=0003时开始出错!
如把栈的值改到10个字单元时,压栈不出错,出栈会出错;栈设为16个字单元时没有问题,请解答一下为何会出现这种现象?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-27 17:43:55 | 显示全部楼层
源码贴出来看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-28 11:10:06 | 显示全部楼层
本帖最后由 redliu 于 2011-5-28 11:11 编辑

assume cs:code,ds:data,ss:stack
data segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
    dw 0,0,0,0,0,0,0,0
stack ends
code segment
                       start: mov ax,stack
                                 mov ss,ax
                 mov sp,10h
                 mov ax,data
                 mov ds,ax
                 mov bx,0
                 mov cx,8
                  s:    push ds:[bx]
                 add bx,2
                 loop s

                 mov bx,0
                 mov cx,8
                   s0:  pop ds:[bx]
                 add bx,2
                 loop s0

                 mov ax,4c00h
                 int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-28 17:05:00 | 显示全部楼层
首先说明以下内容是自己理解的。
这个问题隐藏的非常严重,主要是由于DEBUG里面的t指令引发的单步中断,使你的堆栈溢出了。
每次执行t指令都会进行一个中断过程(第十二章 239页)。
进入中断程序时产生的pushf,push CS,push IP三个指令会占用你堆栈的6个字节;
而从中断程序出来时产生的pop IP,pop CS,popf三个指令同样需要6个字节。
就是因为这个原因,使程序在使用DEBUG调试时产生溢出错误。而正常运行时没有问题。:)

其实我也是看见你提的问题debug看了一下发现错误,而今天刚好学完12章,才反映过来应该是这个问题造成的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-28 17:05:49 | 显示全部楼层
忘记说了,如果你把堆栈加大6个字节以上,就不会出现用debug调试出错的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 20:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表