My gcc:线程模型:posix
gcc版本8.1.0(x86_64-posix-seh-rev0,由MinGW-W64项目构建)
我试图创建一个简单的应用程序,用两个文件saberi.c和saberi.s对两个数字求和,使用gcc和intel语法,其中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;
}

萨贝里
.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)时,得到一个随机值作为和。

最佳答案

MinGW编译器默认为Windows目标编译。这意味着编译器遵循Windows ABI和windows调用约定。
前两个整数参数传入rcxrdx而不是系统V ABI中的rdirsi
您可以通过为saberi.c生成程序集来验证-

gcc -S saberi.c -o saberi_compiled.s

您将看到,在调用saberi之前,编译器在ecxedx中移动参数。
所以你的军刀应该改成-
intel_syntax noprefix
.text
    .globl saberi
saberi:
    enter 0,0
    mov eax, ecx
    add eax, edx
    leave
    ret

你应该得到正确的结果。
另一个选项是告诉编译器在调用saberi时使用System V ABI。这可以在gcc(MinGW)中使用sysv_abi属性对saberi函数执行-
int saberi(int a, int b) __attribute__((sysv_abi));

然后你可以保持你的程序集不变。当您要编写跨平台可移植的程序集时,此方法非常有用。但它当然只限于gcc

关于c - 当与程序集结合时,gcc mingw提供垃圾输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54505982/

10-11 21:58