+ -
当前位置:首页 → 问答吧 → 栈段的问题

栈段的问题

时间:2011-03-23

来源:互联网

问下各位,这代码是王爽汇编6.2节的 在代码段里使用栈。

利用栈,将程序中定义的数据逆向存放。

我在debug了几次。

程序指向的SP是从20H 一直往上 1E ,1C ,1A,18,16,14,12,10

在第二循环s0的时候 然后sp往上加10-12-14了  

书上说是dw开辟了32个字的内存空间。为什么程序不往上继续? 

Assembly code

assume cs:code
code segment
    dw 123h,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:[bx]
    add bx,2
    loop s
    
    mov bx,0
    mov cx,8
    
s0:    pop cs:[bx]
    add bx,2
    loop s0
    
    
    mov ax,4c00h
    int 21h
    code ends
end  start
 




作者: StillMiss   发布时间: 2011-03-23

栈段真不熟,那个只看得懂那个push 寄存器,pop 寄存器

发现栈跟其他内存段之间的交互看的迷糊。大侠们帮我解惑下吧!

作者: StillMiss   发布时间: 2011-03-23

push操作一次,sp-=2;
pop操作一次,sp+=2;
程序开辟了32个字空间给栈,栈指针只能在这空间里push/pop,如果空间过小, 则会产生越界(上溢/下溢)

作者: masmaster   发布时间: 2011-03-23

引用 2 楼 masmaster 的回复:
push操作一次,sp-=2;
pop操作一次,sp+=2;


所以程序一直在dw定义的8个字空间做交换?

它是先把前面的dwdw 123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

push进后面的8个字空间,然后在把数据倒过来?但是操作的还是后面8个字空间?

这么理解对吗。

作者: StillMiss   发布时间: 2011-03-23

debug到
mov ss,ax
mov sp,32
的时候, 你查看一下栈段里是什么?
-dss:0 
然后到
s: push cs:[bx]
的时候 , 你观察ss段以及sp的变化

。。。

s0: pop cs:[bx]
的时候, 你再观察ss段和sp的变化, 

这是debug一个简单程序必备的步骤, 通过观察各个寄存器以及内存地址的变化,才能感性的理解汇编。

作者: masmaster   发布时间: 2011-03-23

引用 4 楼 masmaster 的回复:
debug到
mov ss,ax
mov sp,32
的时候, 你查看一下栈段里是什么?
-dss:0
然后到
s: push cs:[bx]
的时候 , 你观察ss段以及sp的变化

。。。

s0: pop cs:[bx]
的时候, 你再观察ss段和sp的变化,

这是debug一个简单程序必备的步骤, 通过观察各个寄存器以及内存地址的变化,才能感性的理解汇编……


说到点子上了!!!!!

作者: va_zaixuexi   发布时间: 2011-03-23

-d ss:0 查看内存里的内容 前面定义的8个字型数据全部没变 
但是后面的8个字型值改变了。 为什么这个时候变了啊。这里就做了个sp=32的动作啊、

作者: StillMiss   发布时间: 2011-03-23

引用 6 楼 stillmiss 的回复:
-d ss:0 查看内存里的内容 前面定义的8个字型数据全部没变
但是后面的8个字型值改变了。 为什么这个时候变了啊。这里就做了个sp=32的动作啊、

嗯, 那当然啦,你不是把CS里的两段dw的空间都给SS了嘛

作者: masmaster   发布时间: 2011-03-23