【发布时间】:2020-02-16 18:55:26
【问题描述】:
尝试使用内联汇编将 400 乘以 2,使用事实 imul 隐式乘以 eax。但是,我收到 $1 和 $2 的“未定义引用”编译错误
int c;
int a = 400;
int b = 2;
__asm__(
".intel_syntax;"
"mov eax, $1;"
"mov ebx, $2;"
"imul %0, ebx;"
".att_syntax;"
: "=r"(c)
: "r" (a), "r" (b)
: "eax");
std::cout << c << std::endl;
【问题讨论】:
-
那不是
masm所以不要用masm标记它。不要使用eax或ebx,除非您已正确编写约束。不要在内联 asm 中切换语法,如果要编写 intel 语法,请使用-masm=intel。 (实际的错误当然是你需要.intel_syntax noprefix,但不要修复它。而是修复其他所有问题。) -
在 Intel 语法中,
$1是符号名称。英特尔语法不对立即数使用修饰符,mov $1, %eax仅适用于 AT&T。一旦你解决了这个问题,你会发现其他所有东西都坏了。见小丑的评论。此外,您不需要mov指令,只需告诉编译器将您的输入放在哪里,或者在任何地方使用%0/%1或命名操作数让它选择。见segmentation fault(core dumped) error while using inline assembly。如果您在 asm 模板中的第一条或最后一条指令是mov,那么您通常做错了。 -
哦,是的,应该是
%1用于操作数替换。 -
@Jester 我猜你是说clobber 列表不正确?
-
@Jester 我用 MASM 标记了它,因为 MASM 标记的 Stackoverflow 描述提到了 Intel 语法。
标签: gcc assembly x86 inline-assembly