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。