реконструкция алгоритма прoграммы написанной на Delphi

Тема в разделе "WASM.BEGINNERS", создана пользователем Psionic, 24 янв 2010.

  1. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Psionic

    Что за ... странная проблема для C, почему не unsigned char [sizeof("Extended")] (передаваемый по значению по идее так и "упадет" в стек нужным размером)? Далее - обычные memcpy из/в необходимый тип сишной переменной...
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Не прокатит такой фокус.
    Возвращаемое значение будет в регистре FPU - ST(0).
    А в FPU на х86 они всегда в 80-битовом формате хранятся.
    А для дальнейших операций при выгрузке в память компилятор всё равно сгенерирует код выгружающий в 64-битовый double.
    Вот чего генерирует Intel C++ чтоб было понятней:
    Код (Text):
    1. long double d2ld(double x)
    2. {
    3.     return x;
    4. }
    ---> ASM
    Код (Text):
    1. _d2ld   PROC NEAR
    2.   00000 dd 44 24 04      fld QWORD PTR [esp+4]                  ;test.c:3.12
    3.   00004 c3               ret                                    ;test.c:3.12
    4.   00005 90               ALIGN     2
    5. _d2ld ENDP
    Т.е. просто грузит в FPU.

    Как вариант можешь так в студии сделать:
    Код (Text):
    1. void __declspec(naked) d2ld(double x, void *long_dbl)
    2. {
    3.     __asm{
    4.             mov     eax, [esp+12]
    5.             fld     dword ptr [esp+4]
    6.             fstp    tbyte ptr [eax]
    7.             ret
    8.     }
    9. }
    В переменную на которую указывает long_dbl будет записано 80-битное число.
    Память выделяй как хочешь, хоть char lond_double[10];

    Аналогичный код генерирует и Intel C++ при включённой поддержке long double.