吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3390|回复: 9
收起左侧

[新手问题] 小白问关于push与pop汇编指令

[复制链接]
没有细胞的人 发表于 2020-4-21 00:24
本帖最后由 没有细胞的人 于 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: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] 纯文本查看 复制代码
        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是最快的。




免费评分

参与人数 4吾爱币 +4 热心值 +1 收起 理由
梦魂 + 1 + 1 谢谢大佬,一直搞不懂,每次碰到这个push都去查资料,每次都看的头大都看不.
一般通过首冲人 + 1 射射大佬 一臉懵逼
没有细胞的人 + 1 感谢大佬回复,我大概懂了
赤座灯里 + 1 我很赞同!

查看全部评分

赤座灯里 发表于 2020-4-21 01:37
本帖最后由 赤座灯里 于 2020-5-9 06:44 编辑
女萝岩 发表于 2020-4-21 01:25
栈就是一块内存区域。push就是往这块内存写数据。pop就是从这块内存读数据。栈有临时保存数据的功能,想保 ...

说得很好
netspirit 发表于 2020-4-21 03:50
个人建议 如果不懂这个建议找一个教程系统的学习一下 免得学到了最后知识漏洞还有一大堆呀
 楼主| 没有细胞的人 发表于 2020-4-21 07:12
netspirit 发表于 2020-4-21 03:50
个人建议 如果不懂这个建议找一个教程系统的学习一下 免得学到了最后知识漏洞还有一大堆呀

大佬可以推荐几个咩?
赤座灯里 发表于 2020-4-21 13:09
本帖最后由 赤座灯里 于 2020-4-21 21:28 编辑

某宝搜汇编语言的书买来慢慢读
netspirit 发表于 2020-4-21 17:43
没有细胞的人 发表于 2020-4-21 07:12
大佬可以推荐几个咩?

链接: https://pan.baidu.com/s/1BsaAIlvlo8Bm3x0vF_XxRw 提取码: h44k
建议学这个 讲的很详细 用来打基础很好
如果逆向学逆向我建议你学这个
这个后面还有很多的反汇编练习
这个不是教破解的 是专门教你看反汇编代码的。。。。。
 楼主| 没有细胞的人 发表于 2020-4-21 18:06
netspirit 发表于 2020-4-21 17:43
链接: https://pan.baidu.com/s/1BsaAIlvlo8Bm3x0vF_XxRw 提取码: h44k
建议学这个 讲的很详细 用来打基 ...

好的,多谢大佬了!
netspirit 发表于 2020-4-21 21:20

嗯嗯 不用谢。。。。
wuya126 发表于 2020-4-25 01:31
如果不说声谢谢感觉真的对不起大佬!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 08:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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