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



         

Вывод на консоль содержимого текстового фаша Второй способ - часть 2


; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' HANDL DWORD ? ; дескриптор консоли HFILE DWORD ? ; дескриптор файла BUF DB 100 DUP (0) ; буфер для параметров BUFER DB 1000 DUP (0) ; буфер для файла NAMEOUT DB "CONOUT$" INDS DD 0 ; номер символа в строке INDB DD 0 ; номер символа в буфере NUMB DD ? NUMC DD ? PRIZN DD 0 STROKA DB 300 DUP (0) _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить HANDLE вывода (консоли) как файла PUSH 0 PUSH 0 PUSH OPEN_EXISTING PUSH 0 PUSH 0 PUSH GEN PUSH OFFSET NAMEOUT CALL CreateFileA@28 MOV HANDL,EAX ; получить количество параметров CALL NUMPAR CMP EAX, 1 JE NO_PAR ;--------------------------------------------------- ; получить параметр номером EDI MOV EDI,2 LEA EBX,BUF CALL GET PAR ; открыть файл PUSH 0 PUSH 0 PUSH OPEN_EXISTING PUSH 0 PUSH 0 PUSH GEN PUSH OFFSET BUF CALL CreateFileA@28 CMP EAX,-1 JE NO_PAR MOV HFILE, EAX ;++++++++++++++++++++++++++++ L00: ; читать 1000 байт PUSH 0 PUSH OFFSET NUMB PUSH 1000 PUSH OFFSET BUFER PUSH HFILE CALL ReadFile@20 MOV INDB, 0 ; проверим, есть ли в буфере байты CMP NUMB, 0 JZ _CLOSE ; заполняем строку L001: MOV EDI,INDS MOV ESI,INDB MOV AL,BYTE PTR BUFER[ESI] CMP AL,13 ; проверка на конец строки JE _ENDSTR MOV BYTE PTR STROKA[EDI],AL INC ESI INC EDI MOV INDS,EDI MOV INDB,ESI CMP NUMB, ESI ; проверка на конец буфера JNBE L001 ; закончился буфер MOV INDS,EDI MOV INDB,ESI JMP L00 _ENDSTR: ; делаем что-то со строкой CALL OUTST ; обнулить строку MOV INDS,0 ; перейти к следующей строке в буфере ADD INDB,2 ; не закончился ли буфер? MOV ESI,INDB CMP NUMB, ESI JAE L001 JMP L00 ;++++++++++++++++++++++++++++++ _CLOSE: ; проверим, не пустая ли строка CMP INDS,0 JZ CONT ; делаем что-то со строкой CALL OUTST CONT: ; закрыть файлы PUSH HFILE CALL CloseHandle@4 ; конец работы программы NO_PAR: PUSH 0 CALL ExitProcess@4

; область процедур ; процедура определения количества параметров в строке ; определить количество параметров (->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




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