关于基本块中间跳转及给定汇编代码的技术咨询
基本块中间跳转问题分析(结合给定ARM汇编代码)
首先咱们把基本块的定义再明确下:基本块是一段连续的非跳转指令序列,以跳转指令(直接或间接)作为结尾,而且跳转的目标地址必须是另一个基本块的起始位置——核心就是块内只能顺序执行,不能有中途跳转,跳转只能是块的收尾动作。
先把你给出的汇编代码贴出来方便分析:
106ac: ba00000f blt 106f0 <main+0xb8> 106b0: e3099410 movw r9, #37904 ; 0x9410 106b4: e3409001 movt r9, #1 106b8: e79f9009 ldr r9, [pc, r9] 106bc: e3a06000 mov r6, #0 106c0: e1a0a008 mov sl, r8 106c4: e30993fc movw r9, #37884 ; 0x93fc 106c8: e3409001 movt r9, #...
咱们重点看第一行的blt 106f0——这是一条ARM条件分支跳转指令。按照基本块的定义,基本块的中间绝对不能出现这类跳转指令,原因很简单:基本块要求内部是纯顺序执行的非跳转指令,跳转只能是块的收尾动作。
如果真的在分析时发现某个“疑似基本块”中间有跳转,那说明你的块划分错了,必须在跳转指令的位置拆分:
- 对于这条
blt来说,它所在的地址106ac必须是某个基本块的结尾。也就是说,从某个基本块的起始地址开始,一直到106ac的这条blt,构成一个完整的基本块——因为这条跳转是块的最后一条指令,符合定义。 - 而
106b0开始的这段指令序列,会成为一个新的基本块的起始地址:当blt的条件不满足时,程序会顺序执行到这里;同时如果有其他跳转指令指向106b0,也完全符合“跳转目标是基本块起始”的要求。
再补充个关键点:blt的目标地址106f0也必须是另一个基本块的起始,这才符合基本块定义里的跳转目标要求——否则这个跳转本身就不符合基本块的规则。
总结一下:基本块的中间不存在跳转指令是定义强制要求的,一旦出现跳转,就意味着这里是两个基本块的分割点,跳转指令属于前一个块的结尾,跳转之后的第一条指令是后一个块的开头。
内容的提问来源于stack exchange,提问作者abpar
相关产品推荐
相关产品推荐

