我正在尝试从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();
}
您没有保存调用方的链接寄存器内容。 您需要将其保存在函数序言指令中,并且需要在函数尾声中恢复它。 由于您要在堆栈上保存某些内容,因此还需要向下调整堆栈指针,使其保持 16 字节对齐,符合 ABI 的要求。 您需要设置帧指针寄存器,并在函数全部之后将其还原。
我建议反汇编编译器生成的函数,看看这个设置和拆卸是如何完成的。 它是简单的模板代码,几乎在每个函数中都执行相同的操作。
这是我修复它的方法:
.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