как вычислить адрес указателя на команду/структуру ассемблера?

Тема в разделе "WASM.BEGINNERS", создана пользователем Mike_Ch, 11 июл 2011.

  1. Mike_Ch

    Mike_Ch Mikhail Chebotarev

    Публикаций:
    0
    Регистрация:
    11 июл 2011
    Сообщения:
    2
    Адрес:
    Toronto, Canada
    Анализировал код 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.....
    Буду благодарен за ссылку или объяснение.
     
  2. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    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

    Этим должен компилятор заниматься, а не вручную смещения вычислять. Просто там автор либо не знает масм, либо отбил этот код из бинаря.
     
  3. Mike_Ch

    Mike_Ch Mikhail Chebotarev

    Публикаций:
    0
    Регистрация:
    11 июл 2011
    Сообщения:
    2
    Адрес:
    Toronto, Canada
    не, масм он знает, у него статей на форуме прилично, а зачем он привёл части компилированного кода - не знаю. я откомпилировал похожий асм код - он дал похожие смещения для WIN32_FIND_DATA и .cFileName. спасибо за разъяснение.