NWm 发表于 2011-5-28 17:27:18

pop会改变原栈顶的内容吗?

本帖最后由 NWm 于 2011-6-4 17:19 编辑

按照书本上的意思,应该是指pop之后只是改变了栈的栈顶指针,并没有对原栈顶进行修改,但是我在做实验五习题一的时候发现了如下情况:
-t
AX=141BBX=0000CX=0042DX=0000SP=0010BP=0000SI=0000DI=0000
DS=141BES=140BSS=141CCS=141DIP=000D   NV UP EI PL NZ NA PO NC
141D:000D FF360000      PUSH                               DS:0000=0123
-d ss:0
141C:000000 00 00 00 00 00 1B 14-00 00 0D 00 1D 14 0D 0E   ................
141C:0010B8 1C 14 8E D0 BC 10 00-B8 1B 14 8E D8 FF 36 00   ..............6.
141C:002000 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
141C:0030CD 21 36 03 17 B8 1D 14-8E D8 8B C2 89 07 E2 E3   .!6.............
141C:0040B8 00 4C CD 21 00 00 00-00 00 00 00 00 00 00 00   ..L.!...........
141C:005000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
141C:006000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
141C:007000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
可以看到,栈底为1D 14 0D 0E,运行连续两步入栈操作后:
-t

AX=141BBX=0000CX=0042DX=0000SP=000CBP=0000SI=0000DI=0000
DS=141BES=140BSS=141CCS=141DIP=0015   NV UP EI PL NZ NA PO NC
141D:0015 8F060200      POP                              DS:0002=0456
-d ss:0
141C:000000 00 1B 14 00 00 15 00-1D 14 0D 0E 56 04 23 01   ............V.#.
141C:0010B8 1C 14 8E D0 BC 10 00-B8 1B 14 8E D8 FF 36 00   ..............6.
141C:002000 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
141C:0030CD 21 36 03 17 B8 1D 14-8E D8 8B C2 89 07 E2 E3   .!6.............
141C:0040B8 00 4C CD 21 00 00 00-00 00 00 00 00 00 00 00   ..L.!...........
141C:005000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
141C:006000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
141C:007000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

可以看到,0123,0456已经成功入栈,接下来是连着两步出栈:

-t

AX=141BBX=0000CX=0042DX=0000SP=0010BP=0000SI=0000DI=0000
DS=141BES=140BSS=141CCS=141DIP=001D   NV UP EI PL NZ NA PO NC
141D:001D B8004C      MOV   AX,4C00
-d ss:0
141C:000000 00 1B 14 1B 14 1B 14-00 00 1D 00 1D 14 0D 0E   ................
141C:0010B8 1C 14 8E D0 BC 10 00-B8 1B 14 8E D8 FF 36 00   ..............6.
141C:002000 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
141C:0030CD 21 36 03 17 B8 1D 14-8E D8 8B C2 89 07 E2 E3   .!6.............
141C:0040B8 00 4C CD 21 00 00 00-00 00 00 00 00 00 00 00   ..L.!...........
141C:005000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
141C:006000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
141C:007000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

仅出栈,并没有做任何其他的动作,出栈之后原来栈中的数据变化了,求解,何故?
代码如下:
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
               
                push ds:
                push ds:
                pop ds:
                pop ds:
               
                mov ax,4c00h
                int 21h
code ends

end start

tawtg 发表于 2011-5-28 20:30:00

请翻看第十二章内容。关于DEBUG的单步中断~

NWm 发表于 2011-5-29 14:13:07

哦,我是自学的,我还没有学到那,你的话我先记下了,谢谢了啊
页: [1]
查看完整版本: pop会改变原栈顶的内容吗?