两个连续的标签形成两个不同的基本块还是装配相同

时间:2019-06-22 14:54:58

标签: assembly compiler-construction label

我陷入了有关基本块的问题

如果我们有这样的装配体

lea random, eax
label1
label2
mov $5, ebx

是这样组织的基本块:

lea random, eax
-----------------
label1:
label2:
mov $5, ebx

或类似这样:

lea random, eax
----------------
label1:
----------------
label2:
mov $5, ebx

因为据我所知,基本块是不间断执行的代码块,因此在中间没有标签或跳转,只能在结尾处,但是如果我们有2个连续的标签,从技术上讲,它们是不是指向相同的地址,因此没有不同的“操作”并落在同一块中吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

任何作为分支目标 的标签都可以视为基本块的开始。

您是否将其视为在进入“真实”标签之前先经过一个空的基本块,还是确定两个标签都在同一基本块上都没有关系。做任何方便的事。两种解释都是完全正确的。

但是IMO后者更合乎逻辑:根本没有空的基本块。如果您正在编写编译器,则空的BB是一种优化/简化,等待您的控件进行-流程图。但是不是正确性所必需的。但是,如果从asm反向工程回到控制流图,那么添加一个额外的空节点是不必要的复杂性。


如果标签不是分支目标,则它不会启动基本块。

您可以将标签放置在任何地方(包括数据),但是如果您实际上没有从任何地方分支到标签,则它不是BB。您可能只是出于某种目的而使用了它的地址,而不是(最终)跳到那里,例如作为锚来计算相对于它的其他位置。

如果您认为您连续有2个BB,但实际上从没有在第二个开始时跳到标签,则实际上您有1个更大的BB。这是从asm转换为程序逻辑时不会在CFG中引入额外复杂性的观点的概括。