Я думаю, вы просто натолкнулись на причину, по которой встроенная сборка является проблемой в заднице - она совершенно непереносима (и не только между архитектурами; компиляторы часто имеют разный и несовместимый синтаксис). Напишите внешний файл сборки и сделайте все, что вам нужно. Передача параметров в процедуры сборки точно такая же, как и передача их функциям C; просто объявите где-нибудь свою сигнатуру функции, и вызывающий код (в C) сделает правильную вещь. Затем реализуйте подпрограмму во внешнем файле сборки (убедитесь, что соблюдаете соглашение о вызовах) и экспортируйте соответствующий символ, чтобы компоновщик связал все правильно. Presto - рабочая сборка!
Пример по запросу. Я не пытался скомпилировать или протестировать это каким-либо образом, так что это может быть не на 100%. Удачи.
myHeader.h:
void *someOperation(void *parameter1, int parameter2);
myAssemblyFile.s:
.text
.globl someOperation
someOperation:
add %rdx, %rcx
mov %rcx, %rax
ret
.end
mySourceCode.c:
#include "myHeader.h"
void someFunction(void)
{
void *arg1 = (void *)0x80001000;
int arg2 = 12;
void *returnValue;
printf("Calling with %x %x\n", arg1, arg2);
// call assembly function
returnValue = someOperation(arg1, arg2);
printf("Returned: %x\n", returnValue);
}