Иллюстрированный самоучитель по задачам и примерам Assembler

Организация высокоуровневого консольного ввода-вывода

Функция SetConsoleCursorPosition предназначена для указания позиции, с которой начинается выполнение операций чтения-записи в окно консоли.

B00L SetConsoleCursorPosition(HANDLE hConsoleOutput. COORD dwCursorPosition);

Параметрами этой функции являются стандартный дескриптор вывода hConsoleOutput, полученный функцией GetStdHandle, и указатель на структуру COORD с координатами новой позиции курсора:

COORD struc x dw 0 у dw 0 ends

По умолчанию цветовое оформление окна консоли достаточно унылое – черный фон, белый текст. Внести разнообразие во внешний вид окна консоли поможет функция SetConsoleTextAttribute, с помощью которой можно изменить установки цвета по умолчанию для текста и фона.

B00L SetConsoleTextAttributetHANDLE hConsoleOutput. WORD wAttributes):

Первый параметр – без комментариев, второй определяет цвет текста и фона. Второй параметр формируется как логическое ИЛИ следующих значений:

  • FOREGROUND_BLUE=0001h – синий текст;
  • FOREGROUND_GREEN=0002h – зеленый текст;
  • FOREGROUND_RED=0004h – красный текст;
  • FOREGROUND_INTENSITY=0008h – текст повышенной яркости;
  • BACKGROUND_BLUE=0010h – голубой фон;
  • BACKGROUND_GREEN=0020h – зеленый фон;
  • BACKGROUND_RED=0040h – красный фон;
  • BACKGROUND_INTENSITY=0080h – фон повышенной яркости.

Для задания белого цвета складываются три компоненты, для задания черного – компоненты не задаются вовсе.

Пример программы ввода-вывода в консоль

Для демонстрации использования функций высокоуровневого ввода-вывода в окно консоли разработаем программу, которая вводит с клавиатуры строку и отображает ее в заголовке окна консоли, а затем выводит эту строку в окне консоли с изменением текущей позиции курсора и цвета текста.

:prg05_11.asm – программа ввода-вывода в консоль с изменением атрибутов выводимого текста
!
.data
.code
start proc near – . точка входа в программу:
……….
:получим стандартные дескрипторы ввода-вывода
push STD_OUTPUT_HANDLE
call GetStdHandle
movdOut.eax:dOut-fleCKpnnTop вывода консоли
push STD_INPUT_HANDLE
call GetStdHandle
mov din.eax idln-дескриптор ввода консоли:введем строку
.¦установим курсор в позицию (2.6)
mov con.хх.2
mov con.yy,6
push con
push dOut
call SetConsoleCursorPosition cmp eax. 0
jz exit;если неуспех
push 0
push offset NumWri количество действительно введенных символов
push 80:размер буфера TitleText для ввода
push offset TitleText
push din
call ReadConsoleA
cmp eax, 0
jz exit:если неуспех
:выведем введенную строку в заголовок окна консоли:
push offset TitleText
call SetConsoleTitleA проверить успех вывода заголовка
test eax.eax
jz exit;неудача
:выведем строку в окно консоли с различных позиций и
с разными цветами установим курсор в позицию (2.5)
mov ecx.10;строку выведем 10 раз
mov bl.10000001b начальные атрибуты
ml: push ecx
inc con.xx
inc con.yy
push con
push dOut
call SetConsoleCursorPosition
cmp eax.O
jz exit:если неуспех;определим атрибуты выводимых символов –
будем получать их циклически сдвигом – регистр
BL
хог еах.еах
rol b1.1
mov al.bl
push eax
push dOut
call SetConsoleTextAttribute
cmp eax.O
jz exit;если неуспех:вывести строку
push 0
push offset NumWri действительное количество выведенных на экран
push NumWri;длина строки для вывода на экран
push offset TitleText:адрес строки для вывода на экран
push dOut
call WriteConsoleA
cmp eax.O
jz exit:если неуспех pop ecx
loop ml
exit::выход из приложения
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.