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



         

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


; процедура определения длины строки ; строка - [EBP+08Н] ; длина в EBX LENSTR PROC PUSH EBP MOV EBP,ESP PUSH EAX ;---------------------- CLD MOV EDI, DWORD PTR [EBP+08Н] MOV EBX, EDI MOV ECX,100 ; ограничить длину строки XOR AL,AL REPNE SCASB ; найти символ 0 SUB EDI, EBX ;-длина строки, включая 0 MOV EBX, EDI DEC EBX ;---------------------- POP EAX POP EBP RET 4 LENSTR ENDP

; процедура определения количества параметров в строке ; определить количество параметров (->EAX) NUMPAR PROC CALL 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 ; номер параметра MOV EDX, 0 JMP L2 L3: OR EDX,1 L2: INC ESI JMP L1 L4: MOV EAX,ECX RET NUMPAR ENDP

; получить параметр из командной строки ; EBX - указывает на буфер, куда будет помещен параметр ; в буфер помещается строка с нулем на конце ; EDI - номер параметра GETPAR PROC CALL 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 ; номер параметра MOV EDX,0 JMP L2 L3: OR EDX,1 L2: CMP ECX,EDI JNE L5 MOV AL,BYTE PTR [ESI] MOV BYTE PTR [EBX],AL INC EBX L5: INC ESI JMP L1 L4: MOV BYTE PTR [EBX], 0 RET GETPAR ENDP

; поиск в каталоге файлов и их вывод ; имя каталога в BUF FIND PROC ; путь с маской PUSH OFFSET MASKA PUSH OFFSET BUF CALL lstrcatA@8 ; здесь начало поиска PUSH OFFSET FIN PUSH OFFSET BUF CALL FindFirstFileA@8 CMP EAX,-1 JE _ERR ; сохранить дескриптор поиска MOV FINDH,EAX LF: ; исключить "файлы" "." и ".." CMP BYTE PTR FIN.NAM,"." JE _NO ; не каталог ли? TEST BYTE PTR FIN.ATR,10H JE NO_DIR PUSH OFFSET DIR PUSH OFFSET FIN.NAM CALL lstrcatA@8 INC NUMD DEC NUMF NO_DIR: ; преобразовать строку PUSH OFFSET FIN.NAM PUSH OFFSET FIN.NAM CALL CharToOemA@8 ; здесь вывод результата LEA EAX, FIN.NAM MOV EDX,1 CALL WRITE ; увеличить счетчики INC NUMF INC NUM ; конец страницы? CMP NUM, 22 JNE _NO MOV NUM, 0 ; ждать ввод строки MOV EDX,0 LEA EAX, TEXT CALL WRITE PUSH 0 PUSH OFFSET LENS PUSH 10 PUSH OFFSET BUFIN PUSH HANDL1 CALL ReadConsoleA@20 _NO: ; продолжение поиска PUSH OFFSET FIN PUSH FINDH CALL FindNextFileA@8 CMP EAX,0 JNE LF ; закрыть поиск PUSH FINDH CALL FindClose@4 _ERR: RET FIND ENDP _TEXT ENDS END START




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