Анализировал код Ct757 реализации поиска файлов на ассемблере под Windows с помощью API-функций FindFirstFile + FindNextFile. референс: http://www.wasm.ru/forum/viewtopic.php?pid=331853 Отрывки кода: 1 .data ; Секция данных 2 3 buf db 500h dup(?) ; Буффер для имени директории 4 fake1 db '.’,0 ; Директории, которые 5 fake2 db ‘..’,0 ; НЕ надо сканировать 6 7.code ; Секция кода 8 9 find_files proc ; Рекурсивная процедура Поиска файлов 10 11 push ebp ; Выделим место в стеке 12 mov ebp,esp ; под хэндл поиска 13 sub esp,144h ; и структуру WIN32_FIND_DATA 14 15 lea eax,[ebp-144h] ; Вычисляем указатель на find_data 16 invoke FindFirstFile,offset buf,eax ; Ищем файлы 17 inc eax ; Если ничего 18 je exit ; не нашли - выходим 19 dec eax ; Иначе, сохраним 20 mov dword ptr [ebp-6h],eax ; хэндл поиска 21 22 find_next: 23 mov eax,dword ptr [ebp-144h] ; Проверяем, нашли 24 and eax,FILE_ATTRIBUTE_DIRECTORY ; директорию? 25 je found ; Если нет - прыгаем на found 26 27 lea eax,[ebp-118h] ; Вычислим указатель на cFileName 28 invoke lstrcmp,offset fake1,eax ; это "."? 29 test eax,eax ; Если да, 30 je next ; ищем дальше ............... Вопрос: Как вычисляются значения 144h, 6h, 118h ... в строках 13,15,20,27..... Буду благодарен за ссылку или объяснение.
Mike_Ch Это локали, sizeof(WIN32_FIND_DATA) + sizeof(HANDLE) = 0x144. 13: Local fData:WIN32_FIND_DATA, Handle:HANDLE 15: Lea eax,fData 20: mov Handle,eax 27: lea eax,fData.cFileName Этим должен компилятор заниматься, а не вручную смещения вычислять. Просто там автор либо не знает масм, либо отбил этот код из бинаря.
не, масм он знает, у него статей на форуме прилично, а зачем он привёл части компилированного кода - не знаю. я откомпилировал похожий асм код - он дал похожие смещения для WIN32_FIND_DATA и .cFileName. спасибо за разъяснение.