【问题标题】:C inline assembly of x86 fbstp instructionx86 fbstp指令的C内联汇编
【发布时间】:2024-04-17 03:20:01
【问题描述】:

想知道如何在 32 位 I86 架构上内联 fbstp 的使用。我尝试了类似的东西

int main( )
{
    double foo = 100.0;

    long bar = 0;

    asm( "pushl %1; fbstp %0"
         : "=m"(bar)
         : "r"(foo)
       );

    ...

但是 bar 没有改变。我已经尝试阅读我能找到的所有内容,但大多数示例只是简单地将两个整数加在一起。我找不到任何关于将操作数推入堆栈以及当像 fbstp 这样的指令将 80 位数据写回内存时我应该做什么(即使用什么 C 类型)以及如何在 asm 语法中指定它的内容.

同样在 x86-64 上似乎有 pushq 而没有 pushl,但 fbstp 仍然存在,而 fbstq 不存在。 64 位还有其他的魔力吗?

【问题讨论】:

  • 我在这里不是专家,但是 pushl 将值推送到用户堆栈,而 fbstp 从浮点堆栈中弹出,所以你不应该先执行 fld och fild 而不是 push ?

标签: gcc assembly x86 inline-assembly


【解决方案1】:

这里有一个例子:http://bap.ece.cmu.edu/download/bap-0.1/VEX/test/test-i386.c

这似乎建议做这样的事情:

unsigned short bcd[5];
double a;

asm("fbstp %0" : "=m" (bcd[0]) : "t" (a) : "st");

【讨论】: