redliu 发表于 2011-5-26 12:22:41

P118.asm代码可能有误,求解!

就是逆序存放的那道题:按你把堆栈设为8个字单元,用debug跟踪到压栈中bx=000c时值开始出错,但用g到mov bx,0这行时值能正常到栈中,同样出栈中bx=0003时开始出错!
如把栈的值改到10个字单元时,压栈不出错,出栈会出错;栈设为16个字单元时没有问题,请解答一下为何会出现这种现象?

china0008 发表于 2011-5-27 17:43:55

源码贴出来看看。

redliu 发表于 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:
               add bx,2
               loop s

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

               mov ax,4c00h
               int 21h
code ends
end start

tawtg 发表于 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章,才反映过来应该是这个问题造成的。

tawtg 发表于 2011-5-28 17:05:49

忘记说了,如果你把堆栈加大6个字节以上,就不会出现用debug调试出错的问题。
页: [1]
查看完整版本: P118.asm代码可能有误,求解!