чему равно long double ?

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

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Предыстория..

    в Plugin.h от OllyDbg есть такая структура
    Код (Text):
    1. typedef struct t_reg {                 // Excerpt from context
    2.   int            modified;             // Some regs modified, update context
    3.   int            modifiedbyuser;       // Among modified, some modified by user
    4.   int            singlestep;           // Type of single step, SS_xxx
    5.   ulong          r[8];                 // EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
    6.   ulong          ip;                   // Instruction pointer (EIP)
    7.   ulong          flags;                // Flags
    8.   int            top;                  // Index of top-of-stack
    9.   long double    f[8];                 // Float registers, f[top] - top of stack
    10.   char           tag[8];               // Float tags (0x3 - empty register)
    11.   ulong          fst;                  // FPU status word
    12.   ulong          fcw;                  // FPU control word
    13.   ulong          s[6];                 // Segment registers ES,CS,SS,DS,FS,GS
    14.   ulong          base[6];              // Segment bases
    15.   ulong          limit[6];             // Segment limits
    16.   char           big[6];               // Default size (0-16, 1-32 bit)
    17.   ulong          dr6;                  // Debug register DR6
    18.   ulong          threadid;             // ID of thread that owns registers
    19.   ulong          lasterror;            // Last thread error or 0xFFFFFFFF
    20.   int            ssevalid;             // Whether SSE registers valid
    21.   int            ssemodified;          // Whether SSE registers modified
    22.   char           ssereg[8][16];        // SSE registers
    23.   ulong          mxcsr;                // SSE control and status register
    24.   int            selected;             // Reports selected register to plugin
    25.   ulong          drlin[4];             // Debug registers DR0..DR3
    26.   ulong          dr7;                  // Debug register DR7
    27. } t_reg;
    а также есть Plugin.inc тот же хидер переведенный под масм
    Код (Text):
    1. t_reg struc 1   ; Excerpt from context
    2.         modified        dword   ?           ; Some regs modified, update context    
    3.         modifiedbyuser  dword   ?           ; Among modified, some modified by user
    4.         singlestep      dword   ?           ; Type of single step, SS_xxx          
    5.         r               dd      8 dup (?)   ; EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI      
    6.         ip              dword   ?           ; Instruction pointer (EIP)            
    7.         flags           dword   ?           ; Flags                                
    8.         top             dword   ?           ; Index of top-of-stack                
    9.         f               real10  8 dup (?)   ; Float registers, f[top] - top of stack
    10.         tag             db 8 dup (?)        ; Float tags (0x3 - empty register)    
    11.         fst_            dword   ?           ; FPU status word                      
    12.         fcw             dword   ?           ; FPU control word                      
    13.         s               dd 6 dup (?)        ; Segment registers ES,CS,SS,DS,FS,GS  
    14.         base            dd 6 dup (?)        ; Segment bases                        
    15.         limit           dd 6 dup (?)        ; Segment limits                        
    16.         big             db 6 dup (?)        ; Default size (0-16, 1-32 bit)        
    17.         dr6_            dword   ?           ; Debug register DR6                    
    18.         threadid        dword   ?           ; ID of thread that owns registers      
    19.         lasterror       dword   ?           ; Last thread error or 0xFFFFFFFF
    20.         ssevalid        dword   ?           ; Whether SSE registers valid
    21.         ssemodified     dword   ?           ; Whether SSE registers modified
    22.         ssereg          db 8 dup (16 dup (?))     ; SSE registers                        
    23.         mxcsr           dword   ?           ; SSE control and status register      
    24.         selected        dword   ?           ; Reports selected register to plugin  
    25.         dummy           dd 4 dup (?)        ; Reserved for future compatibility    
    26. t_reg ends
    Масмовский вариант работает нормально, а сишный нет.
    Распечатал смещения всех элементов, выяснил что проблема
    в
    long double f[8]; // Float registers, f[top] - top of stack
    в сях(MS VS NET 2005)
    у long double другой размер, не соответствует масмовскому варианту.

    Можно ли пофиксить не трогая хидера?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    вроде единственный способ это использовать intel compiler
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    поставил intel compiler
    включил в командную строку компилятора /Qlong-double
    (/Qlong-double enable 80-bit 'long double')

    теперь получается sizeof(long double) = 16

    почему 16, почему не 10 собственно, не пойму никак?
     
  4. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    На выравнивание элементов структур очень похоже.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Rustem
    что похоже?

    дело не в выравнивании, у Olly в SDK требование "VERY IMPORTANT NOTICE: COMPILE THIS DLL WITH BYTE ALIGNMENT OF STRUCTURES AND UNSIGNED CHAR!", что и соблюдено в настройках
    проекта. Причина в том что у MS sizeof(long double)=64bit, а нужно 80bit, по идее intel
    это поддерживает, но на деле непонятно что происходит :/
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Visual до сих пор не поддерживает 80-битную FPU арифметику, long double тупо соответсвует double. Судя по статьям в блогах, в 2005-ой версии уже должны были включить совместимость со стандартным long double, но, по моим поверхностным наблюдениям, так и не включили.

    В GCC sizeof(long double) = 10 или 12 или 16, в зависимости от ключей. Надо отдать должное разработчикам.

    Про интел не в курсе.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    я в замешательстве, у cl возможно поддержка появится в 9й версии
    http://blogs.msdn.com/ericflee/archive/2004/06/10/152852.aspx
    но от интела, где эта поддержка заявлена я не ожидал, откуда
    icc взял что 80bit это 16 ?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Asterix
    Пиши на асме :)
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    я хотел портировать исходники на С, на асме слишком муторно добавлять новые фичи
     
  10. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Точности double не хватает?
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    W4FhLF
    адресуйте вопрос автору OllyDbg, а также внимательнее читайте топик


    а у intel'а действительно тоже не все так как хотелось бы, вот что написано:
    The /Qlong-double option changes a long-double to an 80-bit data type. However, the alignment requirement of the data type is 16 bytes, and its size must be a multiple of its alignment, so the sizeof a long-double on Windows is 16 bytes as well. Only the lower 10 bytes (80 bits) of the 16 byte space will have valid data stored in it.
     
  12. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Asterix

    Я имел ввиду, что при передаче в функции структуры ты можешь сконевертировать 64 в 80 написав небольшую функцию, а в остальном работать в своеём плагине с 64.
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    W4FhLF
    вы не внимательно читаете и анализируете, структура физически находится в другом
    модуле, указатель на нее возвращает функция, если long double будет не того размера
    на который рассчитывал автор я просто считаю не те данные, т.к. из-за изменения размеров
    long double изменяется местоположение элементов струтуры и размер, в моем коде мне
    не long double не double вобще не нужен
     
  14. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Перечитал два раза, всё вроде понимаю. :)

    Может тогда просто объявить этот элемент как char[10]?
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    W4FhLF
    править заголовки некошерно, вот исходя из этого предлагайте решение
     
  16. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Отписаться автору дебагера и\или перейти на версию С, у к-рой long double это 80 бит? (Я так понимаю, что автор OllyDbg пишет отладчик и плагины на bcc, стало быть там не должно быть этой проблемы?)
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    автору будем писать когда выйдет СДК под Олли 2.0

    сейчас решение найдено такое
    объявлены две свои структуры t_reg_ и t_thread_, аналогичные t_reg и t_thread

    в t_reg_ long double заменено на LONG_DOUBLE

    typedef struct LONG_DOUBLE {
    char buff[10];
    } LONG_DOUBLE;

    на BC++ переходить не хотелось, а на intel не получилось по причинам выше

    если кто-то видит лучшее решение предлагайте
     
  18. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Что-то Вы сами себе противоречите :derisive:
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    censored
    в чем?

    хидер Plugin.h остался оригинальным
     
  20. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"