【问题标题】:Dividing floats in extended assembler在扩展汇编程序中划分浮点数
【发布时间】: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

【问题讨论】:

标签: c assembly x86 inline-assembly x87


【解决方案1】:

在进行任何内联汇编编程之前,请仔细阅读documentation。 Gcc 风格的内联汇编复杂且容易出错。如果你弄错了,通常不会出错。相反,错误的代码会默默地产生。因此,请确保您完全了解自己在做什么。在你的情况下,你应该特别关注§6.47.2.9

阅读本文档,以下代码似乎是正确的:

float test(float numerator, float denominator)
{
    float result;

    asm ("fdiv%Z2 %2" : "=t"(result) : "0"(numerator), "fm"(denominator));

    return result;
}

这允许源操作数是内存操作数。如果不需要,语句可以更简单:

asm ("fdiv %2" : "=t"(result) : "0"(numerator), "f"(denominator));

如果不是将结果写入不同的变量,而是覆盖numerator,代码可以更简单。

asm ("fdiv %1" : "+t"(result) : "f"(denominator));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多