如何使用内联汇编指定直接浮点数?

pou*_*def 9 c assembly gcc inline-assembly x87

当我尝试编译此代码时:

#include <stdio.h>

main(int argc, char *argv[]) {
   double y = 0;

   __asm__ ("fldl $150;"
            "fsqrt;"
            "fstl %0;" : : "g" (y) );

   printf("%f\n", y);


   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

sqrt.c: Assembler messages:
sqrt.c:6: Error: suffix or operands invalid for `fld'
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?为什么我不能将数字"150"推入堆栈进行浮点运算?

wal*_*lyk 9

我不知道支持立即使用的文字浮点常量的汇编语言.通常的方法是声明包含浮点常量的初始化存储并引用它:

const1:     dq  1.2345
...
     fldl    const1
Run Code Online (Sandbox Code Playgroud)

对于您给出的示例,可以更直接地执行此操作:

printf ("%f\n", sqrt (150));
Run Code Online (Sandbox Code Playgroud)

否则,这必须是一个人为复杂的项目,也许是家庭作业.

  • 我认为x87支持加载1和0,如果你把它们视为immediates;) (2认同)

R..*_*R.. 5

尝试这样的事情

push $0x????????
push $0x????????
fldl (%esp)
addl $8,%esp
Run Code Online (Sandbox Code Playgroud)

其中???????被替换为双常数的IEEE表示.该方法的优点在于它在正常和位置无关(PIC,即共享库)代码中同样有效.