2016-05-16 80 views
1

寄存器作为参数的函数,我有以下的ARM汇编代码:ARM汇编调用带有用C

mov r0, SP 
mov r1, LR 
bl func 

是否有使用调用C代码的函数func的一种方式?像func(SP, LR)

谢谢!

+0

不确定;使用C.如果你想使用C语法,如果在编写汇编代码时没有真正看到这一点。我想你可以编写一个类似于你在MASM中获得的invoke宏的宏,然后你可以编写诸如'invoke func,sp,lr' – Michael

回答

2

取决于你想要做什么和你使用的编译器。 随着gcc这样的事情可以工作:

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

这可能并不总是给你确切的堆栈指针,虽然。按照godbolt它产生以下组件的代码:

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 
0

使用输出寄存器放置LRSP在变量:

void *lr, *sp; 

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