1

I am trying to call malloc from iOS arm64 assembly .s file, However calling _test_malloc from *.m file, it does not return from _test_malloc() (running this on iPhone5s)

What am I misunderstanding ?

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

2 回答 2

3

您没有保存调用者的链接寄存器内容。您需要将其保存在函数序言指令中,并且需要在函数尾声中恢复它。因为您在堆栈上保存了一些内容,所以您还需要向下调整堆栈指针,使其保持 ABI 要求的 16 字节对齐。您需要设置帧指针寄存器并在功能完成后恢复它。

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

于 2014-02-13T05:09:01.740 回答
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
于 2014-02-14T14:38:56.917 回答