C встроенная сборка инструкции x86 fbstp - PullRequest
3 голосов
/ 15 июня 2010

Интересно, как встроить использование fbstp в 32-битную архитектуру I86.Я пробовал что-то вроде

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 Ответ

2 голосов
/ 15 июня 2010

Здесь есть пример: 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");
...