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



我正在尝试对MIPS固件进行反向工程。固件是big-endian编码的,用于32位r4kec处理器。

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

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

第一条指令检查t1和t2寄存器的值,如果它们不相等,则跳到一个地址。第二条指令似乎处理失败的情况,直接跳到下一个地址。到目前为止还不错吗?

据我所知,这是不合法的。我读过的所有可用的MIPS文档都指出,任何分支/跳转指令后面的指令都被视为跳转延迟槽,其指令总是在执行实际跳转之前执行(可能是分支的指令类除外)。

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

那么我该如何处理这个代码呢?我不认为这是一个以已知的确定性方式处理这种情况的cpu的手工组装(尽管这不会太牵强)。我也不敢相信编译器会故意生成这样的代码。另一种可能性是,我对二进制文件使用了错误的反编译器,或者我的endianness错误,或者其他什么。。。

有人能解释一下这里发生了什么吗?

"未定义的行为"只是指它没有指定会发生什么。它可能导致CPU锁定,也可能实际执行指令。

请参阅这篇关于M88K中使用的延迟槽的一些技巧的文章:

http://www.pagetable.com/?p=313

或者答案可能更简单:你可能在看数据,而不是代码。由于原始二进制文件没有关于代码/数据边界的信息,无论是否合理,objdump都默认对所有内容进行反汇编。

虽然这是未定义的行为,但特定的CPU实现可能会为此指令序列做一些有用且可重复的事情。唯一的方法是在实际实现上运行代码。使用调试器在每个分支的目标上放置一个断点,看看你能找到哪一个

这甚至可能是手工生成的程序集中的错误,因为代码的实际行为没有错误,所以从未被捕获。

最新更新