Компилятор MinGW компилируется по умолчанию для цели Windows.Это означает, что компилятор следует Windows ABI и соглашению о вызовах Windows.Первые два целочисленных аргумента передаются в rcx
и rdx
вместо rdi
и rsi
, как в System V ABI.
Вы можете проверить, сгенерировав сборку для saberi.c как -
gcc -S saberi.c -o saberi_compiled.s
Вы увидите, что перед вызовом saberi
компилятор перемещает аргументы в ecx
и edx
.
Таким образом, ваши сабли должны быть изменены на -
intel_syntax noprefix
.text
.globl saberi
saberi:
enter 0,0
mov eax, ecx
add eax, edx
leave
ret
И вы должны получить правильные результаты.
Другой вариант - указать компилятору использовать ABI System V при вызове saberi
.Это можно сделать в gcc (MinGW), используя атрибут sysv_abi
для функции saberi
как -
int saberi(int a, int b) __attribute__((sysv_abi));
Тогда вы можете сохранить свою сборку такой же.Этот метод полезен, когда вы хотите написать сборку, переносимую между платформами.Но, конечно, он ограничен только gcc
.