在 ARM 汇编预处理中获取对齐

Get alignment in ARM Assembly preprocessing

我需要在 Thumb-2 汇编代码中存储指向下一条指令的指针。 Thumb-2 指令可以是 16 位和 32 位的,因此是半字对齐的。当我使用 PC 作为 add 中的源操作数时,我实际上读取了字对齐程序计数器加 4(即,比当前指令多 2 或 4)。因此,我需要将当前程序计数器加 0 或 2 以获得下一条指令地址。

现在,我可以使用 .align 在单词边界上获取此指令,在这种情况下,我可以简单地添加 0。但是,如果没有必要,我不想使用 nops .

有可能是下面这样的吗?

.if alignment_of_next_instruction % 4 == 2
        add r12,pc,#2
.else
        add r12,pc,#0       @ just an example, mov would be better
.endif
        str r12,[sp,#-4]!

我不能使用nop的原因是在某些情况下我不需要获取下一条指令的地址,而是获取下一条指令的地址,甚至更远的一条指令。在这些情况下,add 是必需的,但我是否需要添加 10 或 12(例如)取决于对齐方式。

如果不清楚,下面是 .align 使用我建议的语法时的样子:

.if alignment_of_next_instruction % 4 == 2
        nop
.endif

我在 ARM SDK 参考指南的汇编程序表达式和运算符 (5.9) 部分找不到任何内容,但也许我应该去别处看看。

与其胡乱尝试根据地址和偏移量工作,不如根据指令指定内容,即使用标签:

   adr r12, 1f
   ...
1: <instruction of interest>

汇编器和链接器知道该做什么。