
- •Пояснительная записка
- •Цель работы
- •Краткая теория Введение в api-программирование
- •Api операционных систем
- •Widows api
- •Структура api-программ
- •Консольные приложения
- •Организация ввода-вывода в консольном приложении Windows
- •Организация низкоуровнего консольного ввода-вывода
- •Поддержка работы с мышью в консоли
- •Расширенная поддержка клавиатуры в консоли
- •Описание используемых функций
- •Листинг программы
- •Результаты работы
- •Список литературы
Листинг программы
KURS.asm
. .386P
; плоская модель
.MODEL FLAT, stdcall
; константы
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
; тип события
KEY_EV equ 1h
MOUSE_EV equ 2h
; атрибуты цветов
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@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
EXTERN ReadConsoleInputA@16: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 "Rabota konsoli",0
BUF DB 200 dup (?)
LENS DWORD ? ; количество выведенных символов
CRD COOR <?>
C0 DWORD ?
MOUS_KEY WORD 9 dup (?)
_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,0
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
; ждать ввод строки
L00:
MOV CRD.X,0
MOV CRD.Y,1
PUSH CRD
PUSH HANDL
CALL SetConsoleCursorPosition@8
; проверим, не с мышью ли что?
PUSH 0
PUSH OFFSET LENS
PUSH 200
PUSH OFFSET BUF
PUSH HANDL1
CALL ReadConsoleA@20
PUSH OFFSET C0
PUSH 1
PUSH OFFSET MOUS_KEY
PUSH HANDL1
CALL ReadConsoleInputA@16
CMP WORD PTR MOUS_KEY, MOUSE_EV
JNE L00
; вывести полученную строку
; вначале задать цветовые атрибуты выводимого текста
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
; строка - [EBP+08H]
; длина в EBX
LENSTR PROC
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
LEAVE
RET 4
LENSTR ENDP
_TEXT ENDS
END START