Assembly ARM组件中的功能地址是否有一个字节偏移?

Assembly ARM组件中的功能地址是否有一个字节偏移?,assembly,arm,thumb,Assembly,Arm,Thumb,例如,我有以下由objdump获得的汇编代码。f()的地址是080001d4。但是printf(“%x”,f)输出080001d5。而f()可以通过(*((int(*)()080001d5))(完成,但是(*((int(*)()080001d4))(完成 为什么函数地址中有一个字节的偏移量 080001d4 <f>: 80001d4: 2000 movs r0, #0 80001d6: 4770 bx lr 080001d4: 800

例如,我有以下由
objdump
获得的汇编代码。
f()
的地址是
080001d4
。但是
printf(“%x”,f)
输出
080001d5
。而
f()
可以通过
(*((int(*)()080001d5))(
完成,但是
(*((int(*)()080001d4))(
完成

为什么函数地址中有一个字节的偏移量

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

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

即使您使用
-marm
开关重新编译地址,该地址也将被删除

[1]中的第A4.1.1节“拇指状态和手臂状态之间的变化”说明了以下内容:

处于Thumb状态的处理器可以通过执行以下任一操作进入ARM状态: 以下说明:BX、BLX或LDR 或加载PC的LDM

目标指令集要么直接在指令中编码 (对于BLX的即时偏移版本),或 作为互通地址的位[0]保存



[1] ARM®体系结构参考手册:ARMv7-A和ARMv7-R版本。ARM,2014年。DDI 0406C.c。[在线]。可用:。[于2019年8月26日访问]。

LSB用于选择拇指模式。LSB为一位。但是偏移量是一个字节。地址的一位表示一个字节。哦,我知道你的意思。谢谢请参阅bx说明中的arm文档。当地址锁存到pc中时,lsbit将被删除,但bx或pop正常工作需要lsbit。