C内联汇编x86 fbstp指令

时间:2010-06-14 21:00:40

标签: gcc assembly x86 inline-assembly

想知道如何在32位I86架构上内联使用fbstp。我试过像

这样的东西
int main( )
{
    double foo = 100.0;

    long bar = 0;

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

    ...

但是酒吧没有变化。我已经尝试过阅读我能找到的所有内容,但大多数例子只是做一些事情,比如将两个整数加在一起。我找不到任何关于将操作数推入堆栈的讨论以及当fbstp等指令将80位数据写回内存(即使用什么C类型)以及如何在asm语法中指定它时我应该做什么

同样在x86-64上似乎有pushq而没有pushl但是fbstp仍然存在而fbstq没有。 64位还有其他一些魔力。

1 个答案:

答案 0 :(得分:2)

这里有一个例子: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");