注册 登录
编程论坛 汇编论坛

push和pop 寻解

DarkSpear 发布于 2010-10-16 10:42, 539 次点击
定义一段数据 dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h

        mov bx, 0
        mov cx, 8
s1:        push [bx]
        add bx, 2
        loop s1

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

运行程序后,用Debug查看内存发现
0B57:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09

数据为何没有改变??
9 回复
#2
zklhp2010-10-16 11:29
你确定你改的就是你定义的数据么。。
#3
DarkSpear2010-10-16 11:46
[bx]默认段地址不是ds吗?难道改写有误?
#4
zklhp2010-10-16 12:06
不知道 不过没变肯定是有原因的 很可能是没有改写你想要的

全部代码啥样啊。。
#5
DarkSpear2010-10-16 12:16
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

begin:  mov ax, data
        mov ds, ax
        mov ax, stack
        mov ss, ax
        mov sp, 20h

        mov bx, 0
        mov cx, 8
s1:     push [bx]
        add bx, 2
        loop s1

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

        mov ax, 4c00h
        int 21h

code ends

end begin

[ 本帖最后由 DarkSpear 于 2010-10-16 12:19 编辑 ]
#6
东海一鱼2010-10-16 13:10
楼猪搞笑了,程序不是已经按你的意图正确执行了吗???

0B57:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
不就是你押入的 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h吗?你还想怎样,才算修改??


#7
DarkSpear2010-10-16 14:11
难道我理解错了?我想的是0123h最先入栈,那就应该最后出栈,0987h是最后入栈,那就是最先出栈的吧?mov bx, 0调整偏移,那么0987h出栈后应该把0123h覆盖掉才对啊...结果不是应该和原来的数据相反吗?
#8
DarkSpear2010-10-16 14:13
难道:
push ax
push bx
push cx
push dx
pop ax
pop bx
pop cx
pop dx
还和原来的数据一样???
#9
wisji82010-10-16 15:12
楼主,你错就错在你栈的初始化为mov sp, 20h,你只要把20h改为10h就好。
#10
DarkSpear2010-10-16 15:45
原来如此,看来我还是不够细心,十分感谢wisji8

[ 本帖最后由 DarkSpear 于 2010-10-16 15:47 编辑 ]
1