Есть такой кусок кода: proc dirlst uses eax ebx ecx edx edi esi, ptDirWORD local FindFileData:WIN32_FIND_DATA invoke FindFirstFile, [ptDir], dword [FindFileData] По идее правильно, ведь FindFileData указатель на указатель на структуру, тогда [FindFileData] и есть указатель на структуру, который я собственно и передаю в функцию. Прога собирается только так вроде (invoke FindFirstFile, [ptDir], dword [FindFileData]). Но выскакивает эксепшн в связи с тем, что FindFirstFile пытается писать по нулевому адресу. Как я понял, берёт он его из первых 4 байт от WIN32_FIND_DATA. Так как же правильно? Уже полдня с этим мучаюсь. Зараннее спасибо.
по моему правильно будет так: Код (Text): lea eax, [FindFileData] invoke FindFirstFile, [ptDir], eax Так как: Код (Text): local FindFileData:WIN32_FIND_DATA выделяет в стеке данную структуру, и обращение к [FindFileData] производит к обращению непосредственно к содержимому этой структуры.
Действительно, работает, но теперь со структурой возникла другая проблема. Код (Text): lea eax, [FindFileData] mov [ffd], eax invoke FindFirstFile, [ptDir], [ffd] ... invoke lstrcmp, dword [ffd + WIN32_FIND_DATA.cFileName], "." dword [ffd + WIN32_FIND_DATA.cFileName] выдаёт адрес FFFFFFFF. dword [ffd.cFileName] также не работает Получилось так: Код (Text): mov eax, [ffd] add eax, WIN32_FIND_DATA.cFileName invoke lstrcmp, eax, "." А проще можно как-нибудь?
есчо раз повторяю - адреса локальных переменных (или их смещение) загружается с помощью инструкции lea. А вы опять заталкиваете в стек не адрес поля ffd, а значение содержащиеся в стеке (т. к. структура была выделена в стеке, и единственный способ получить адрес смещения - это инструкция вычисления эффективного адреса, т. е. lea). Юзайте так: Код (Text): lea eax, [ffd.cFileName] invoke lstrcmp, eax, "." или так: Код (Text): lea eax, [ffd + WIN32_FIND_DATA.cFileName] invoke lstrcmp, eax, "." и покурите насчет инструкции lea.
Большое спасибо за потраченное время. С lea и локальными переменными более-менее разобрался, но дело в том, что lea eax, [ffd + WIN32_FIND_DATA.cFileName] заносит в eax неправильный адрес, это видно даже в отладчике!
zukalo Всё он правильно заносит. ffd - адрес, по которому хранится адрес структуры. ffd + WIN32_FIND_DATA.cFileName - адрес, по которому хранятся данные, смещённые относительно ffd (по сути неизвестно, что). [ffd + WIN32_FIND_DATA.cFileName] - сами эти данные (неизвестно, что). [ffd]+ WIN32_FIND_DATA.cFileName - указатель на поле структуры cFileName. А вот теперь думайте, как это оформить в виде кода. А ещё лучше думайте до того, как запостить вопрос. P.S. Arthur В посте 4 Вы не правы. Ваш хрустальный шар Вам не показал всю картину о том, что есть ffd.
Arthur Вообще-то я уже указал в предыдущем посте, что есть ffd. Содержит не структуру WIN32_FIND_DATA, а указатель на неё. Соответственно ffd в фасме - указатель на указатель на структуру. И отсюда вполне очевидно, что ни один из предложенных Вами вариантов: ни lea eax, [ffd + WIN32_FIND_DATA.cFileName], ни lea eax, [ffd.cFileName] неверен. Зачем автору взбрело в голову выделять отдельную переменную под адрес структуры, не знаю, но это следует из его кода: lea eax, [FindFileData] mov [ffd], eax P.S. Ах да... чуть не забыл. Собственно ответ на вопрос Везде. (в четвёртом посте)
l_inc ага, невнимательность Действительно, ffd это судя по всему - дворд (а я посчитал, что автор просто сократил название переменной FindFileData, и не заметил шаманства с этой переменной) Поэтому вот верное решение: Код (Text): lea eax, [FindFileData.cFileName] invoke lstrcmp, eax, "." Или так: Код (Text): lea eax, [FindFileData + WIN32_FIND_DATA.cFileName] invoke lstrcmp, eax, "."
очень громоздко. если это попытка отбросить "имя" текущей директории - тогда можно сделать проще: Код (Text): cmp word [FindFileData + WIN32_FIND_DATA.cFileName],"."
Необходимо использовать подключаемый файл win32wx.inc или win32ax.inc Код (Text): proc dirlst uses eax ebx ecx edx edi esi, ptDir:DWORD locals FindFileData WIN32_FIND_DATA ? endl invoke FindFirstFile, [ptDir], addr FindFileData