码迷,mamicode.com
首页 > 其他好文 > 详细

for 循环的反汇编浅析

时间:2018-09-14 01:16:03      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:baseline   变量   display   back   img   相同   height   bubuko   计算机   

for 循环

    for 循环是使用频度最高的循环结构,我们通过 C 语言反汇编实例,来分析 for 循环结构在计算机底层的原理和构造。首先,我们编写一个简单的 for 循环:

技术分享图片

    为了方便观察,我们用十六进制来表示循环变量,编译后,我们用 OllyDBG 载入,我们可以看到对应的反汇编代码。

 

禁用优化的情景

    这里的“push ecx”相当于“sub esp, 4”,为 i 变量分配空间。接着,i 被赋值成 0,并且跳转到 004095C6 处,刚好此处是一条 cmp 指令,与 baseline 条件值(此处是 0x10)进行比较,如果大于等于则跳出循环,否则,程序会接着往下执行,执行完 printf,就会跳转到 004095BD 处,这时将进行循环的变量的自增。如此往复直到 JGE 跳转成立。

技术分享图片

 

最小化大小的情景

    当编译器使用最小化大小(O1)编译优化选项时,for 循环将产生体积更小更精简的机器代码。如下图所示:

技术分享图片

我们会发现有许多与前者不相同的地方,比如循环变量在此情景中变成了 ESI 寄存器,JGE 变成了 JL。

 

最大化速度的情景

    当编译器使用最大化速度(O2)编译优化选项时,for 循环将产生更加高效的机器代码。如下图所示:

技术分享图片

存在的诸多细微的差异,还需自己深入慢慢体会。

for 循环的反汇编浅析

标签:baseline   变量   display   back   img   相同   height   bubuko   计算机   

原文地址:https://www.cnblogs.com/yenyuloong/p/9644068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!