栈指令的小小思考
PS:找不到可以发的区...觉得这儿最合适..不会删吧?- -
堆栈操作指令是先操作esp还是先操作堆栈?
记得很久以前看过的圣经曾经指出过:push指令和pop指令在CPU设计中特别考虑,因为有一种特殊的指令
push esp
pop esp
如果不处理好,因为寄存器esp置值的问题可能造成整个CPU崩溃.
push会esp-4,pop 指令会esp+4.
如果在取出esp值后,esp又加4了,哪么得到的esp就是错误的值
如此...
是修改寄存器先还是做堆栈的事情先?这是个问题!
在看intel的方法之前先想想我们可以怎么做:
push指令后,堆栈向下生长,sp=sp-4(切记esp里面的e的意思:extend)
哪么push 此刻的未修改的esp后,考虑到堆栈平衡,在pop 到esp的时候,这个esp值应该是现在push的未修改值.而以后的压栈使用的是修改好的esp,这样压栈就没有问题了
即,在修改esp前把esp压入堆栈.
如此:pop esp需要有正确的esp值,由于上面已经把正确的esp压入堆栈了,哪么先修改堆栈(即esp+4),再置esp值.这样以后出栈使用的也是正确的esp了,出栈也没有问题了。
综上所述
一个方法就是:push修改栈数据一定是在修改esp之前,pop修改栈数据一定在修改esp之后。
这样就只用稍微在esp值的计算上做点手脚就解决了问题.
PS:最上面的操作堆栈和修改esp一样,指的是修改esp+-4
下面看看intel 的做法(图)
最后的观察到的:intel的CPU使用的方法目的是修改堆栈中的内容一定是在修改esp之前的。
实际上,INTEL的压栈,出栈顺序是这样的:
push:esp-4, 操作堆栈
pop:操作堆栈,esp+4
这样不是同样达到了目的?
PS:不会设置图的大小,BZ帮忙.. 图片调整一下就好了 不是很清晰 这个以前我们老师讲过了!
ESP好比内存指针,压栈的时候指针先往上移,即先减,再把它压入栈,因为我们定义向上是减小的.
出栈的时候刚好相反...
这样好记一点.
但LZ还是把最基本的原理展示出来1...
谢谢!
页:
[1]