gpt4 book ai didi

c - 英特尔 asm 语法与 GCC : undefined reference

转载 作者:行者123 更新时间:2023-12-01 13:45:42 25 4
gpt4 key购买 nike

我正在运行 64 位 Ubuntu,并且我有以下代码:

#include <stdio.h>

int main() {
int x, y;
int z = 0;

printf("Enter two numbers: ");
scanf("%d %d", &x, &y);

asm(".intel_syntax noprefix\n"

"MOV EAX, _x\n"
"MOV ECX, _y\n"
"ADD EAX, ECX\n"
"MOV _z, EAX\n"

".att_syntax\n");

printf("%d + %d = %d \n", x, y, z);

return 0;
}

根据学校的讲座,它应该可以工作,但是当我尝试用 GCC 编译它时,我得到了这个错误:

/tmp/ccU4vNLr.o: In function `main':
Jung_79913_211.c:(.text+0x4a): undefined reference to `_x'
Jung_79913_211.c:(.text+0x51): undefined reference to `_y'
Jung_79913_211.c:(.text+0x5a): undefined reference to `_z'
collect2: error: ld returned 1 exit status

我知道 GCC 默认使用 AT&T asm 语法,但我在大学时需要 Intel systax。所以问题是,我如何让它工作?

最佳答案

两件事:首先,在 Linux 上,您不会在汇编中使用下划线作为 C 符号的前缀,因此 xyz而不是 _x_y_z。其次,这三个变量是自动变量。您不能像这样引用自动变量,因为没有为它们创建符号。相反,您需要告诉编译器将这些变量移交给您的程序集。您还需要将寄存器 eaxecx 标记为已损坏,因为您的程序集修改了它们。阅读this documentation了解详情。以下是如何使用您的代码:

asm(
"MOV EAX, %1\n"
"MOV ECX, %2\n"
"ADD EAX, ECX\n"
"MOV %0, EAX\n"
: "=r" (z) : "r" (x), "r" (y) : "eax", "ecx");

您还需要使用 -masm=intel 进行编译,否则 gcc 将在 AT&T 语法中插入对寄存器的引用,从而导致编译错误。更好的是,如果您打算为 gcc 编写大量内联汇编,请学习 AT&T 语法。

关于c - 英特尔 asm 语法与 GCC : undefined reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36359092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com