0

我正在尝试围绕 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;
}

但是当函数有超过 4 个参数并且由于第四个之后的所有参数都通过堆栈传递时,如何转发这些参数?

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

4

0 回答 0