ARM程序集使用C调用具有寄存器作为参数的函数

时间:2016-05-16 11:25:31

标签: c assembly arm

我有以下ARM汇编代码:

mov r0, SP
mov r1, LR
bl func

有没有办法用C代码调用函数func?像func(SP, LR)

这样的东西

谢谢!

2 个答案:

答案 0 :(得分:2)

取决于您想要做什么以及您使用的编译器。 使用gcc这样的东西可以起作用:

extern void func(void*, void*);
void foo()
{
    int dummy[4];
    func(&dummy, __builtin_return_address(0));
}

但是,这可能并不总能为您提供精确的堆栈指针。根据{{​​3}},它生成以下汇编代码:

foo():
    push    {lr}
    sub     sp, sp, #20
    mov     r1, lr
    mov     r0, sp
    bl      func(void*, void*)
    add     sp, sp, #20
    ldr     pc, [sp], #4

答案 1 :(得分:0)

使用输出寄存器将LRSP放入变量中:

void *lr, *sp;

asm ("mov %0, sp" : "=r" (sp));
asm ("mov %0, lr" : "=r" (lr));
func(lr, sp);