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



         

Таймеры в консольном приложении - часть 4


; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' BUF DB 100 dup (0) LENS DWORD ? ; количество выведенных символов NUM DWORD ? CNT DWORD ? HANDL DWORD ? _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить HANDLE вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV HANDL,EAX ; получить количество параметров CALL NUMPAR MOV NUM,EAX MOV CNT,0 ;------------------------------------- ; вывести параметры командной строки LL1: MOV EDI,CNT CMP NUM,EDI JE LL2 ; номер параметра INC EDI MOV CNT, EDI ; получить параметр номером EDI LEA EBX,BUF CALL GETPAR ; получить длину параметра PUSH OFFSET BUF CALL LENSTR ; в конце - перевод строки MOV BYTE PTR [BUF+EBX],13 MOV BYTE PTR [BUF+EBX+1],10 MOV BYTE PTR [BUF+EBX+2],0 ADD EBX,2 ; вывод строки PUSH 0 PUSH OFFSET LENS PUSH EBX PUSH OFFSET BUF PUSH HANDL CALL WriteConsoleA@20 JMP LL1 LL2: PUSH 0 CALL ExitProcess@4

; строка - [EBP+08H] ; длина в EBX LENSTR PROC PUSH EBP MOV EBP,ESP PUSH EAX ;-------------------- CLD MOV EDI, DWORD PTR [EBP+08H] 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 _TEXT ENDS END START

Рисунок 2.2.6. Пример работы с параметрами командной строки.

Рекомендую читателю разобраться в алгоритме работы процедур NUMPAR и GETPAR.

Следует отметить, что для трансляции программы на Рисунок 2.2.6 в TASM, кроме обычных, уже известных Вам изменений, для совпадающих меток следует в начале имени поставить "@@" - признак локальности, а в начале программы поставить директиву LOCALS. Транслятор MASM метки, стоящие в процедуре, считает локальными автоматически. Подробнее о локальных метках будет сказано в Главах 2.5 и 2.6.




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