2016-11-11 71 views
0

如果我有一个格式字符串是这样的:臂组件传递一个字符串作为参数

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' 

UPDATE: 这是我如何调用该函数

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

UPDATE 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( “someName”,$ sphereStruct)

输出: 球someName =(2,3,4)半径= 10

+0

什么'fmtName'(不是 “不'fmtName1'” 等)? – Notlikethat

+0

对不起,这是一个错字它应该是fmtName1,我会改变这种情况,该函数可以将fmtName1或fmtName2作为第一个参数 – Sentinel

回答

2

就像第一个符号一样,用adrp加载地址的高位,并将低位加上add

adrp x1, fmtName 
add x1, x1, :lo12:fmtName 

或直接从常量池

ldr x1, =fmtName 
+0

谢谢!只是一个细节。 我实际上没有fmtName,只是在函数被调用之前将它的地址存储在x0中。 我已经试过: LDR X1,= X 这给错误:未定义的引用“X0” – Sentinel

+2

@Sentinel如果你已经有了地址,为什么还要再计算呢? 'mov x1,x0'。 – Notlikethat

+0

我已更新原始问题。我现在先将x0移动到x1,不再出现错误,但该值似乎并未打印。 – Sentinel

0

这可以帮助您加载地址。

.data 
     fmtPrintSphere: 
       .string "Sphere %s\n" 
     fmtName1: 
       .string "First" 
.text 
     .global main 
     .include "mymac_armv8.s" 
main: 
     nop 
     bl write 
_exit 
write: 
     push2 x29,x30 
     ldr x0,=fmtPrintSphere 
     ldr x1,=fmtName1 
     bl printf 
     pop2 x29, x30 
     ret 

OUTPUT:

[email protected]:~/aarch64 $ ./stuff 
Sphere First 
+0

问题是我需要相同的函数来打印fmtName1或fmtName2。这是一个赋值,他们希望我们传递一个字符指针作为函数的第一个参数,第二个参数用于其他参数。 – Sentinel

+0

基于printf的函数打印某件事或另一件事的标准是什么?fmtName1是fmtName2还是只包含ASCII字符的标签? – InfinitelyManic

+0

我不确定它在装配中应该是什么样子,但等效的c代码如下所示: first = newSphere(); second = newSphere(); printSphere(“first”,&first); printSphere(“second”,&second); – Sentinel

相关问题