关于ADR.W指令的问题

逆向工程 手臂 拇指2
2021-07-04 00:09:50

使用 IDA Pro 反转 ARM 固件时,我找到了一条说明:

ROM:080461FC 0F F2 24 30 ADR.W R0, aBt_test_mode ; “BT_TEST_MODE”

...

ROM:08046524 aBt_test_mode DCB "BT_TEST_MODE",0

...

我知道这是一个 Thumb-2 指令。 在此处输入图片说明 imm8=0010 0100

Rd=0000

im3=011

但我不知道如何计算 imm32。(imm32 = ZeroExtend(i:imm3:imm8, 32)) 以及如何计算 08046524?

1个回答

正如你所说,你有——

imm8 = 0010 0100

imm3 = 011

但你也有

i = 0

然后

imm32 = ZeroExtend(i:imm3:imm8,32) =>

imm32 = ZeroExtend(0:011:00100100,32) =>

imm32 = ZeroExtend(001100100100,32) =>

imm32 = 00000000000000000000001100100100 = 0x00000324

ADR 指令说明解释为“该指令在PC 值上加上一个立即数,形成一个PC 相对地址,并将结果写入目的寄存器”。

当您处于 Thumb 模式时,PC 的值等于指令的(4 字节对齐)地址 + 4 字节。在你的情况下,指令是在地址0x080461FC所以PC = 0x080461FC + 4 = 0x08046200

然后地址计算是 -

PC + imm32 = 0x08046200 + 0x00000324 = 0x08046524

这就是你在 IDA 的反汇编中看到的。

如果您查看 ARM 体系结构参考手册中 ADR 指令的“操作”部分,您可以看到对此的解释。