Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS程序集中的两条连续分支指令?_Assembly_Embedded_Mips_Reverse Engineering_Firmware - Fatal编程技术网

Assembly MIPS程序集中的两条连续分支指令?

Assembly MIPS程序集中的两条连续分支指令?,assembly,embedded,mips,reverse-engineering,firmware,Assembly,Embedded,Mips,Reverse Engineering,Firmware,我正在尝试对MIPS固件进行反向工程。固件采用big-endian编码,用于32位r4kec处理器 我已反汇编(使用objdump)二进制文件以查看程序集的外观,所有内容看起来都像有效代码,但在代码的开头,我看到了以下两条说明: bfc00220 152a0001 bne t1, t2, 0xbfc00228 bfc00224 10000009 b 0xbfc0024c 第一条指令检查t1和t2寄存器的值,如果它们不相等,则跳转到一个地址。第二条指令似乎处理掉接情况

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

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

bfc00220    152a0001    bne t1, t2, 0xbfc00228
bfc00224    10000009    b   0xbfc0024c
第一条指令检查t1和t2寄存器的值,如果它们不相等,则跳转到一个地址。第二条指令似乎处理掉接情况,直接跳到后续地址。到目前为止还不错,还是不行

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

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

那么我要如何理解这段代码呢?我不相信这是一个手工制作的程序集(虽然它不会太牵强,因为它是),对于一个以已知的确定性方式处理这种情况的cpu来说。我也不能相信编译器会故意产生这样的代码。另一种可能是我对二进制文件使用了错误的反编译器,或者我的endianness错误了,或者其他什么

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

这个“未定义的行为”的意思就是——没有指定会发生什么。它可能会导致CPU锁定,也可能实际执行指令

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


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

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


这甚至可能是手动生成的程序集中的错误,因为代码的实际行为没有错误,因此从未捕获到该错误。

重置或通电后,MIPS处理器执行的第一条指令的地址是什么?前两条指令是某种类型的头指令,从不作为代码执行,这有什么变化吗?
b
指令是分支,而不是“break”。编辑为s/break/branch/供将来的搜索者使用。Igor和markgz,谢谢您的编辑-我的错@rcgldr,不,我很确定这是代码,而不是数据。我所掌握的有关固件的(很少)信息与此代码的预期行为一致,但对于延迟插槽中的分支。我认为您可能是对的-这可能是手工制作的程序集,两个分支指令被放置在那里,并“意外地”为特定CPU按预期工作。我没有一个jtag接口到该代码应该在其上运行的板上,但是一旦我进一步进行了反向操作,我应该能够像这样运行代码并通过串行输出跟踪它。