gpt4 book ai didi

assembly - 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

转载 作者:行者123 更新时间:2023-12-02 22:08:21 24 4
gpt4 key购买 nike

bx到Thumb函数,需要设置地址的最低有效位。 GNU 作为文档 states本地址是从 adr 伪指令生成时,这是如何工作的:

adr <register> <label>

This instruction will load the address of label into the indicated register. [...]

If label is a thumb function symbol, and thumb interworking has been enabled via the -mthumb-interwork option then the bottom bit of the value stored into register will be set. This allows the following sequence to work as expected:

adr r0, thumb_function

blx r0

所以听起来事情应该正常进行。然而,看看一些反汇编,似乎某些地址没有设置了底部位。

例如,组装和链接:

.syntax unified
.thumb

.align 2
table:
.4byte f1
.4byte f2
.4byte f3

.align 2
.type f1, %function
.thumb_func
f1:
adr r1, f1
adr r2, f2
adr r3, f3
bx r1

.align 2
.type f2, %function
.thumb_func
f2:
adr r1, f1
adr r2, f2
adr r3, f3
bx r2

.align 2
.type f3, %function
.thumb_func
f3:
adr r1, f1
adr r2, f2
adr r3, f3
bx r3

与:

arm-none-eabi-as adr_test.s -mthumb -mthumb-interwork -o adr_test.o
arm-none-eabi-ld adr_test.o

并检查arm-none-eabi-objdump -D a.out,我得到:

00008000 <table>:
8000: 0000800d .word 0x0000800d
8004: 00008019 .word 0x00008019
8008: 00008025 .word 0x00008025

0000800c <f1>:
800c: f2af 0103 subw r1, pc, #3
8010: a201 add r2, pc, #4 ; (adr r2, 8018 <f2>)
8012: a304 add r3, pc, #16 ; (adr r3, 8024 <f3>)
8014: 4708 bx r1
8016: 46c0 nop ; (mov r8, r8)

00008018 <f2>:
8018: f2af 010f subw r1, pc, #15
801c: f2af 0207 subw r2, pc, #7
8020: a300 add r3, pc, #0 ; (adr r3, 8024 <f3>)
8022: 4710 bx r2

00008024 <f3>:
8024: f2af 011b subw r1, pc, #27
8028: f2af 0213 subw r2, pc, #19
802c: f2af 030b subw r3, pc, #11
8030: 4718 bx r3
8032: 46c0 nop ; (mov r8, r8)

有几点需要注意:

  1. table 中,f1f2f3 的绝对地址都是奇数,正如预期的那样。因此,显然,汇编器和链接器知道这三个函数应该是Thumb。
  2. 对于向后引用,其中 adr 伪指令汇编为 subw,正如预期的那样,偏移量是奇数。
  3. 但对于前向引用(其中 adr 伪指令汇编为 add),偏移量是偶数。

我错过了什么?

最佳答案

您缺少的是 ARM 文档中 ADR pseudo-instruction 的这一行:

If you use ADR to generate a target for a BX or BLX instruction, it is your responsibility to set the Thumb bit (bit 0) of the address if the target contains Thumb instructions.

前向引用 ADR 指令使用 ADD 指令的 16 位 Thumb“ADD Rdpc#imm”形式。该指令的立即数在 0-1020 范围内,并且必须字对齐(即,用 8 位字段进行编码并乘以 4。)所使用的 PC 值也将低两位设置为 0,因此它无法生成奇数地址。

强制汇编器始终使用带有 ADR.W 的 32 位 Thumb 指令应该会导致它在使用函数标签时始终生成奇数地址,但我不知道您是否可以依赖这一点。最好只显式设置较低位。

关于assembly - 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59110205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com