我发现了一个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的一部分。
解决办法是什么?
1条答案
按热度按时间vzgqcmou1#
你可以创建一个新的符号长度,然后
mov
它到一个寄存器。字符串
.equ len, helloend - helloworld
也可以。你可以通过在字符串后面定义来缩短它:型
我认为问题在于,对于
mov x2, #(end - begin)
,汇编程序试图发出修正,让链接器做减法,并将结果编码到指令中。不支持此操作。但是len = end - begin
强制减法在汇编器内完成,然后它可以直接编码立即数。