gcc mingw выдает вывод мусора при объединении со сборкой - PullRequest
0 голосов
/ 03 февраля 2019

Мой gcc: Модель потока: posix

gcc версия 8.1.0 (x86_64-posix-seh-rev0, построена проектом MinGW-W64)

Я пытаюсь создатьпростое приложение, которое суммирует два числа с двумя файлами saberi.c и saberi.s, используя синтаксис gcc и intel, где saberi означает сумму.

saberi.c

#include <stdio.h>
int saberi(int a, int b);
int main()
{   
    int a, b;
    scanf("%d %d", &a, &b);
    printf("Sum is: %d\n", saberi(a, b));
    return 0;
}

saberi.s

.intel_syntax noprefix
.text
    .globl saberi
saberi:
    enter 0,0
    mov eax, edi
    add eax, esi
    leave
    ret

Затем я делаю gcc saberi.c saberi.s и когда я открываю исполняемый файл и набираю любые два числа, например (1 и 2), и получаю случайное значение в качестве суммы.

1 Ответ

0 голосов
/ 04 февраля 2019

Компилятор 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.

...