ARM 操作码 E1F322D1 的正确反汇编是什么?

逆向工程 拆卸 手臂
2021-06-27 06:46:35

我正在调整reko 反编译器以使用 Capstone 作为其反汇编器,而不是使用我自己的反汇编器。我正在使用Capstone.NET提供的 .NET 绑定

策略是用 Capstone 反汇编器替换旧的 ARM 反汇编器,然后运行旧的单元测试以确保没有损坏。我正处于大多数测试都通过的时候,但是E1F322D1旧的 reko 反汇编器和 ODA 反汇编的操作码

 ldrsb r2, [r3, #33]!

但是,Capstone 的回应是:

ldrsb r2,[r3,#&221]!

我手边没有其他反汇编程序,所以我不确定该相信谁!

什么是正确的拆解?

2个回答

来自http://bear.ces.cwru.edu/eecs_382/ARM7-TDMI-manual-pt2.pdf

LDRSB

E1F322D1等于11100001111100110010001011010001二进制。

您的问题特定于偏移量,因此我们可以根据上面屏幕截图中的分解规则检查该二进制字符串的最后十位:

... Offset 1 SH 1 Offset
...  0010  1 10 1  0001

因此,高半字节是0010,低半字节是0001如果我们将它们组合起来,我们会得到00100001二进制或33十进制。

所以正确的反汇编是ldrsb r2, [r3, #33]!.

IDA 同意第一个观点:

LDRSB R2, [R3,#33]!

Capstone 可能会尝试显示类似 #0x21 的内容,这将是等效的,但似乎出了点问题。