【发布时间】: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 正常工作需要它。