ARM汇编中的函数地址有一个字节的偏移量?

Function address in ARM assembly have one byte offset?

例如,我有下面objdump得到的汇编代码。 f()的地址是080001d4。但是 printf("%x", f) 输出 080001d5f() 可以由 (*((int (*)())080001d5))() 完成,但 (*((int (*)())080001d4))().

为什么函数地址偏移了一个字节?

080001d4 <f>:
 80001d4:   2000        movs    r0, #0
 80001d6:   4770        bx  lr

ARM有两种指令模式,地址的最低有效位用于指示给定函数使用哪种模式。 Thumb 模式为奇地址,ARM 模式为偶地址。

即使您使用 -marm 开关重新编译,该地址也会是。

[1] 中的 A4.1.1 "Changing between Thumb state and ARM state" 节规定如下:

A processor in Thumb state can enter ARM state by executing any of the following instructions: BX , BLX , or an LDR or LDM that loads the PC.

....

The target instruction set is either encoded directly in the instruction (for the immediate offset version of BLX ), or is held as bit[0] of an interworking address.


[1] ARM® 架构参考手册:ARMv7-A 和 ARMv7-R 版。 ARM,2014 年。DDI 0406C.c。 [在线的]。可用:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html。 [2019 年 8 月 26 日访问]。