高手之路-- 明白计算机底层! 为了更好地精通C++ ,否则你指针永远也用不好!!必须知道的概念!

首先看一下这堆代码, 我先证明 release 跟Debug 编译出来的 反汇编是一样的, 否则那无法进一步 推测了!

以上呢 通过 2种编译 ,结果 居然 release 更慢, 这说明 这代码已经无法 优化了.

以下,让你学习如何看懂  内存, 跟 EBP ,指针对应的 写入堆栈 跟 写入 内存是一样的概念,

只是 相对于 EBP 栈底 地址而言。

你看以下 是 第二次运行的内存 , 你会发现 不可读, 为啥不可读呢,就是因为程序每次运行 基地址都是动态分配的。

那么 以为着, EBP 地址 也是 根据 基址 + 偏移 得到的。

进程需要 通过调用 winAPI的方式 来 实现 向 操作系统申请 更多  内存地址 空间。

你才能 写入更多的内存地址。

 

这次运行 EBP 地址 变成了 4EEF40 ,然后我们定位到 4EEF40 地址 就能看到 CPU是怎么直接写入 内存地址的.

直接输入 0x 004EEF40

就能定位了, 然后滚轮,往上滚一点点, 你就能看到 ,各种 变量,都会在堆栈底部 网上的位置 存放的。

滚上去,一看 发现很多 0x000000 的 
就是 初始化 堆栈的痕迹 !
瞬间就明白这就是 堆栈的内部!


然后 这里 inc dword ptr [ebp-60h] 

就是 ebp-60h 这个地址 ,的数据 自增 1 

那么ebp对应的地址是什么呢?

然后 按调试, 可以在汇编 窗口 里 按 F11 键 ,进行 逐步调试.

然后你就会发现   内存查看器里, 看到 不少 数据标红 , 那就是 被修改的 标记!

堆栈一般 就是 从 高地址值 往 地址值 方向 写入 。

就是从 下往上 写入数据的!。

你就明白, 你所定义的变量 大部分都存放在堆栈里!, 说白了, 变量 就只是一个 地址,

汇编 可以直接 定位到 对应的 变量地址 然后修改。 存放地址的 地址就称为 指针。 就是用于重定位的。

就如 邮件上的地址, 这邮件封面 存放的就是 地址, 邮差 就相当于 汇编里的 指针, 可以直接通过 邮件 找到 目的地。

那么我是不是 拿着 邮件就可以了。就能知道目的地了。。

 变量还不如说 就是一个  基址 +偏移 的  虚拟 地址。

 运行后 windows 会告诉你基址的 然后你就瞬间能确定 所有相对地址了。

程序结构就还原,复活了!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极简完美之道~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值