如何在arm64 ios程序集中调用malloc

时间:2014-02-12 15:40:11

标签: ios c assembly malloc arm64

我试图从iOS arm64程序集.s文件中调用malloc, 但是从* .m文件调用_test_malloc,它不会从_test_malloc()返回 (在iPhone5s上运行)

我误解了什么?

//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();   
    }

2 个答案:

答案 0 :(得分:3)

您没有保存来电者的链接注册内容。您需要在函数序言指令中保存它,并且需要在函数结尾中恢复它。因为你要在堆栈上保存一些东西,所以你还需要调低堆栈指针,使它按照ABI的要求保持16字节对齐。您需要设置帧指针寄存器并在函数all之后将其恢复。

我建议反汇编编译器生成的函数,看看这个设置和拆卸是如何完成的。它是简单的模板代码,几乎在每个函数中都是相同的。

答案 1 :(得分: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