Ассемблер для Windows



         

Поиск файлов - часть 2


; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' BUF DB 0 DB 100 dup(0) LENS DWORD ? ; количество выведенных символов HANDL DWORD ? HANDL1 DWORD ? MASKA DB "*.*",0 АР DB "\",0 FIN _FIND <0> TEXT DB "Для продолжения нажмите клавишу ENTER",13,10,0 BUFIN DB 10 DUP(0) FINDH DWORD ? NUM DB 0 NUMF DWORD 0 ; счетчик файлов NUMD DWORD 0 ; счетчик каталогов FORM DB "Число найденных файлов: %lu",0 FORM1 DB "Число найденных каталогов: %lu",0 BUFER DB 100 DUP (?) DIR DB "<DIR>",0 PAR DB 0 ; количество параметров _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить HANDLE вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV HANDL,EAX ; получить HANDL1 ввода PUSH STD_INPUT_HANDLE CALL GetStdHandle@4 MOV HANDL1,EAX ; преобразовать строки для вывода PUSH OFFSET TEXT PUSH OFFSET TEXT CALL CharToOemA@8 PUSH OFFSET FORM PUSH OFFSET FORM CALL CharToOemA@8 PUSH OFFSET FORM1 PUSH OFFSET FORM1 CALL CharToOemA@8 ; получить количество параметров CALL NUMPAR MOV PAR,EAX ; если параметр один, то искать в текущем каталоге CMP EAX, 1 JE NO_PAR ;------------------------------------------------- ; получить параметр номером EDI MOV EDI, 2 LEA EBX,BUF CALL GETPAR PUSH OFFSET BUF CALL LENSTR ; если в конце нет "\" - добавим CMP BYTE PTR [BUF+EBX-1],"\" JE NO_PAR PUSH OFFSET AP PUSH OFFSET BUF CALL lstrcatA@8 ; нет ли еще параметра, где задана маска поиска CMP PAR,3 JB NO_PAR ; получить параметр - маску поиска MOV EDI,3 LEA EBX,MASKA CALL GETPAR NO_PAR: ;------------------------------------------------- CALL FIND ; вывести количество файлов PUSH NUMF PUSH OFFSET FORM PUSH OFFSET BUFER CALL wsprintfA LEA EAX, BUFER MOV EDX,1 CALL WRITE ; вывести количество каталогов PUSH NUMD PUSH OFFSET FORM1 PUSH OFFSET BUFER CALL wsprintfA LEA EAX, BUFER MOV EDX, 1 CALL WRITE _END: PUSH 0 CALL ExitProcess@4 ;************************ ; область процедур ;************************ ; вывести строку (в конце перевод строки) ; EAX - на начало строки ; EDX - с переводом строки или без WRITE PROC ; получить длину параметра PUSH EAX CALL LENSTR MOV ESI,EAX CMP EDX,1 JNE NO_ENT ; в конце - перевод строки MOV BYTE PTR [EBX+ESI],13 MOV BYTE PTR [EBX+ESI+1],10 MOV BYTE PTR [EBX+ESI+2],0 ADD EBX,2 NO_ENT: ; вывод строки PUSH 0 PUSH OFFSET LENS PUSH EBX PUSH EAX PUSH HANDL CALL WriteConsoleA@20 RET WRITE ENDP




Содержание  Назад  Вперед