手臂拆卸 - ADR或SUB?

时间:2017-07-12 22:39:28

标签: arm qemu disassembly ida

我开始建造一个手臂反汇编器。 我有二进制" 48 00 4F E2"

伊达:

  

ROM:00000040 48 00 4F E2 ADR R0,sub_0

的Qemu:

  

e24f0048 sub r0,pc,#72

我不认为它是BE / LE问题,因为之前和之后的命令看起来都是一样的。

会发生什么?

1 个答案:

答案 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?

看起来他们都正确地拆解了指令。

如果你真的是在做一个反汇编,那你就不应该问这个问题,因为你已经拥有了你所需要的一切。