Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C调用以寄存器作为参数的函数的ARM程序集_C_Assembly_Arm - Fatal编程技术网

使用C调用以寄存器作为参数的函数的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) 谢谢

我有以下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)


谢谢

取决于您想要做什么以及使用什么编译器。 使用
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