Передача более четырех аргументов функции, вызываемой через функцию-оболочку, написанную с использованием встроенной сборки в ARM clang 6.6
Я пытаюсь создать функции-оболочки для функций, предоставляемых ОСРВ. В функции-оболочке я использую встроенную сборку для вызова инструкции программного прерывания (SVC), чтобы процессор перешел к обработчику SWI, который далее вызывает фактическую функцию ОС, сначала извлекая номер SWI, а затем индексируя в таблице SWI, используя этот номер.
Прототип функции-оболочки точно такой же, как и функция ОС, поэтому все аргументы, переданные функции-оболочке, пересылаются в функцию ОС точно в том же порядке. Все это просто, когда функция имеет меньше или равно четырем аргументам и, следовательно, передается через регистры 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.