【发布时间】:2022-02-23 22:25:11
【问题描述】:
在我的 C 程序中,我想在扩展汇编程序中执行以下操作: 将两个浮点数(变量)“分子”除以“分母”,并将结果放入另一个变量“结果”中。这是我对它的外观的猜测,但它似乎无法编译。
float result, numerator, denominator;
asm volatile(" fdiv %2, %1 "
: "=r" (result)
: "1" (numerator), "2" (denominator));
编译错误:
example_program.c:66:16: error: matching constraint references invalid operand number
: "1" (numerator), "2" (denominator));
example_program:16: error: matching constraint references invalid operand number
example_program.c:64:3: error: matching constraint references invalid operand number
asm volatile(" fdiv %2, %1 "
^
example_program.c:64:3: error: matching constraint references invalid operand number
make: *** [<builtin>: example_program] Error 1
【问题讨论】:
-
这不是像
"1"这样的数字约束的意思,它们是匹配约束,你只有一个非编号约束。它指定了一个通用(整数)寄存器,而不是 x87 FP 寄存器。而且您的内联汇编没有引用它(%0)。与其胡乱猜测,不如阅读“x87 内联汇编”的教程和/或 google,以在一个操作数上找到类似 Operand type mismatch in x87 inline assembly in a Linux kernel module 的fsqrt示例。 -
另外,x87 指令不能使用两个任意的 x87 寄存器; x87 是一种寄存器堆栈机器,其中一个操作数(源或目标)必须始终位于堆栈顶部。 ray.masmcode.com/tutorial/index.html / felixcloutier.com/x86/fdiv:fdivp:fidiv
标签: c assembly x86 inline-assembly x87