将超过四个参数传递给通过包装函数调用的函数,该包装函数是使用ARM clang 6.6中的内联汇编编写的

问题描述

我正在尝试围绕RTOS提供的功能创建包装器功能。在包装函数中,我使用内联汇编来调用软件中断指令(SVC),以便处理器跳转到SWI处理程序,该处理程序首先提取SWI编号,然后使用该编号索引到SWI表中,从而进一步调用实际的OS功能

包装器函数的原型与OS函数完全相同,因此传递给包装器函数的所有参数都以完全相同的顺序转发到OS函数。当函数的参数小于或等于四个且因此通过寄存器R0-R3传递时,这一切都很简单。像这样的东西:

std::uint32_t wrapper_function(std::uint32_t a1,std::uint32_t a2,std::uint32_t a3,std::uint32_t a4)
{
    std::uint32_t ret {};

    __asm volatile(
        "SVC 0x05"
        : "=r" (ret)
        : "r" (a1),"r" (a2),"r" (a3),"r" (a4)
        : "r14");

    return ret;
}

但是,如果函数有四个以上的参数,并且由于第四个参数之后的所有参数都通过堆栈传递,那么如何转发这些参数?

我正在使用ARM Compiler 6.6(ARM Clang 6.6),并且正在使用的系统具有ARM Cortex R5处理器。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)