【问题标题】:Function address in ARM assembly have one byte offset?ARM 程序集中的函数地址有一个字节偏移?
【发布时间】:2016-05-03 13:03:27
【问题描述】:

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

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

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

【问题讨论】:

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

标签: assembly arm thumb


【解决方案1】:

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

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

[1] 中的第 A4.1.1 节“在 Thumb 状态和 ARM 状态之间切换”陈述如下:

处于 Thumb 状态的处理器可以通过执行任何 以下指令: BX 、 BLX 或 LDR 或加载 PC 的 LDM。

....

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


[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 日访问]。

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2021-11-21
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多