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

时间:2014-02-09 23:23:43

标签: assembly embedded mips reverse-engineering firmware

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

“未定义的行为”仅仅意味着 - 它未指定会发生什么。它可能导致CPU锁定,或者它可能实际执行指令。

有关M88K中使用的延迟槽的一些技巧,请参阅此文章:

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

或者答案可能更简单:您可能正在查看数据,而不是代码。由于原始二进制文件没有关于代码/数据边界的信息,因此objdump默认为反汇编所有内容,无论它是否有意义。

答案 1 :(得分:0)

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

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