Выравнивание Локальных Переменных

Тема в разделе "WASM.BEGINNERS", создана пользователем Tim Sobolev, 6 янв 2006.

  1. Tim Sobolev

    Tim Sobolev New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2005
    Сообщения:
    53
    Есть такой код:
    Код (Text):
    1.  
    2. DirCopy proc _szSrc:LPSTR, _szDst:LPSTR
    3. local   wFind   : WIN32_FIND_DATA
    4. local   hFind   : HANDLE
    5. ;
    6.     lea ebx,offset wFind
    7.     call    FindFirstFileA, _szSrc, ebx
    8.     .if     eax != -1
    9.             mov hFind,eax
    10.         ;
    11.  


    есть определение WIN32_FIND_DATA
    Код (Text):
    1.  
    2. WIN32_FIND_DATA     STRUC
    3. fd_dwFileAttributes DWORD     ?     ;file attributes
    4. fd_ftCreationTime   DWORD     ?, ?      ;time of file creation
    5. fd_ftLastAccessTime DWORD     ?, ?      ;time of last file access
    6. fd_ftLastWriteTime  DWORD     ?, ?      ;time of last write access
    7. fd_nFileSizeHigh    DWORD     ?     ;high-order word of file size
    8. fd_nFileSizeLow     DWORD     ?     ;low-order word of file size
    9. fd_dwReserved0      DWORD     ?     ;(reserved)
    10. fd_dwReserved1      DWORD     ?     ;(reserved)
    11. fd_cFileName        CHAR      MAX_PATH dup(?) ;matching file name
    12. fd_cAlternateFileName   CHAR      14 dup(?) ;8.3 alias name
    13. WIN32_FIND_DATA     ends
    14.  


    Компилится все это TASM32 5.3 и TLINK32 1.6.71.0
    Код (Text):
    1.  
    2. tasm32  /ml /m4  dircopy.asm
    3. tlink32 /aa /Tpe /x /V4.0 /c dircopy.obj,dircopy,,,,dircopy.res
    4.  


    Код не работает, LastError возвращает ERROR_NOACCESS

    Если поправить (увеличить) размер структуры на 2 байта (до кратности 4) -- все работает



    Вопрос: Как не меняя компилятор и размер структуры решить эту проблему?



    ЗЫ: Виндовые инклуды как можно более полные для тасма есть? У мя W32.inc, 176505 байт...
     
  2. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Пока не могу понять :dntknw:

    Может _szSrc содержит глючный адрес?

    Попробуй определить пустую переменную типа WORD после структуры.
     
  3. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Tim Sobolev

    Хранить такую большую структуру в стеке - роскошь. Кстати, в инклудах для масм32 эта структура также не выровнена. Вместо пустой переменной можно просто добавить в самом начале (после пролога) push <любой 16-битный регистр>.
     
  4. Tim Sobolev

    Tim Sobolev New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2005
    Сообщения:
    53
    Vasil

    С адресами все в порядке, я на эксперименты с эти местом убил 2 часа, пока не выровнял структуру...

    Почему вставить ПОСЛЕ? Насколько я понял, залазит куда попало конец структуры, а не начало, тем более мне нужна нормальная адресация.

    А если вставить пустую переменную типа WORD ДО структуры, то ее выравнивает по 4:



    было до:
    Код (Text):
    1.  
    2. push        0004020AF ;'*.*'
    3. push        d,[ebp][-00000142]
    4. call        lstrcpy ;KERNEL32 --5
    5. lea         ebx,[ebp][-0000013E]
    6. push        ebx
    7. push        d,[ebp][08]
    8. call        FindFirstFileA ;KERNEL32 --6
    9.  




    стало после:
    Код (Text):
    1.  
    2. push        0004020AF ;'*.*'
    3. push        d,[ebp][-00000146]
    4. call        lstrcpy ;KERNEL32 --5
    5. lea         ebx,[ebp][-00000142]
    6. push        ebx
    7. push        d,[ebp][08]
    8. call        FindFirstFileA ;KERNEL32 --6
    9.  


    Quantum

    Функция рекурсивна, я конечно пробовал выделять и освобождать память из хипа, но так мне показалось проще...

    Совет с PUSH 2x_байтовый_регистр помог.



    Но можно ли все-таки решить проблему как-то более очевидно?
     
  5. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Tim Sobolev



    То, что в инклудах структура не выровнена - логический баг. Большинство стандартных API-шных структур выровнены на границу 4. Более очевидным решением может быть переопределение этой структуры локально (в своём исходнике) с новым именем:
    Код (Text):
    1. WIN32_FIND_DATA[b]2[/b]     STRUC
    2. fd_dwFileAttributes DWORD     ?     ;file attributes
    3. fd_ftCreationTime   DWORD     ?, ?      ;time of file creation
    4. fd_ftLastAccessTime DWORD     ?, ?      ;time of last file access
    5. fd_ftLastWriteTime  DWORD     ?, ?      ;time of last write access
    6. fd_nFileSizeHigh    DWORD     ?     ;high-order word of file size
    7. fd_nFileSizeLow     DWORD     ?     ;low-order word of file size
    8. fd_dwReserved0      DWORD     ?     ;(reserved)
    9. fd_dwReserved1      DWORD     ?     ;(reserved)
    10. fd_cFileName        CHAR      MAX_PATH dup(?) ;matching file name
    11. fd_cAlternateFileName   CHAR      14 dup(?) ;8.3 alias name
    12. [b]align_                  WORD ?[/b]
    13. WIN32_FIND_DATA     ends






    Ой, это ещё хуже :dntknw: Предположим, что у нас в стеке в запасе около 8-10Кб. Размер вашего стекового фрейма с этой структурой = 332 б. Получается, что стека в данной ситуации хватит на 24 - 30 рекурсивных итераций. А что будет, если структура каталогов имеет большую степень вложенности? Хип, конечно, тоже не панацея, но его, по крайней мере, хватает на пару-другую Мб.
     
  6. Tim Sobolev

    Tim Sobolev New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2005
    Сообщения:
    53
    Quantum

    Вообще-то меня не так интересует конкретная реализация этой функции (см. 1й пост, все исправилось редактированием структуры), а именно возможность в данном компиляторе (линкере?) задать выравнивание размера локальных переменных...
     
  7. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    В тасме существует директива препроцессора ALIGN, но в данном случае она не поможет. Линкер к локальным переменным не имеет ни малейшего отношения.
     
  8. Tim Sobolev

    Tim Sobolev New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2005
    Сообщения:
    53
    понятно, спасибо!

    вот где-бы еще на всяк случай инклуды найти поновее к тасму...