在Smith& Sons的“虚拟机”一书中。 Nair(在页码57上),描述here(在解释和动态二进制翻译的上下文中),动态基本块在它们的中间具有分支目标,而静态基本块没有。静态基本块只有单个入口和单个出口点,如下图所示:static vs dynamic basic blocks
现在,在该书的第58页,据说当分支转到已经翻译的块的中间时,翻译过程会发生复杂化。仿真管理器无法获取目标地址,因为它只具有特定转换块的起始地址,而不是转换块中某处的分支目标。因此,即使源代码已经翻译,也会再次翻译。解决方案是使用额外的数据结构来跟踪每个转换块的地址范围。但使用动态基本块时不会出现这种明显的复杂情况。
但是,正如我们从上面链接的图和书中可以看到的那样,动态基本块可能在其中间具有分支目标,而静态块没有这样的多个条目。那么,动态基本块如何解决该问题而不是静态块?
提前谢谢你......
编辑:在上面链接的图中,在动态基本块中,有多个具有相同名称的标签,即循环和跳过。那么,解释器如何决定哪个标签是实际目标?是否可以在同一汇编代码部分中使用多个具有相同名称的标签?
答案 0 :(得分:0)
据我所知,他们想要用动态块结构解决的问题是,当你进行翻译时,无法确定一条指令是否是一个分支目标,应该在一个基本块的开头。标签通常在翻译的指令流中不可见。
这个想法是,在执行期间,当您陷入或跳转到尚未翻译的地址时,您将所有内容转换为控制流的下一个预期更改,即下一个分支。如果您遇到跳转到已翻译块的中间,最简单的方法是将其视为新的动态块。这将导致生成额外的代码,但通常这不是问题。