pop是把栈中的数据复制到寄存器中,而原本的数据还是存在于栈
汇编吧
全部回复
仅看楼主
level 5
pop是把栈中的数据复制到寄存器中,而原本的数据还是存在于栈中,我想问一下push是不是也进行着同样的复制操作,是把寄存器的数据复制到栈中?
2020年05月07日 10点05分 1
level 5
顶
2020年05月07日 10点05分 2
level 13
说'复制'是可以的,push和pop做的都是复制,源的资料并没有被清除.
顺利说一下,push和pop并不只对寄存器操作,内存和即时值也可以,比如
push word ptr [2000h] ;将内存ds:[2000]的word值推入栈
push dword ptr [2000h] ;将内存ds:[2000]的dword值推入栈
pop word ptr [2000h] ;将栈顶的word值弹出到ds:[2000h]
pop dword ptr [2000h] ;将栈顶的dword值弹出到ds:[2000h]
即时值的操作和内存一样,'必须'指出所操作的数值是word或dword
因为同样是1000h,cpu不知道是word的1000h,还是dword的00001000h
比如
push 100h ;错,没有指出长度
push word ptr 100h ;对,直接将0100h压栈,sp-2
push dword ptr 100h ;对,直接将00000100h压栈,sp-4
pop不可以操作即时值
2020年05月07日 11点05分 3
level 5
@ZandraWoo 谢谢大佬,我可不可以再问你一个问题,下图我想不明白为什么栈满后再push会循环覆盖原来栈中的内容,栈满后难道不是溢出了吗?
2020年05月07日 13点05分 4
每次压栈,SP-2(如PUSH AX)或SP-4(PUSH EAX),减到0时,再PUSH时,SP=0-2=-2=FFFEH,这叫倒卷, 原来FFFE的值会被覆盖
2020年05月07日 13点05分
@ZandraWoo 那溢出是怎么一回事?溢出不是栈满后push到栈外了吗?感觉与这个倒卷相冲突了
2020年05月07日 13点05分
若栈段真的是0-FFFFH,64K,满栈机会极微,但许多时候, 栈会被设定为100H,200H或者多些, 就是SP(栈顶)被限制在200H內,碰到多重遞回, SP被减到0,再减就FFFE,并不是原来的栈顶200H,可能是程式段, 可能是资料段,甚至不可写入的禁区,溢出了...,意即溢出原来的栈区 0-200H,其结果不可预期.
2020年05月07日 14点05分
对呀,这样溢出不就和倒卷冲突了吗?一个是溢出栈外,一个是重新开始这个栈的循环,再次覆盖原来的数据,难道是有两种情况的?
2020年05月07日 14点05分
1