臂组件传递一个字符串作为参数

时间:2016-11-11 07:30:32

标签: string assembly arm

如果我有这样的格式字符串:

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

2 个答案:

答案 0 :(得分:2)

与第一个符号一样,您使用adrp加载地址的高位,并使用add

添加低位
adrp x1, fmtName
add  x1, x1, :lo12:fmtName

或直接从常量池中加载地址

ldr x1, =fmtName

答案 1 :(得分:0)

这可能会对你有所帮助。

{{1}}

输出:

{{1}}