我开始建造一个手臂反汇编器。 我有二进制" 48 00 4F E2"
伊达:
ROM:00000040 48 00 4F E2 ADR R0,sub_0
的Qemu:
e24f0048 sub r0,pc,#72
我不认为它是BE / LE问题,因为之前和之后的命令看起来都是一样的。
会发生什么?
答案 0 :(得分:0)
所以,如果你只是尝试一下......
.word 0x48004FE2
.word 0xe24f0048
给出
0: 48004fe2 stmdami r0, {r1, r5, r6, r7, r8, r9, r10, r11, lr}
4: e24f0048 sub r0, pc, #72 ; 0x48
但是因为你正在写一个反汇编程序(非常好的练习来学习BTW的指令集,继续)...你注意到的第一件事是条件代码。你看到的结果都没有“mi”与之相关,因此既不假设它们都是拆卸臂和臂模式,也没有看到4作为顶部半字节。一直都没有注意到0xe。
您还会在您的手臂文档中看到adr以
开头cccc0010010x1111或cccc0010100x1111 0xX24F 0xX28F
并且它是没有Rn为1111的子,但是一个反汇编程序选择遵守作为伪指令的ADR,另一个只是将其解码为子指令。您指定的架构也可能很重要。在较新的手臂中,ADR显示它由armv4t支持,但较旧的手臂(armv4和armv5和一些armv6)没有显示ADR指令。它只显示了子。
以...开头 cccc00I0010SNNNN
其中cccc是条件代码,在某些情况下我可以为零或在这种情况下为1,S是否为保存标志,NNNN为Rn。
sub(cond)(s)Rd,Rn,shifter operand
你有0xE24F所以
sub r0,pc,shifter_operand。
我是1,因此立即是32位。 0x48,旋转为0x0,为小数72(十六进制0x48)。
什么是0x40-0x48 + 8(地址0x0000)?是标签sub_0?
看起来他们都正确地拆解了指令。
如果你真的是在做一个反汇编,那你就不应该问这个问题,因为你已经拥有了你所需要的一切。