Поиск файлов

Тема в разделе "WASM.BEGINNERS", создана пользователем Eretic, 25 окт 2009.

  1. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Приветствую всех кто зашёл в темку! Вопрос по поиску. Есть 2 файла (прикрепляю). Первый (find1.txt) с поиском файла скачанный отсюда с форума. В нём мне (как новичку) не понравилось выделение памяти в стеке. Очень непривычно видеть обращение к WIN32_FIND_DATA как
    Код (Text):
    1. lea     eax,[ebp-144h]
    . Переделка с переменными падает после нахождения первого экзешника.
    Оля вообще падает на строке
    Код (Text):
    1. je   found
    до нахождения экзе(в моей поделке)

    1)объясните пожалуйста в чём ошибка у меня.
    2)в чём фишка пергого исходника?Почему выделяется в стеке место?Разница работы с переменными или стеком в данной задаче.

    Заранее огромное спасибо!
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    find_files - это рекурсивная процедура (сама себя вызывает), поэтому без выделения WIN32_FIND_DATA в стеке не обойтись. А [ebp-144h] - стандартное обращение к локальным переменным. Почему это вызывает сомнения?
     
  3. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    1) можете подробнее объяснить почему не обойтись? Пример: функция поиска файлов у Bill / TPOC : http://www.wasm.ru/article.php?article=green2red02
    Но в ней почемуто не проверяются папки. Не разбирался ещё.
    2) стандартное обращение? после Калашникова и после Iczelion'а я сомневаюсь. Ну не видел я там такого! Почему немогу стандарт этот изменить и поставить [ebp-150h] например? Из тогоже примера хэндл поиска записывается в [ebp-6h].Почему именно туда?

    Пожалуйста объясните. Или ткните носом где могу научиться. Заранее очень благодарен!
     
  4. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    сорри забыл добавить:
    [ebp-118h]-cFileName из структуры WIN32_FIND_DATA. Это как вычислили? Вручную высчитано что именно там находится?
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    В той самой статье (от зелёного к красному...) функция FindEXE устроена точно так как и эта функция (где [ebp-114h]). Там есть и локальные переменные, указанные через директиву LOCAL. И проверка на папку:
    Код (Text):
    1. .IF (ebx==FILE_ATTRIBUTE_DIRECTORY) && (byte ptr [ecx]!='.')
    И рекурсия там есть. Всё как надо. А код который [ebp-114h] - это просто кто-то разработал кому нравится "чистый" ассемблер: без LOCAL. Если посмотреть в отладчике, то LOCAL превратится в
    Код (Text):
    1. sub esp,<local size>
    2. mov ebp, esp
    а обращение к переменной - превратится в [ebp-<то, что вычислено ассемблером>].

    то есть, ваша мысль верна - всё вычислено вручную.
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Исправление (код для LOCAL будет обратным):
    Код (Text):
    1. mov ebp, esp
    2. sub esp,<local size>
     
  7. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    AsmGuru62
    Спасибо! Теорию усвоил.
    А вот практики нехватает. Непойму какая ошибка в моём варианте.