Русский / Russian English / Английский

Сейчас на форуме: (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› Работа с локальной структурой в masm
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Статус: Участник

Создано: 29 апреля 2017 06:10 New!
Цитата · Личное сообщение · #1

Всем привет. Скажите пожалуйста, как правильно работать со структурой? Пытался реализовать рекурсивный поиск файлов. В итоге, при попытке сравнить имя файла с ".." и "." получаю ошибку. Пытался разными способами уже, но он выдает мне ошибку типа invalid operand, missing operator in expression
Code:
  1. FindFile proc OldPath:DWORD
  2.     LOCAL NewPath:DWORD
  3.     LOCAL WFD:WIN32_FIND_DATA
  4.     LOCAL fhandle:DWORD
  5.     LOCAL TempPath:DWORD
  6.  
  7.     invoke GlobalAlloc, GHND, 256
  8.     mov TempPath, eax
  9.     invoke GlobalAlloc, GHND, 256
  10.     mov NewPath, eax
  11.  
  12.     again:
  13.     
  14.     mov edi, NewPath
  15.     mov esi, OldPath
  16.     xor eax, eax
  17.     @1:
  18.         cmp al, [esi] ;проверяю нулевой байт конца строки
  19.         je @2         ;встретив нулевой байт выхожу из цикла копирования
  20.         movsb
  21.         jmp @1
  22.     @2:
  23.         invoke FindFirstFileA, OldPath, addr WFD
  24.         mov fhandle, eax
  25.         @next:
  26.             invoke FindNextFileA, fhandle, addr WFD
  27.             .IF eax==ERROR_NO_MORE_FILES ; если нет больше файлов - выхожу из функции
  28.                 invoke GlobalFree, NewPath
  29.                 invoke GlobalFree, TempPath
  30.                 ret
  31.             .ENDIF
  32.  
  33.             mov ax, '.'0
  34.             lea edx, WFD
  35.             mov word ptr bx, [edx+28]
  36.             cmp ax,bx
  37.             je @next ; если имя файла == "." - перехожу к следующему
  38.             mov ax, '..'
  39.             cmp word ptr ax, WFD.cFileName
  40.             je @next ; если имя файла == ".." - перехожу к следующему
  41.                
  42.             .IF WFD.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY
  43.                 invoke lstrcpy, TempPath, NewPath
  44.                 invoke PathAppend, TempPath, addr WFD.cFileName
  45.                 invoke FindFile, TempPath
  46.             .ELSE
  47.                 invoke lstrcpy, TempPath, addr NewPath
  48.                 invoke PathAppend, TempPath, addr WFD.cFileName
  49.                 invoke MessageBoxA, 0, addr WFD.cFileName, addr WFD.cFileName, MB_OK    
  50.                 
  51.             .ENDIF
  52.             jmp again ; т.к. выход из функции происходит только в том случае
  53.                         ; когда закончились все файлы, я тупо возвращаюсь обратно
  54. FindFile endp


Как видно в коде, я пытался разными способами сравнить параметр структуры с регистром, во всех случаях я получал ошибки.



Ранг: 433.8 (мудрец)
Статус: Участник

Создано: 29 апреля 2017 06:30 · Поправил: dosprog New!
Цитата · Личное сообщение · #2

kekker пишет:
cmp word ptr ax, WFD.cFileName


lea esi,WFD
assume esi:PTR WIN32_FIND_DATA
cmp ax, word ptr ax [esi].cFileName




Ранг: 150.3 (ветеран)
Статус: Участник

Создано: 29 апреля 2017 06:38 New!
Цитата · Личное сообщение · #3

kekker пишет:
mov word ptr bx, [edx+28]

а что это за смещение такое?
если обращаешься к cFileName, тогда должно быть
Code:
  1. mov word ptr bx, [edx+0x2C]

и не забывай, как надо записывать шестнадцатеричные числа



Ранг: 1.0 (гость)
Статус: Участник

Создано: 29 апреля 2017 07:22 New!
Цитата · Личное сообщение · #4

Большое спасибо, ребят. Только тут еще надо assume esi: ptr WIN32_FIND_DATA иначе ругается error A2158: type is wrong size for register


 eXeL@B —› Программирование —› Работа с локальной структурой в masm
Эта тема закрыта. Ответы больше не принимаются.

Видеокурс ВЗЛОМ