我试图从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();
}
答案 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