好友
阅读权限10
听众
最后登录1970-1-1
|
女萝岩
发表于 2020-4-21 01:25
本帖最后由 女萝岩 于 2020-4-21 01:27 编辑
栈就是一块内存区域。push就是往这块内存写数据。pop就是从这块内存读数据。栈有临时保存数据的功能,想保护某个数据的时候可以push reg或者push mem,想从栈中恢复数据的时候就可以pop reg 或者pop mem
常见的比如保存函数返回地址,和函数运行完之后返回到被调用处继续运行,就依靠call指令和ret指令,call指令就相当于push指令,ret指令就相当于pop指令。
push了eax进去,之后没弹出eax又再push了eax进去,会不会之前储存的eax值被覆盖了?
不会的,push和pop永远是在栈顶操作的,每次push完之后,栈顶的地址会自动减4,和原来的栈顶已经不一样了,当然不会被覆盖。pop完之后,栈顶的地址会自动加4.
你最后说的那个问题应该和编译器优化有关系。
同样一个功能,如果运用不同的优化策略,对应的汇编指令是不一样的。
比如,我想让eax的值是0,有几种方法呢?
1.mov eax,0 占用5个字节
2.push 0 ,pop eax 占用3个字节
3.xor eax,eax 占用2个字节
而且它们三个执行的速度也是不一样的。
[C] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | int start = clock ();
for ( int i=0;i<1000000000;i++)
{
__asm{
push 0
pop eax
}
}
int end= clock ();
|
其中xor是最快的。
|
免费评分
-
参与人数 4 | 吾爱币 +4 |
热心值 +1 |
收起
理由
|
梦魂
| + 1 |
+ 1 |
谢谢大佬,一直搞不懂,每次碰到这个push都去查资料,每次都看的头大都看不. |
一般通过首冲人
| + 1 |
|
射射大佬 一臉懵逼 |
没有细胞的人
| + 1 |
|
感谢大佬回复,我大概懂了 |
赤座灯里
| + 1 |
|
我很赞同! |
查看全部评分
|