吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5458|回复: 3
收起左侧

栈指令的小小思考

[复制链接]
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]
附图.JPG

最后的观察到的:intel的CPU使用的方法目的是修改堆栈中的内容一定是在修改esp之前的。
实际上,INTEL的压栈,出栈顺序是这样的:
push:esp-4, 操作堆栈
pop:操作堆栈,esp+4
这样不是同样达到了目的?
PS:不会设置图的大小,BZ帮忙..

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kissy 发表于 2008-4-1 17:55
图片调整一下就好了 不是很清晰
fenglovely 发表于 2008-4-3 00:50
这个以前我们老师讲过了!
ESP好比内存指针,压栈的时候指针先往上移,即先减,再把它压入栈,因为我们定义向上是减小的.
出栈的时候刚好相反...
这样好记一点.
但LZ还是把最基本的原理展示出来1...
谢谢!
头像被屏蔽
cao2109 发表于 2008-10-26 23:11
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 16:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表