在学习了HelloSilicon关于Apple Silicon的ARM汇编的教程之后,我决定使用通用寄存器和程序计数器。
当使用任何注册器("R1", "R2"…)将源提供给链接器时或";PC"("R15"我得到以下链接器错误:
% ld -o cicle cicle.o -lSystem -syslibroot `xcrun -sdk macosx --show-sdk-path` -e _start -arch arm64
Undefined symbols for architecture arm64:
"PC", referenced from:
_start in cicle.o
ld: symbol(s) not found for architecture arm64
来源:
.global _start // Provide program starting address to linker
.align 2 // Make sure everything is aligned properly
// Setup the parameters to print hello world
// and then call the Kernel to do it.
_start:
label:
mov X0, #1 // 1 = StdOut
adr X1, helloworld // string to print
mov X2, #13 // length of our string
mov X16, #4 // Unix write system call
svc #0x80 // Call kernel to output the string
b PC //Expecting endless loop
//b PC-6 //Expecting endless "Hello World" loop
// Setup the parameters to exit the program
// and then call the kernel to do it.
mov X0, #0 // Use 0 return code
mov X16, #1 // System call number 1 terminates this program
svc #0x80 // Call kernel to terminate the program
helloworld: .ascii "Hello World!n"
我明白这个问题可以在XCode 12上编码时解决+在构建设置上将Bundle更改为Mach-O,但是,附加Bundle参数-b
发送ld: warning: option -b is obsolete and being ignored
警告。
当使用任何注册器("R1", "R2"…)向链接器提供源时或";PC"("R15"我得到以下链接器错误:
这些寄存器不存在,您正在为错误的体系结构阅读手册。你需要ARMv8,而不是ARMv7。
对于这个:
b PC //Expecting endless loop
//b PC-6 //Expecting endless "Hello World" loop
PC
不是一个东西。它只是一个标识符,就像其他标识符一样,比如_start
。如果要引用当前指令,请使用点(.
):
b . // infinite loop
b .+8 // skip the next instruction
注意,任何算术都是不可缩放的。如果你想跳转6条指令,你必须执行b .-(4*6)
。如果你试图编译b .-6
,你会得到一个错误,因为b
只能编码偏移对齐到4个字节。