在 ARM 汇编预处理中获取对齐
Get alignment in ARM Assembly preprocessing
我需要在 Thumb-2 汇编代码中存储指向下一条指令的指针。 Thumb-2 指令可以是 16 位和 32 位的,因此是半字对齐的。当我使用 PC
作为 add
中的源操作数时,我实际上读取了字对齐程序计数器加 4(即,比当前指令多 2 或 4)。因此,我需要将当前程序计数器加 0 或 2 以获得下一条指令地址。
现在,我可以使用 .align
在单词边界上获取此指令,在这种情况下,我可以简单地添加 0。但是,如果没有必要,我不想使用 nop
s .
有可能是下面这样的吗?
.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>
汇编器和链接器知道该做什么。
我需要在 Thumb-2 汇编代码中存储指向下一条指令的指针。 Thumb-2 指令可以是 16 位和 32 位的,因此是半字对齐的。当我使用 PC
作为 add
中的源操作数时,我实际上读取了字对齐程序计数器加 4(即,比当前指令多 2 或 4)。因此,我需要将当前程序计数器加 0 或 2 以获得下一条指令地址。
现在,我可以使用 .align
在单词边界上获取此指令,在这种情况下,我可以简单地添加 0。但是,如果没有必要,我不想使用 nop
s .
有可能是下面这样的吗?
.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>
汇编器和链接器知道该做什么。