【问题标题】:ARM assembly calling a function with registers as parameters using C使用 C 调用以寄存器为参数的函数的 ARM 程序集
【发布时间】:2016-05-16 11:25:31
【问题描述】:

我有以下 ARM 汇编代码:

mov r0, SP
mov r1, LR
bl func

有没有使用 C 代码调用函数 func 的方法?类似func(SP, LR)

谢谢!

【问题讨论】:

  • 当然;使用 C。如果你想使用 C 语法,如果真的不明白编写汇编代码的意义。我想您可以编写一个类似于您在 MASM 中获得的 invoke 宏的宏,然后您可以编写诸如 invoke func, sp, lr 之类的东西

标签: c assembly arm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-14
      • 2017-12-07
      • 2015-04-20
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      相关资源
      最近更新 更多