Есть такой код: Код (Text): DirCopy proc _szSrc:LPSTR, _szDst:LPSTR local wFind : WIN32_FIND_DATA local hFind : HANDLE ; lea ebx,offset wFind call FindFirstFileA, _szSrc, ebx .if eax != -1 mov hFind,eax ; есть определение WIN32_FIND_DATA Код (Text): WIN32_FIND_DATA STRUC fd_dwFileAttributes DWORD ? ;file attributes fd_ftCreationTime DWORD ?, ? ;time of file creation fd_ftLastAccessTime DWORD ?, ? ;time of last file access fd_ftLastWriteTime DWORD ?, ? ;time of last write access fd_nFileSizeHigh DWORD ? ;high-order word of file size fd_nFileSizeLow DWORD ? ;low-order word of file size fd_dwReserved0 DWORD ? ;(reserved) fd_dwReserved1 DWORD ? ;(reserved) fd_cFileName CHAR MAX_PATH dup(?) ;matching file name fd_cAlternateFileName CHAR 14 dup(?) ;8.3 alias name WIN32_FIND_DATA ends Компилится все это TASM32 5.3 и TLINK32 1.6.71.0 Код (Text): tasm32 /ml /m4 dircopy.asm tlink32 /aa /Tpe /x /V4.0 /c dircopy.obj,dircopy,,,,dircopy.res Код не работает, LastError возвращает ERROR_NOACCESS Если поправить (увеличить) размер структуры на 2 байта (до кратности 4) -- все работает Вопрос: Как не меняя компилятор и размер структуры решить эту проблему? ЗЫ: Виндовые инклуды как можно более полные для тасма есть? У мя W32.inc, 176505 байт...
Пока не могу понять Может _szSrc содержит глючный адрес? Попробуй определить пустую переменную типа WORD после структуры.
Tim Sobolev Хранить такую большую структуру в стеке - роскошь. Кстати, в инклудах для масм32 эта структура также не выровнена. Вместо пустой переменной можно просто добавить в самом начале (после пролога) push <любой 16-битный регистр>.
Vasil С адресами все в порядке, я на эксперименты с эти местом убил 2 часа, пока не выровнял структуру... Почему вставить ПОСЛЕ? Насколько я понял, залазит куда попало конец структуры, а не начало, тем более мне нужна нормальная адресация. А если вставить пустую переменную типа WORD ДО структуры, то ее выравнивает по 4: было до: Код (Text): push 0004020AF ;'*.*' push d,[ebp][-00000142] call lstrcpy ;KERNEL32 --5 lea ebx,[ebp][-0000013E] push ebx push d,[ebp][08] call FindFirstFileA ;KERNEL32 --6 стало после: Код (Text): push 0004020AF ;'*.*' push d,[ebp][-00000146] call lstrcpy ;KERNEL32 --5 lea ebx,[ebp][-00000142] push ebx push d,[ebp][08] call FindFirstFileA ;KERNEL32 --6 Quantum Функция рекурсивна, я конечно пробовал выделять и освобождать память из хипа, но так мне показалось проще... Совет с PUSH 2x_байтовый_регистр помог. Но можно ли все-таки решить проблему как-то более очевидно?
Tim Sobolev То, что в инклудах структура не выровнена - логический баг. Большинство стандартных API-шных структур выровнены на границу 4. Более очевидным решением может быть переопределение этой структуры локально (в своём исходнике) с новым именем: Код (Text): WIN32_FIND_DATA[b]2[/b] STRUC fd_dwFileAttributes DWORD ? ;file attributes fd_ftCreationTime DWORD ?, ? ;time of file creation fd_ftLastAccessTime DWORD ?, ? ;time of last file access fd_ftLastWriteTime DWORD ?, ? ;time of last write access fd_nFileSizeHigh DWORD ? ;high-order word of file size fd_nFileSizeLow DWORD ? ;low-order word of file size fd_dwReserved0 DWORD ? ;(reserved) fd_dwReserved1 DWORD ? ;(reserved) fd_cFileName CHAR MAX_PATH dup(?) ;matching file name fd_cAlternateFileName CHAR 14 dup(?) ;8.3 alias name [b]align_ WORD ?[/b] WIN32_FIND_DATA ends Ой, это ещё хуже Предположим, что у нас в стеке в запасе около 8-10Кб. Размер вашего стекового фрейма с этой структурой = 332 б. Получается, что стека в данной ситуации хватит на 24 - 30 рекурсивных итераций. А что будет, если структура каталогов имеет большую степень вложенности? Хип, конечно, тоже не панацея, но его, по крайней мере, хватает на пару-другую Мб.
Quantum Вообще-то меня не так интересует конкретная реализация этой функции (см. 1й пост, все исправилось редактированием структуры), а именно возможность в данном компиляторе (линкере?) задать выравнивание размера локальных переменных...
В тасме существует директива препроцессора ALIGN, но в данном случае она не поможет. Линкер к локальным переменным не имеет ни малейшего отношения.