3

32 ビット I86 アーキテクチャで fbstp の使用をインライン化する方法を考えていました。私は何かを試しました

int main( )
{
    double foo = 100.0;

    long bar = 0;

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

    ...

しかしバーは変わらない。私はこれで見つけることができるすべてを読んでみましたが、ほとんどの例は単純に 2 つの整数を足し合わせるようなことをしています。オペランドをスタックにプッシュすること、および fbstp のような命令が 80 ビットのデータをメモリに書き戻すときに何をすべきか (つまり、どの C タイプを使用するか)、および asm 構文でそれを指定する方法について話しているものが見つかりません。 .

また、x86-64 では、pushq があり、pushl はないようですが、fbstp はまだ存在しますが、fbstq は存在しません。64ビット用の他の魔法はありますか?

4

1 に答える 1

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");
于 2010-06-14T21:12:48.787 に答える