MIPS汇编中的两个顺序分支指令?

我正在尝试对MIPS固件进行逆向工程.对于32位r4kec处理器,固件采用大端编码.

我已经反汇编(使用objdump)二进制文件来查看程序集的外观,并且所有内容看起来都像是有效的代码,但是在代码的开头我看到了以下两条指令:

bfc00220    152a0001    bne t1, t2, 0xbfc00228
bfc00224    10000009    b   0xbfc0024c

第一条指令检查t1和t2寄存器的值,如果它们不相等则跳转到一个地址.第二条指令似乎处理掉落的情况,直接跳到后续地址.到目前为止这么好,还是没有?

据我所知,这不合法.我读过的所有可用MIPS文档都声明直接跟随任何分支/跳转指令的指令被视为跳转延迟槽,其指令总是(除了可能的分支指令类)在实际跳转之前执行执行.

这里的关键问题是跳转延迟槽中不允许另一个分支/跳转,这将使处理器处于未定义状态.

那么我要对这段代码做些什么呢?我不认为这是一个以已知的确定性方式处理这种情况的cpu的手工组装(尽管它不会太过牵强).我也无法相信编译器会故意生成这样的代码.另一种可能性是我使用了错误的反编译器来处理二进制文件,或者我有错误的字节序,或者别的……

谁能解释一下这里发生了什么?

虽然这是未定义的行为,但是特定的CPU实现可能会对此指令序列执行一些有用且可重复的操作.要告诉的唯一方法是在实际实现上运行代码.使用调试器在每个分支的目标上放置一个断点,并查看您获得的断点.

这甚至可能是手动生成的程序集中的错误,从未捕获过,因为代码的实际行为不正确.

相关文章
相关标签/搜索