2014-02-12 21 views
1

我想從iOS的arm64程序集文件調用malloc, 然而,從* .m文件調用_test_malloc,它不會從_test_malloc() (在iPhone5s上運行)返回,如何調用arm64中的malloc ios程序集

我誤解了什麼?

//test_malloc.s 
.private_extern _test_malloc 
.globl _test_malloc 
.align 2 
_test_malloc: 
    mov x0, #8  
    bl _malloc //wordPtr = malloc(8) 
    ret 



//run_test_malloc.m 
    extern uint32_t* test_malloc(); 
    static void run_test_malloc() { 
     uint32_t* ptr = test_malloc(); 
    } 

回答

1

這是我如何固定它:

.private_extern _test_malloc 
.globl   _test_malloc 
.align   2 
_test_malloc: 
    //function prolog 
    stp fp, lr, [sp, #-16]! 
    mov fp, sp 

    orr x0, xzr, #0x8 
    bl _malloc   //malloc(8) 

    //function epilog 
    ldp fp, lr, [sp], #16 
    ret lr 
+0

不知道爲什麼你保存和恢復'x19'和'x20',只要你不使用它們。 –

+0

保存和恢復x19和x20不需要,它們已被刪除。謝謝斯蒂芬。該代碼是其他函數的實際使用x19的副本。 – user2992766

3

你沒有保存調用者的鏈接寄存器內容。您需要將它保存在函數序言指令中,並且需要在函數結尾中恢復它。因爲你在堆棧上保存了一些東西,所以你還需要調整堆棧指針,使它保持16字節對齊ABI的要求。你需要設置你的幀指針寄存器並在函數完成後恢復它。

我會建議反彙編編譯器生成的函數,看看這個設置和拆卸是如何完成的。這是幾乎所有功能都做到的簡單模板代碼。

相關問題