Immediate float константы в masm32

Тема в разделе "WASM.BEGINNERS", создана пользователем Dmitry_Milk, 30 май 2011.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Столкнулся с элементарной проблемой, не нахожу решения - хотел прямо в коде использовать float-константу, не обращаясь через DD, скажем:

    mov eax,0.1

    Ведь какая, собственно, разница, каким образом записана константа, если это в конечном счете просто 32-битный immediate? Но тем не меннее masm32 ругается. Приходится так:

    ;где-то в начале
    const01 DD 0.1
    ....
    ;где-то в середине
    mov eax,const01

    Может как-нибудь хитро записывать надо? Пробовал в виде 0.1f, тоже ругается, может еще как-то по другому? Уж больно не хочется заводить DD, скакать по коду приходится лишний раз из середины в начало и обратно (код типа тестовый, постоянно все меняется).
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Переведи в hex раз не хочешь переменную:
    mov eax, 3DCCCCCDh ; 0.1
     
  3. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Например http://babbage.cs.qc.edu/IEEE-754/Decimal.html
    masm не поддерживает подобный синтаксис для чисел с плавающей точкой. Разве что городить макросы друг на друга, но это уже другая история.
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Жаль...
    Спасибо, буду так...
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Dmitry_Milk,
    из констант, загружаемых напрямую:
    • 0 (команда FLDZ или FSUB st,st),
    • 1.0 (команда FLD1)
    • log2(10)=3,32192809488736234780…=[math]\frac{\displaystyle 1}{\displaystyle 0,3010299956639811952202…}[/math]=[math]\frac{\displaystyle 1}{\displaystyle\lg 2}[/math] (команда FLDL2T)
    • 2.0 (команда FLD1, а потом FADD st,st)
    • log2(e)= 1,44269504088896340725…=[math]\frac{\displaystyle 1}{\displaystyle 0,6931471805599453094172…}[/math]=[math]\frac{\displaystyle 1}{\displaystyle\ln 2}[/math] (команда FLDL2E)
    • π = 3,141593265358979323… (команда FLDPI)
    • lg(2)=0,3010299956639811952202… (команда FLDLG2)
    • ln(2)=0,6931471805599453094172… (команда FLDLN2)
     
    Последнее редактирование: 4 июн 2024
  6. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Mikl___, для SSE разных версий все равно не поможет :)
     
  7. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    600
    UASM спокойно компилирует так mov eax, 0.123 mov Pi, 3.14159265359
    Но и МАСМ тоже так может.
    Код (ASM):
    1. ; поместить непосредственное float значение в стек.
    2. pushflt MACRO const:req
    3.     push    12345678h
    4.     org     $-4
    5.     dd      const
    6. ENDM
    7. ; поместить непосредственное float значение в память или регистр, в том числе и xmm.
    8. movflt MACRO param:req, const:req
    9.     IF @SearchStr(<param>,<xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7>)
    10.         IF @SearchStr(<const>,<0.0,0.,0>)
    11.             xorps   param, param
    12.         ELSE
    13.             pushflt const
    14.             movss   param, dword ptr [esp]
    15.             add     esp, 4
    16.         ENDIF
    17.     ELSE
    18.         mov    param, 12345678h
    19.         org     $-4
    20.         dd      const
    21.     ENDIF
    22. ENDM
     
    Последнее редактирование: 4 июн 2024