.global _start
_start:
mov x0, #1
ldr x1, msg
mov x2, #13
mov x16, #4
svc #0x80
mov x0, #0
mov x16, #1
svc #0x80
.data
msg: .ascii"Hello, world!\n"
Hello.s 使用 as hello.s -o hello.o
完美组装,我还尝试将其重新键入为
as -arch arm64 -o hello.o hello.s
,它返回一个名为 hello.o 的目标文件。然后我链接目标文件如下:
ld -o hello hello.o -lSystem -syslibroot
xcrun -sdk macosx --show-sdk-path
-e _start -arch arm64
它返回一个可执行文件:hello 但是当我使用
./hello
运行文件时出现错误 我收到错误消息:
zsh: invalid system call ./hello
我尝试将汇编文件中的代码更改为我在 Youtube 视频中看到的
.global _start
_start:
mov x0, #1
ldr x1, =msg
mov x2, #14
mov x8, #64
svc #0
mov x0, #0
mov x8, #93
svc #0
.data
msg: .ascii"Hello, world!\n"
这仍然可以成功组装和链接,但给出了相同的运行时错误。我也尝试更改链接调用,但这并没有做任何事情来修复它(我没有尝试所有可能的链接,主要是因为我是汇编新手并且不理解所有链接,所以这仍然是可能是错误)。
如果您需要更多信息,请告诉我。
编辑: 我最近尝试在不同的 shell 中进行组装,结果发现我有一个来自
Bad system call: 12
命令的
sh-3.2$ ./hello
.global _start
.align 4
_start:
mov X0, #1
adrp X1, helloworld@page
add X1, X1, helloworld@pageoff
mov X2, #13
mov X16, #4
svc #0x80
mov X0, #0
mov X16, #1
svc #0x80
.data
helloworld:
.ascii "Hello World!\n"
随后:
cc -c HelloWorld.s
ld -o HelloWorld HelloWorld.o -e _start
./HelloWorld
它的文档很少,但是当标签位于不同的代码部分时,ldr <reg>,=<label>
在MacOS上不起作用。您必须使用 adrp/add。