КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Методические рекомендации по выполнению лабораторной работы. Для создания консоли используем функцию AllocConsole⇐ ПредыдущаяСтр 12 из 12 Для создания консоли используем функцию AllocConsole. По завершении программы консоль освобождается автоматически или с помощью функций FreeConsole. Следует отметить, что один процесс может иметь только одну консоль, поэтому выполнение в начале программы FreeConsole обязательно. Для чтения из буфера консоли используется функция ReadConsole. Установить позицию курсора в консоли можно при помощи функции SetConsoleCursorPosition. Установить цвет выводимых букв можно с помощью функции SetConsoleTextAttribute. Для определения заголовка окна консоли используется функция SetConsoleTitle. Функция CharToOem используется для перевода DOS-кодировки в Windows-кодировку. Большинство консольных функций при правильном их завершении возвращает ненулевое значение. В случае ошибки в EAX помещается ноль. Пример создания собственной консоли ; cons1.asm .386P .MODEL FLAT, stdcall ; константы STD_OUTPUT_HANDLE equ -11 STD_INPUT_HANDLE equ -10 ; атрибуты цветов FOREGROUND_BLUE equ 1h ; синий цвет букв FOREGROUND_GREEN equ 2h ; зеленый цвет букв FOREGROUND_RED equ 4h ; красный цвет букв FOREGROUND_INTENSITY equ 8h ; повышенная интенсивность BACKGROUND_BLUE equ 10h ; синий цвет фона BACKGROUND_GREEN equ 20h ; зеленый цвет фона BACKGROUND_RED equ 40h ; красный цвет фона BACKGROUND_INTENSITY equ 80h ; повышенная интенсивность COL1 = 2h + 8h ; цвет выводимого текста COL2 = 1h + 2h + 8h ; цвет выводимого текста 2 ; прототипы внешних процедур EXTERN GetStdHandle: NEAR EXTERN WriteConsoleA: NEAR EXTERN SetConsoleCursorPosition: NEAR EXTERN SetConsoleTitleA: NEAR EXTERN FreeConsole: NEAR EXTERN AllocConsole: NEAR EXTERN CharToOemA: NEAR EXTERN SetConsoleCursorPosition: NEAR EXTERN SetConsoleTextAttribute: NEAR EXTERN ReadConsoleA: NEAR EXTERN SetConsoleScreenBufferSize: NEAR EXTERN ExitProcess: NEAR ; директивы компоновщику для подключения библиотек includelib c:\win32\work\import32.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 DD ? ; количество выведенных символов CRD COOR <?> _DATA ENDS
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; перекодируем строку PUSH OFFSET STR1 PUSH OFFSET STR1 CALL CharToOemA ; образовать консоль ; вначале освободить уже существующую CALL FreeConsole CALL AllocConsole ; получить HANDL1 ввода PUSH STD_INPUT_HANDLE CALL GetStdHandle MOV HANDL1, EAX ; получить HANDL вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle MOV HANDL, EAX ; установить новый размер окна консоли MOV CRD.X, 100 MOV CRD.Y, 25 PUSH CRD PUSH EAX CALL SetConsoleScreenBufferSize ; задать заголовок консоли PUSH OFFSET STR2 CALL SetConsoleTitleA ; установить позицию курсора MOV CRD.X, 0 MOV CRD.Y, 10 PUSH CRD PUSH HANDL CALL SetConsoleCursorPosition ; задать цветовык атрибуты выводимого текста PUSH COL1 PUSH HANDL CALL SetConsoleTextAttribute ; вывести строку PUSH OFFSET STR1 CALL LENSTR ; в EBX длина строки PUSH 0 PUSH OFFSET LENS PUSH EBX PUSH OFFSET STR1 PUSH HANDL CALL WriteConsoleA ; ждать ввод строки PUSH 0 PUSH OFFSET LENS PUSH 200 PUSH OFFSET BUF PUSH HANDL1 CALL ReadConsoleA ; вывести полученную строку ; вначале задать цветовые атрибуты выводитого текста PUSH COL2 PUSH HANDL CALL SetConsoleTextAttribute ;--------------------------------------------------- PUSH 0 PUSH OFFSET LENS PUSH [LENS] PUSH OFFSET BUF PUSH HANDL CALL WriteConsoleA ; небольшая задержка MOV ECX, 01FFFFFFFh L1: LOOP L1 ; закрыть консоль CALL FreeConsole CALL ExitProcess ; строка - [EBP+08h] ; длина в EBX LENSTR PROC ; PUSH EBX ; MOV EBP, ESP ENTER 0, 0 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 LEAVE RET 4 LENSTR ENDP _TEXT ENDS END START Для работы с команданой строкой применяется АРІ функция GetCommandLineA, которая возвращает указатель на командную строку. Эта функция одинакова работает как для консольных приложений, так и для приложений GUI (Graphic Universal Interface). Пример 2. Программа вывода параметров командной строки ; cons_2.asm .386P .MODEL FLAT, stdcall ; константы STD_OUTPUT_HANDLE equ -11 ; прототипы внешних процедур EXTERN GetStdHandle: NEAR EXTERN WriteConsoleA: NEAR EXTERN ExitProcess: NEAR EXTERN GetCommandLineA: NEAR ; директивы компоновщику для подключения библиотек includelib c:\win32\work\import32.lib ; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' HANDL DWORD ? NUM DWORD ? BUF DB 100 dup (0) LENS DWORD ? ; количества выведенных символов CNT DWORD ? _DATA ENDS ; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить HANDLE вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle 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 JMP LL1 LL2: PUSH 0 CALL ExitProcess ; строка - [EBP+08H] ; длина в EBX LENSTR PROC PUSH EBX 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 LOCALS CALL GetCommandLineA 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 LOCALS CALL GetCommandLineA MOV ESI, EAX ; указатель на строку XOR ECX, ECX ; счетчик MOV EDI, 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 Для компиляции программы используются следующие командные строки: TASM32 /ml prog.asm TLINK32 /ap pgog.obj Основная литература– 5[120-143] Контрольные вопросы. 1. Какие аргументы использует АРІ функция GetStdHandle? 2. Дайте названия цветов букв и символов используемых функцией SetConsoleTextAttribute? 3. Назовите параметры функции CharToOem? 4. Какие типы событий зарезервированы операционной системой?
|