Вывести имена всех файлов из текущего каталога - Assembler
Формулировка задачи:
При нажатии на левую кнопку мыши вывести имена всех файлов из текущего каталога.
Помогите пожалуйста, не могу понять почему не запускается.
.686 .model flat,stdcall option casemap :none include \masm32\include\windows.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib ;объявление используемых функций Windows (внешние ссылки) extern _imp__wsprintfA:dword extern _imp__CharToOemA@8:dword; extern _imp__GetStdHandle@4:dword; extern _imp__WriteConsoleA@20:dword; extern _imp__ReadConsoleA@20:dword; extern _imp__ExitProcess@4:dword; extern _imp__GetCommandLineA@0:dword; extern _imp__lstrcat@8:dword; extern _imp__lstrcpyA@8:dword; extern _imp__FindFirstFileA@8:dword; extern _imp__FindNextFileA@8:dword; extern _imp__FindClose@4:dword; extern _imp__lstrlenA@4:dword ;--------------------------------------------------------- _FIND STRUC;структура, используемая для поиска файлов при помощи функций FindFirstFileA и FindNextFileA ATR dd ?;атрибут файла CRTIME dd ?;время создания файла dd ? ACTIME dd ?;время доступа к файлу dd ? WRTIME dd ?;время модификации файла dd ? SIZEH dd ?;размер файла SIZEL dd ? dd ?;резерв dd ? NAM db 260 dup(0);длинное имя файла ANAM db 14 dup(0);короткое имя файла _FIND ENDS .code start: push STD_INPUT_HANDLE call _imp__GetStdHandle@4;получаем HANDL1 для ввода mov HANDL1,eax push STD_OUTPUT_HANDLE call _imp__GetStdHandle@4;получаем HANDL для вывода mov HANDL,eax call NUMPAR ;получить количество параметров mov PAR,eax dec eax;если параметр один, то искать в текущем каталоге je NO_PAR mov edx,2;получить параметр номером edi lea ebx,BUF call GETPAR jb NO_PAR mov edi,3;подключить параметр - маску поиска lea ebx,MASKA call GETPAR NO_PAR: push offset BUFER call FIND push NUMF;вывести количество файлов push offset FORM push offset BUFER call _imp__wsprintfA lea eax,BUFER mov edi,1 call WRITE push NUMD;вывести количество каталогов push offset FORM1 push offset BUFER call _imp__wsprintfA lea eax,BUFER mov edi,1 call WRITE _END: push 0 call _imp__ExitProcess@4 ;--------------------------------------------------------------- WRITE PROC;вывести строку с переводом строки push eax push eax call _imp__lstrlenA@4;получить длину параметра pop ebx mov dword ptr [ebx+eax],0D0Ah add eax,2 NO_ENT: push 0;резерв push offset LENS;выведено символов push eax;длина строки push ebx;адрес строки push HANDL;HANDL вывода call _imp__WriteConsoleA@20;вывести строку RET WRITE ENDP ;------------------------------------------------- NUMPAR PROC;определение параметров в командной строке call _imp__GetCommandLineA@0 mov esi,eax xor ecx,ecx mov edx,1 L1: cmp byte ptr [esi],0 je L4 cmp byte ptr [esi],32 je L3 add ecx,edx;номер параметра xor edx,edx jmp L2 L3: or edx,1 L2: inc esi jmp L1 L4: mov eax,ecx ret NUMPAR ENDP ;------------------------------------------------------ GETPAR PROC;в edi указатель на буфер, куда помещен параметр ;в ebx номер параметра call _imp__GetCommandLineA@0 mov esi,eax xor ecx,ecx mov edx,1 L10: cmp byte ptr [esi],0 je L40 cmp byte ptr [esi],32 je L30 add ecx,edx;номер параметра xor edx,edx jmp L20 L30: or edx,1 L20: cmp ecx,edi jne L50 mov al,[esi] mov [ebx],al inc ebx L50: inc esi jmp L10 L40: mov byte ptr [ebx],0 ret GETPAR ENDP FIND PROC;поиск в каталоге файлов и вывод имени каталога в BUF FINDH equ [ebp-4] DIRS equ [ebp-304] DIRSS equ [ebp-604] DIRV equ [ebp-904] DIR equ [ebp+8] enter 904,0 xor eax,eax lea edi,DIRV mov ecx,900/4 rep stosd push DIR call _imp__lstrlenA@4 mov ebx,eax mov edi,DIR cmp byte ptr [edi],0 je _OK cmp byte ptr [edi+ebx-1],'\' je _OK push offset AP push DIR call _imp__lstrcat@8 _OK: push DIR lea eax,DIRSS push eax call _imp__lstrcpyA@8 push offset MASKA;путь с маской push DIR call _imp__lstrcat@8 push offset FIN;здесь начало поиска push DIR call _imp__FindFirstFileA@8 inc eax;cmp eax,-1 je _ERR dec eax mov FINDH,eax;сохранить дескриптор поиска LF: cmp byte ptr FIN.NAM,".";исключить файлы "." и ".." je _FF lea eax,DIRSS push eax lea eax,DIRS push eax call _imp__lstrcpyA@8 push offset FIN.NAM lea eax,DIRS push eax call _imp__lstrcat@8 test byte ptr FIN.ATR,10h;не каталог ли? je NO_DIR push offset DIRN lea eax,DIRS push eax call _imp__lstrcat@8 inc NUMD dec NUMF mov PRIZN,1 lea eax,DIRS push eax call OUTF jmp _NO NO_DIR: lea eax,DIRS push eax call OUTF mov PRIZN,0 _NO: cmp PRIZN,0 jz _F lea eax,DIRSS push eax lea eax,DIRV push eax call _imp__lstrcpyA@8 push offset FIN.NAM lea eax,DIRV push eax call _imp__lstrcat@8 lea eax,DIRV push eax call FIND _F: inc NUMF _FF: push offset FIN push FINDH call _imp__FindNextFileA@8;продолжение поиска test eax,eax;cmp eax,0 jne LF push FINDH call _imp__FindClose@4;закрыть поиск _ERR: leave ret 4 FIND ENDP OUTF proc STRN equ [ebp+8] push ebp mov ebp,esp push STRN push STRN call _imp__CharToOemA@8;преобразовать строку mov eax,STRN mov edi,1 call WRITE;здесь вывод результата inc NUM cmp NUM,22;конец страницы? jne NO mov NUM,0 mov edi,1 lea eax,TEXT call WRITE;ждать вывод строки push 0 push offset LENS push 10 push offset BUFIN push HANDL1 call _imp__ReadConsoleA@20 NO: pop ebp ret 4 OUTF endp ;------------------------------------------ .data BUF db 0 db 100 dup (?) LENS dd 100;количество выведенных символов HANDL dd ? HANDL1 dd ? MASKA db "*.*",0 AP db "\",0 FIN _FIND <0> TEXT db ' ENTER',13,10,0 ; в DOS кодировке 'Для продолжения нажмите клавишу ENTER' BUFIN db 10 dup(0) NUM db 0 NUMF dd 0;счетчик файлов NUMD dd 0;счетчик каталогов FORM db ;'Число найденых файлов: %lu' FORM1 db ;'Число найденых каталогов: %lu' BUFER db 100 dup(0) DIRN db " <DIR>",0 PAR dd 0;количество параметров PRIZN db 0 end start
Решение задачи: «Вывести имена всех файлов из текущего каталога»
textual
Листинг программы
.386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm includelib \masm32\lib\masm32.lib includelib \masm32\lib\msvcrt.lib .data ;.align 8 FF WIN32_FIND_DATA <> hn dd 0 any db '*.*',0 tpt db '%s',0Dh,0Ah,0 lpMsgBuf dd 0; LPVOID <> .code start: invoke FindFirstFile, ADDR any, ADDR FF cmp eax, INVALID_HANDLE_VALUE jnz @F call err @@: mov hn, eax call prn_file next: invoke FindNextFile, hn, ADDR FF or eax,eax jz done call prn_file jmp next done: invoke FindClose, hn gtfo: invoke crt__getch invoke crt_exit prn_file: cmp FF.cFileName,'.' jz @F invoke crt_printf, ADDR tpt, ADDR FF.cFileName @@: ret err: invoke GetLastError invoke FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,\ NULL, eax, NULL, ADDR lpMsgBuf,NULL, NULL jmp gtfo ; ret end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д