好友
阅读权限10
听众
最后登录1970-1-1
|
xpoy
发表于 2008-4-1 00:37
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 的做法(图)
[s:40]
最后的观察到的:intel的CPU使用的方法目的是修改堆栈中的内容一定是在修改esp之前的。
实际上,INTEL的压栈,出栈顺序是这样的:
push:esp-4, 操作堆栈
pop:操作堆栈,esp+4
这样不是同样达到了目的?
PS:不会设置图的大小,BZ帮忙.. |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|