Alone Cáfe
There is no limit to learning.
阿龙咖啡
for 循环的反汇编浅析

for 循环

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

image

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

 

禁用优化的情景

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

image

 

最小化大小的情景

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

image

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

 

最大化速度的情景

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

image

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

赞赏
知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名。

发表评论

textsms
account_circle
email

阿龙咖啡

for 循环的反汇编浅析
for 循环     for 循环是使用频度最高的循环结构,我们通过 C 语言反汇编实例,来分析 for 循环结构在计算机底层的原理和构造。首先,我们编写一个简单的 for 循环: &nb…
扫描二维码继续阅读
2018-09-13