Я пытаюсь вызвать функции C из ассемблера, но я не получаю значения (параметры), переданные должным образом.
Атрибут fastcall генерирует предупреждение от gcc и игнорируется!
Я использую кодирование в стиле MASM и компилирую его с помощью jwasm (или uasm).
jwasm -q -10 -elf64 -mf -zf0 asmfunc.asm -Fo asmfunc.o
main.c
#include <stdio.h>
__attribute__((fastcall)) void DumpRCX(unsigned long long rcx)
{
printf("%llx\n", rcx);
}
void asmfunc(void);
main(arc, *argv[])
{
asmfunc();
}
asmfunc.asm
EXTERN DumpRCX: PROC
PUBLIC asmfunc
asmfunc PROC
sub rsp, 28h
mov rcx, 84h ; any value for testing
call DumpRCX
add rsp, 28h
ret
asmfunc ENDP
Он запускается и входит в функцию DumpRCX, но значение в RCX никогда не равно 84h.
Насколько я понимаю, fastcall должен передать первый аргумент вызова функции в регистре RCX.
Iпроверил это под mingw gcc + jwasm, а также VS 2015, и все работает нормально.
Я не уверен, что мне не хватает в Linux!