2016-11-11 126 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

相關問題