我正在尝试围绕 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 处理器。