使用C调用以寄存器作为参数的函数的ARM程序集
我有以下ARM装配代码:使用C调用以寄存器作为参数的函数的ARM程序集,c,assembly,arm,C,Assembly,Arm,我有以下ARM装配代码: mov r0, SP mov r1, LR bl func 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 有没有一种使用C代码调用函数func的方法?类似于func(SP,LR) 谢谢
mov r0, SP
mov r1, LR
bl func
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
有没有一种使用C代码调用函数func的方法?类似于func(SP,LR)
谢谢 取决于您想要做什么以及使用什么编译器。 使用
gcc
类似的方法可以工作:
extern void func(void*, void*);
void foo()
{
int dummy[4];
func(&dummy, __builtin_return_address(0));
}
不过,这可能并不总是给出确切的堆栈指针。根据,它生成以下汇编代码:
mov r0, SP
mov r1, LR
bl func
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
使用输出寄存器将
LR
和SP
放入变量:
void *lr, *sp;
asm ("mov %0, sp" : "=r" (sp));
asm ("mov %0, lr" : "=r" (lr));
func(lr, sp);
当然如果你不明白编写汇编代码的意义,如果你想使用C语法,那么就使用C。我想您可以编写一个类似于MASM中的
invoke
宏的宏,这样您就可以编写invoke func、sp、lr