assembly 如何在ARM64汇编中使用clang的as(1)减去两个标签值?

ktecyv1j  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(97)

我发现了一个ARM 64/MacOS“Hello,World”程序,看起来像这样:

.global _main
.align 2 

_main: mov X0, #1
       adr X1, helloworld
       mov X2, #13
       mov X16, #4
       svc 0

       mov X0, #0 
       mov X16, #1
       svc 0

helloworld:      .ascii  "Hello World!\n"

字符串
我想做的是消除硬编码的字符串长度(mov X2, #13)。但是我不知道如何让as减去两个标签值,以便在表达式中使用。
我尝试在字符串后添加helloend:并执行

mov X2, #helloend - helloworld


这给了我这个消息:

hello.s:6:9: error: unknown AArch64 fixup kind!
    mov X2, #helloend - helloworld


我还尝试执行运行时减法,但尝试使用=label作为sub指令的参数时,我遇到了相同的“error:未知的AArch 64修复类型!”留言。
我使用的as是clang 14.0.3的一部分。
解决办法是什么?

vzgqcmou

vzgqcmou1#

你可以创建一个新的符号长度,然后mov它到一个寄存器。

len = helloend - helloworld
mov x2, #len

字符串
.equ len, helloend - helloworld也可以。你可以通过在字符串后面定义来缩短它:

helloworld:      .ascii  "Hello World!\n"
len = . - helloworld


我认为问题在于,对于mov x2, #(end - begin),汇编程序试图发出修正,让链接器做减法,并将结果编码到指令中。不支持此操作。但是len = end - begin强制减法在汇编器内完成,然后它可以直接编码立即数。

相关问题