我正在使用radare2静态反转为Atheros AR7161编译的一些软件。这个处理器实现了 MIPS,我记得 MIPS 有一个分支延迟槽。这在反汇编中确实很明显,因为我可以看到应该在分支放置在它们之后的逻辑之前执行的指令。
然而,在分析一段代码时,我遇到了一条 beqz 指令,假设它应该首先执行之后的指令在程序上下文中没有意义。我必须承认我的分析可能是错误的,这并非不可能;但是,我有一些疑问,我也想澄清一下:
是否所有分支/跳转指令总是使用分支延迟槽,以便紧随其后的指令在逻辑上首先执行?如果不是,在哪些情况下不会?
有没有办法让radare2显示逻辑执行顺序而不是二进制编码的顺序?
编辑:具体来说,我正在处理以下序列:
beqz v0, <some address>
lb v0, 0x40(sp)
关于这些进入管道的指令,我脑子里有一个非常分散的画面。我可以想象在解码第一条指令时正在提取第二条指令;因此,分支延迟槽的执行实际上应该开始。但是,分支指令依赖于被分支延迟槽中的指令修改的同一个寄存器,那么会发生什么呢?分支指令是使用旧的寄存器值还是由 lb 更新的新值来评估条件?
谢谢