【发布时间】:2019-02-03 18:14:49
【问题描述】:
我的 gcc:线程模型:posix
gcc 版本 8.1.0(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)
我正在尝试创建一个简单的应用程序,它使用 gcc 和 intel 语法将两个数字与两个文件 saberi.c 和 saberi.s 相加,其中 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)时,我得到一个随机值作为总和。
【问题讨论】:
-
它在我的系统上使用 gcc(7.3.0,不是 mingw)当然可以很好地编译。所以,我猜它与你的 mingw 中的编译器有关。也许您需要声明函数 extern 或使用带有参数的 register 或其他东西?我已经很久没有写任何汇编代码了,我真的只是在猜测......
-
@BobShaffer 尝试同时使用 extern 和 register 并没有改变任何东西,不过谢谢。
-
因为您的 MinGW 工具链正在生成本机 Windows 代码。本机Windows 64-bit calling convention 通过 RCX 和 RDX 传递前 2 个参数(这与 Linux 使用的使用 RDI 和 RSI 的 64 位 System V ABI 不同)。试试
mov eax, ecxadd eax, edx
标签: c gcc assembly mingw calling-convention