Advertisement

Basic Blocks

阅读量:

首先需要了解Basic Block的概念是什么。它是一段具有顺序性的代码块,在这段代码中没有条件判断或转向指令,并且每个基本块只有一个入口和一个出口。划分基本块时首先要识别起始点(leaders),即基本块的开始指令:leaders(起始指令):

程序的第一条指令
被跳转的目标指令(statement)。例如,在当前代码中,请查看第6行。
跳转后紧跟的操作。例如,在当前代码中,请查看第8和10行。

然后就是根据leaders来划分basic blocks

  • 从每一个领导开始至下一个领导出现之前的所有陈述
  • 最前面的那个陈述被称为first leader
  • 包括first leader的那一组陈述被称为initial block

一个 basic block 仅有一个 entry point,并且仅能通过该 entry point 进入其中并执行其 instructions.

该基本块仅有一个出口,在其内部执行完毕后就需要转移到下一个基本块

以binary search为例, 如果按照这种划分方式, 那么iterativeBinarySearch程序段的基本块为(3−6),(7−8),(9−10),(11−12)?

Control-flow graph是一个流程图(flowchart),它详细反映了程序执行过程中的顺序(sequence of execution)。在Control-flow graph(控制流图)中,每个节点(node)都代表一个基本块(basic block)。下文中的图通过IDA工具生成(generated by IDA tool),这个图表中每一个小方块都对应一个基本块(basic block)。

具体看看:

从函数开始的第一个basic block就是。
栈帧指针frame pointer中的%rbp用于标识当前栈帧的起始位置,在大多数情况下都是函数的起点。
源代码的第三行while循环被拆分为两个基本块。
位于图右下方标记为line13的基本块实际上是exit basic block。
在现有的代码布局中,
源代码的第9行为什么没有出现在图中呢?
因为这段代码是我个人习惯将其与后续语句合并在同一行编写的,
所以如果将第9、10行合并成一行也是可行的选择。

全部评论 (0)

还没有任何评论哟~