如果我有这样的格式字符串:
fmtPrintSphere:.string "Sphere %s\n"
.global main
.balign 4
和另一个像这样的格式字符串
fmtName1:.string "First"
.global main
.balign 4
当我打第一个时,如何添加第二个字符串作为参数?即
adrp x0, fmtPrintSphere
add x0, x0, :lo12:fmtPrintSphere
mov x1, fmtName1 <-- this causes a segmentation fault
bl 'printf'
更新: 这就是我调用函数的方式
add x0, x29, fmtName1
add x1, x29, origin_offset
bl printSphere
这是我到目前为止在函数中的作用
printSphere:
stp x29, x30, [sp, alloc]!
mov x29, sp
mov x1, x0
adrp x0, fmtPrintSphere
add x0, x0, :lo12:fmtPrintSphere
bl printf
mov w0, 0
ldp x29, x30, [sp], -alloc
ret
这不会引发任何错误,但输出只是: Sphere 它应该是: Sphere First
更新X2: 这是我尝试做的一个例子 -
void printSphere(char *name, struct sphere *s){
printf("Sphere %s origin = (%d, %d, %d) radius = %d\n", name, s->origin.x, s->origin.x, s->origin.y, s->rad)
}
输入: printSphere(&#34; someName&#34;,$ sphereStruct)
输出: 球体someName =(2,3,4)radius = 10
答案 0 :(得分:2)
与第一个符号一样,您使用adrp
加载地址的高位,并使用add
adrp x1, fmtName
add x1, x1, :lo12:fmtName
或直接从常量池中加载地址
ldr x1, =fmtName
答案 1 :(得分:0)
这可能会对你有所帮助。
{{1}}
输出:
{{1}}