忏悔 发表于 2012-9-18 13:06:25

关于栈的问题

例如这段代码:
assume cs:code
code segment
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        dw 0,0,0,0,0,0,0,0
       
start:
        mov ax,cs
        mov ss,ax
        mov sp,32
        mov bx,0
        mov cx,8
        s:push cs:
          add bx,2
          loop s
          
          mov bx,0
          mov cx,8
        s0:pop cs:
           add bx,2
           loop s0
          
           mov ax,4c00h
           int 21h
code ends
end start
实际运行后 ss地址是在ds末尾,也就是说这两个段是连续的,好,那么问题来了,我每次往ss段push的时候都有其他数据产生在sp前面,也就是当我push到第6、7个的时候,所谓的(其他数据)已经把我之前ds段末的数据给覆盖掉了,而后面再push的话不能push正确的值。
求教大虾能帮忙解惑,为什么每次push之后都有所谓的“其他数据”在sp的前面呢?

梦幻羽羽 发表于 2012-9-18 13:30:47

呵呵   楼主好~

问题:

为什么每次push之后都有所谓的“其他数据”在sp的前面呢?

分析:   首先,你要看看这个是个特殊的列子。   

            1,你要清楚,ds与ss的区别,
       ds 是 数据段,是存放程序的要用到的数据的段地址,    ss 是 栈段。是存放栈的段地址
            
            2,(假设)ds,里有8个数据。分别是 00h,11h,22h....77h(十六进制)   那现在看看ds 和ss ,如果在一个段中。   sp执行 77h 的下个内存单元地址,   每次 push一次,那会怎么样呢   ?    呵呵,那当然是把原来的 ds 数据给覆盖了
               

梦幻羽羽 发表于 2012-9-18 13:31:52

这样就会错误了 。

希望能帮助你   bye~

仰望天上的光 发表于 2012-9-18 13:48:34

1.LZ为什么知道每次push的时候sp前面都有其它数据呢?显然LZ用了单步调试
2.单步调试为什么执行完一条命令会停下来不继续往下执行?因为单步调式执行完一条命令后调用了一段中断处理子程序
3.被调用的这个 中断处理子程序里使用到了堆栈,当然,push了几次就pop了几次
4.这样,push进去的值破坏了原先的数据.但是pop后并不会恢复原先的值,仅仅是修正了sp
5.LZ知道为什么了吧

忏悔 发表于 2012-9-18 14:27:40

梦幻羽羽 发表于 2012-9-18 13:30 static/image/common/back.gif
呵呵   楼主好~

问题:


你理解错了,我ds和ss只是连续的,但并不是相等的,我所说的每次push之后都会有莫名其妙的“其他数据”在我push地址的前面,也就是说我还没push完就把之前准备要push的值给覆盖掉了

忏悔 发表于 2012-9-18 14:30:59

仰望天上的光 发表于 2012-9-18 13:48 static/image/common/back.gif
1.LZ为什么知道每次push的时候sp前面都有其它数据呢?显然LZ用了单步调试
2.单步调试为什么执行完一条命令会 ...

额,我还没学到中断处理子程序那里,不过听你的理解是指我sp前面的“其他数据”实际上是中断处理子程序吧?也就是说我若不用单步调试的话,sp前面就不会出现所谓的"其他数据"?被调用的中断处理子程序使用的栈一定是我ss这个栈么?

贝壳 发表于 2012-9-18 16:03:49

鱼C版主果然是高手。学习了。

仰望天上的光 发表于 2012-9-18 18:33:54

忏悔 发表于 2012-9-18 14:30 static/image/common/back.gif
额,我还没学到中断处理子程序那里,不过听你的理解是指我sp前面的“其他数据”实际上是中断处理子程序吧 ...

是中断处理子程序。就算你没学过也用该知道,程序能够停在那边不往下执行一定是 调用某些代码了 ,这些代码将使用堆栈,从而破快你 原来的数据。
页: [1]
查看完整版本: 关于栈的问题