下面的控制流图来自记事本(Win7 64 位)中的单个函数。为什么链接器(或编译器)将单个函数的基本块分成多个不连续(不连续)的块?
下面的控制流图来自记事本(Win7 64 位)中的单个函数。为什么链接器(或编译器)将单个函数的基本块分成多个不连续(不连续)的块?
DCoder 已经在评论中引用了他自己的答案。
控制流图中的块通常称为基本块或扩展基本块。它们被重新排序的原因与编译器执行的优化有关。
您所询问的内容有几个术语:
我强烈建议,如果您对这个主题感兴趣,请阅读编译器设计。我特别建议阅读“龙之书”(Aho、Lam、Sethi 和 Ullman 的“编译器 - 原理、技术和工具”)以及有关优化的部分。这里我指的是2007年的第二版(ISBN:0-321-48681-1)。
查看 8.4(“基本块和流程图”)和 8.5(“基本块的优化”)以及后面的 8.5.7(“从 DAG 重新组装基本块”)部分。但这只是开始。第 9 章作为一个整体同样重要,第 11.10 节(“局部优化”)也是如此。从分区交错小节的介绍性段落中引用您所询问的优化类型的原因之一:
11.10.3 分区交织
循环中的不同分区经常读取相同的数据,或者读写相同的缓存行。[...]
引自Aho、Lam、Sethi 和 Ullman 的“编译器 - 原理、技术和工具”。
这归结为 DCoder 在他/她对您的问题的评论中已经提到的内容。
哦,“逆向:逆向工程的秘密”一书也是一本很好的读物,它部分讨论了这一点。然而,它更关注“它看起来如何”而不是“为什么这样做”。