小白问关于push与pop汇编指令
本帖最后由 没有细胞的人 于 2020-4-21 00:28 编辑之前看好多大神讲解栈,我还是没搞懂
我拿eax举例,push eax是指将eax压入堆栈,pop eax是指将eax弹出堆栈
小白:
啥是堆栈?它干哈用的?压入堆栈与弹出堆栈到底是什么?
本菜鸟尝试破解自己写的程序,用了一个循环结构,发现到循环每次的底部都会将pop eax弹出堆栈,之后eax变成了循环次数,自己又看了下每次循环的开始,都有一个push eax
所以 push eax 和 pop eax 的意思是不是,开始的时候将eax压入一个栈里储存起来,压入栈后,eax不管受什么影响都不会改变栈里的值,后面需要用的时候再把eax弹出栈,这样栈就起到了一个储存的功能,是这样咩?
如果是这样的话,那如果我push了eax进去,之后没弹出eax又再push了eax进去,会不会之前储存的eax值被覆盖了?而且每次都压入然后弹出,再比较循环次数,岂不是很麻烦?为什么程序不直接将eax赋值到一个地址,然后直接比较这个地址的值,这样岂不是更方便?
(以上仅为本菜鸟的个人分析。本菜鸟在写这篇帖子的时候,综合了一下,感觉自己理解极有可能不正确,希望大神指正)
上网查了相关资料,没有查到相关的满意结果。望大神解答~多谢大神! 本帖最后由 女萝岩 于 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个字节
而且它们三个执行的速度也是不一样的。
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是最快的。
本帖最后由 赤座灯里 于 2020-5-9 06:44 编辑
女萝岩 发表于 2020-4-21 01:25
栈就是一块内存区域。push就是往这块内存写数据。pop就是从这块内存读数据。栈有临时保存数据的功能,想保 ...
说得很好 个人建议 如果不懂这个建议找一个教程系统的学习一下 免得学到了最后知识漏洞还有一大堆呀 netspirit 发表于 2020-4-21 03:50
个人建议 如果不懂这个建议找一个教程系统的学习一下 免得学到了最后知识漏洞还有一大堆呀
大佬可以推荐几个咩? 本帖最后由 赤座灯里 于 2020-4-21 21:28 编辑
某宝搜汇编语言的书买来慢慢读 没有细胞的人 发表于 2020-4-21 07:12
大佬可以推荐几个咩?
链接: https://pan.baidu.com/s/1BsaAIlvlo8Bm3x0vF_XxRw 提取码: h44k
建议学这个 讲的很详细 用来打基础很好
如果逆向学逆向我建议你学这个
这个后面还有很多的反汇编练习
这个不是教破解的 是专门教你看反汇编代码的。。。。。 netspirit 发表于 2020-4-21 17:43
链接: https://pan.baidu.com/s/1BsaAIlvlo8Bm3x0vF_XxRw 提取码: h44k
建议学这个 讲的很详细 用来打基 ...
好的,多谢大佬了! 没有细胞的人 发表于 2020-4-21 18:06
好的,多谢大佬了!
嗯嗯 不用谢。。。。 如果不说声谢谢感觉真的对不起大佬!
页:
[1]