MSVS и FSTP

Тема в разделе "LANGS.C", создана пользователем Xerx, 20 окт 2007.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Собственно ситуация: есть MSVS2005. В нем есть наброски класса:
    Код (Text):
    1. #define MY_FLOAT_SIZE   8
    2. #define BYTE unsigned char
    3. class MY_FLOAT {
    4.     private:
    5.         BYTE    value[MY_FLOAT_SIZE];
    6.     public:
    7.         MY_FLOAT();
    8.         // ....
    9. };
    Нужно реализовать примерно следующий код для конструктора:
    Код (Text):
    1. MY_FLOAT::MY_FLOAT() {
    2.     value = 0;
    3. }
    Делаю так:
    Код (Text):
    1.     __asm {
    2.         fldz
    3.         fstp    value // вот тут и проблема. так ругается
    4.     }
    Собственно вопрос: как корректно выполнить данную операцию? Ведь FSTP требует размерности приемника...
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    qword ptr не помогает?
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Тестирую на коде:
    MY_FLOAT::MY_FLOAT() {
    value[0] = 0x11;
    value[1] = 0x22;
    value[2] = 0x33;
    value[3] = 0x44; // для определения, что использую правильный адрес и он меняется при вызове FSTP

    __asm int 3; // ставлю брейк для отладки в Ольке
    // BYTE *v = value; // я пробовал разные тупые
    // BYTE *v = &value[0]; // способы, но ничего не помогло
    __asm {
    fldz
    fstp qword ptr [v]
    // fstp qword ptr value // прямая задача value выдает error C2415: improper operand type
    }
    }
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    value надо в скобки брать:

    Код (Text):
    1. MY_FLOAT::MY_FLOAT() {
    2.  
    3.     __asm   {
    4.         fldz
    5.         fstp qword ptr[value]
    6.     }
    7. }
    можно и через eax задать адрес:

    Код (Text):
    1. MY_FLOAT::MY_FLOAT() {
    2.     BYTE    *p = &value[0];
    3.  
    4.     __asm   {
    5.         mov eax,p
    6.         fldz
    7.         fstp qword ptr[eax]
    8.     }
    9. }
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    cresta
    Со скобками я пробовал с самого начала - как-никак это стандартная запись. Но все-равно компилятор ругался недопустимым типом операнда. Через EAX заработало. Хотя смотрится, ИМХО, весьма коряво...

    Ну ладно, с этим вроде как проблем больше нет. Спасибо!

    P.S. если кто может предложить способ лучше, чем через левую переменную - идею в студию :derisive:
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Xerx

    Приведи сообщение об ошибке, которое выдавал компилятор на fstp qword ptr[value] ?

    А адресация через eax - это не "левый", а один из стандартных способов
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    cresta
    Я это в самом начале указал:
    Просто он несколько странно выглядящий.
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Xerx
    Эту ошибку компилятор выдаёт на fstp qword ptr value.
    Если делать fstp qword ptr[value], никаких ошибок нет.

    Об адресации через регистр: fstp qword ptr[esp] выглядит точно так же, как и fstp qword ptr[eax]...
     
  9. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    cresta
    Да я не об этом! Я про сам факт использования промежуточного регистра.

    А мой ругается недопустимым операндом и со скобками... Ненавижу MSVS....