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