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



         

Рассмотрим несколько простых консольных функций - часть 3


COL1 = 2h+8h ; цвет выводимого текста COL2 = 1h+2h+8h ; цвет выводимого текста 2

; прототипы внешних процедур EXTERN GetStdHandle@4:NEAR EXTERN WriteConsoleA@20:NEAR EXTERN SetConsoleCursorPosition@8:NEAR EXTERN SetConsoleTitleA@4:NEAR EXTERN FreeConsole@0:NEAR EXTERN AllocConsole@0:NEAR EXTERN CharToOemA@8:NEAR EXTERN SetConsoleCursorPosition@8:NEAR EXTERN SetConsoleTextAttribute@8:NEAR EXTERN ReadConsoleA@20:NEAR EXTERN SetConsoleScreenBufferSize@8:NEAR EXTERN ExitProcess@4:NEAR

; директивы компоновщику для подключения библиотек includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib

;------------------------------------------------------------ COOR STRUC X WORD ? Y WORD ? COOR ENDS

; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' HANDL DWORD ? HANDL1 DWORD ? STR1 DB "Введите строку: ",13,10,0 STR2 DB "Простой пример работы консоли",0 BUF DB 200 dup (?) LENS DWORD ? ; количество выведенных символов CRD COOR <?> _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; перекодируем строку PUSH OFFSET STR1 PUSH OFFSET STR1 CALL CharToOemA@8 ; образовать консоль ; вначале освободить уже существующую CALL FreeConsole@0 CALL AllocConsole@0 ; получить HANDL1 ввода PUSH STD_INPUT_HANDLE CALL GetStdHandle@4 MOV HANDL1, EAX ; получить HANDL вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV HANDL, EAX ; установить новый размер окна консоли MOV CRD.X, 100 MOV CRD.Y, 25 PUSH CRD PUSH EAX CALL SetConsoleScreenBufferSize@8 ; задать заголовок окна консоли PUSH OFFSET STR2 CALL SetConsoleTitleA@4 ; установить позицию курсора MOV CRD.X,0 MOV CRD.Y,10 PUSH CRD PUSH HANDL CALL SetConsoleCursorPosition@8 ; задать цветовые атрибуты выводимого текста PUSH COL1 PUSH HANDL CALL SetConsoleTextAttribute@8 ; вывести строку PUSH OFFSET STR1 CALL LENSTR ; в EBX длина строки PUSH 0 PUSH OFFSET LENS PUSH EBX PUSH OFFSET STR1 PUSH HANDL CALL WriteConsoleA@20 ; ждать ввод строки PUSH 0 PUSH OFFSET LENS PUSH 200 PUSH OFFSET BUF PUSH HANDL1 CALL ReadConsoleA@20 ; вывести полученную строку ; вначале задать цветовые атрибуты выводимого текста PUSH COL2 PUSH HANDL CALL SetConsoleTextAttribute@8 ;------------------------------------------------------------ PUSH 0 PUSH OFFSET LENS PUSH [LENS] ; длина вводимой строки PUSH OFFSET BUF PUSH HANDL CALL WriteConsoleA@20 ; небольшая задержка MOV ECX,01FFFFFFFH L1: LOOP L1 ; закрыть консоль CALL FreeConsole@0 CALL ExitProcess@4




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