+ -
当前位置:首页 → 问答吧 → 栈顶有一个B612不停的移动,为什么?

栈顶有一个B612不停的移动,为什么?

时间:2011-12-17

来源:互联网

我用下面代码在虚拟DOS下用debug观察压栈:
Assembly code

assume cs:code

    code segment

        mov ax,1001h
        mov ss,ax
        mov sp,0010h

        mov cx,60h  ;希望观察栈溢出
        mov ax,4444h
   s:   push ax
        loop s

        mov ax,4c00h
        int 21h
    code ends
end


发现栈顶有一个 B612不停的移动,为什么?
其次,我想观察栈溢出后的情况,但执行到sp=0004时,自动退出了loop。
为什么?
谢谢!

作者: hztj2005   发布时间: 2011-12-17

如果sp 值设置太小,那么就无法实现 指定次数的进栈。 每次进栈, 使用 d命令 查看栈内存,都会发现, 内存单元里的内容都 莫名其妙的发生改变,当然也包括 自己进栈的 内容。内存单元里的内容都 莫名其妙的发生改变,那么就导致 占用 自己那么 进栈 数据需要使用的内存。

可是,为什么会发生这种改变呢?

作者: wenxian8   发布时间: 2011-12-17

引用 1 楼 wenxian8 的回复:
如果sp 值设置太小,那么就无法实现 指定次数的进栈。 每次进栈, 使用 d命令 查看栈内存,都会发现, 内存单元里的内容都 莫名其妙的发生改变,当然也包括 自己进栈的 内容。内存单元里的内容都 莫名其妙的发生改变,那么就导致 占用 自己那么 进栈 数据需要使用的内存。

可是,为什么会发生这种改变呢?

我也是观察发现这个现象。原因不明。只能推测:
我们都不是在实模式下运行DOS,是保护模式下运行的虚拟DOS,可能是Windows 操作系统对虚拟DOS提供的一种标志。
慢慢探索吧。

作者: hztj2005   发布时间: 2011-12-17