本帖最后由 女萝岩 于 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] 纯文本查看 复制代码 int start = clock();
for(int i=0;i<1000000000;i++)
{
__asm{
// xor eax,eax//2924
// mov eax,0//3024
push 0
pop eax //3244
}
}
int end=clock();
其中xor是最快的。
|