Работа с консолью в среде Windows




 

Как мы уже говорили, чтобы выполнить операции приема данных с клавиатуры и вывода данных на экран, программист при написании программы на языке ассемблера может использовать одну из трех возможностей:

1) прерывания BIOS (BIOS – совокупность программ в энерго-независимой памяти компьютера, среди которых есть программы обработки прерываний)

2) прерывания MS-DOS

3) использование API-функций операционной системы WINDOWS

В Windows программы, реализующие такой режим работы, называют консольными приложениями. Видимая часть консольного приложения называется окном консольного приложения. Консольные приложения позволяет организовать взаимодействие с операционной системой посредством ввода текстовых команд (управляющих воздействий) с помощью клавиатуры и отображения реакции вычислительной системы на мониторе. Управление операционной системой с помощью ввода текстовых команд посредством клавиатуры позволяет решать в основном задачи по администрированию операционной системы: работа с файловой системой (копирование, удаление, создание файлов и каталогов, преобразование файловой системы из одного типа в другой и т.д.), управление настройками подключения к сети, конфигурирование системных устройств (например, портов ввода-вывода) и т.д.

Консольное приложение работает с входным и экранным буферами:

· Входной буфер представляет собой массив данных, или так называемую очередь, каждая запись которой содержит информацию об отдельных входных событиях консоли (нажатии и отпускании клавиш; движении мыши, нажатии и отпускании ее кнопок; изменении размера активного экранного буфера и т.д.)

· Экранный буфер — двухмерный массив, содержащий коды символов, выводимых в окно консоли, и данные об их цвете.

Для организации консольных приложений в Windows используются API-функции. Application Programming Interface (API) - это большая коллекция функций, располагающихся непосредственно в операционной системе и готовых для использования в пользовательских программах. Эти функции находятся в нескольких динамически подгpужаемых библиотеках.

API предоставляет два уровня работы с консольювысокий и низкий – применительно к операциям ввода с клавиатуры и вывода на экран. Выбор нужного уровня зависит от того, какая степень гибкости и полноты контроля требуется приложению для обеспечения своей работы с консолью.

Функции высокого уровня считывают поток символов из входного буфера консоли. Выходные данные записываются в экранный буфер консоли. Функции высокого уровня обеспечивают простоту процесса ввода-вывода.

Функции низкого уровня извлекают детальную информацию о нажатии клавиш и событиях мыши, о работе пользователя с окном консоли (перетаскивание, изменение размеров и т.д.). Эти функции требуют учета большего количества деталей и написания большего объема кода, но это компенсируется большей гибкостью.

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

 

Простейшей программой консольного приложения является программа, в процессе выполнения которой создается консольное окно и изменяется его заголовок.

Первой функцией консольного приложения должна быть функция создания нового консольного окна (или, как еще говорят, функция запроса консоли) AllocConsole. Для вызова функции AllocConsole не требуется никаких параметров. Формат вызова следующий:

invoke AllocConsole

В процессе выполнения этой функции создается окно консоли. Результат выполнения функции возвращается в регистр EAX. В случае успеха (то есть успешного создания и отображения окна консоли) функция AllocConsole возвращает в EAX ненулевое значение, при неудаче — ноль.

Для анализа значения регистра EAX можно использовать:

· команду “cmp eax, 0” и оценить результат ее выполнения (эта команда рассматривалась нами ранее);

· команду “ test eax,eax”. Команда test производит поразрядное логическое умножение двух операндов (логическое “И”). При этом в результате значения операндов не меняются. Результат работы команды оценивается по значению флага ZF (ZF=1, если результат логического умножения равен нулю).

Процессn в конкретный момент времени может использовать одно консольное окно. Если процессу необходимо отобразить еще одно консольное окно, то первое окно должно быть закрыто с помощью функции FreeConsole (для ее вызова также не требуются параметры; результат возвращается в EAX; в случае успеха функция FreeConsole возвращает ненулевое значение, при неудаче — нуль).

Для отображения заголовка окна консоли предназначена функция

SetConsoleTitle, которая имеет один параметр – так называемый указатель на строку с заголовком консоли. Этот указатель представляет собой смещение начала строки заголовка относительно начала сегмента данных (для получения этого смещения используется оператор OFFSET). Код последнего символа строки заголовка должен быть равен нулю. Формат вызова следующий:

invoke SetConsoleTitle, lpConsoleTitle.

где lpConsoleTitle – указатель на строку с заголовком консоли.

Например, в программе пишем:

.data

Zagolovok db 'Win32 Console Application',0

.code

invoke SetConsoleTitle, offset Zagolovok

(оператор offset возвращает смещение переменной относительно начала сегмента данных)

Оценить результат выполнения функции SetConsoleTitle можно также по содержимому регистра EAX (ненулевое значение – успех, нулевое – неудача).

Чтобы при завершении процесса выделенное ему консольное окно закрывалось автоматически, в программе необходимо использовать функцию ExitProcess. Формат вызова:

invoke ExitProcess, uExitCode

где uExitCode - код завершения процесса, задаваемый программистом при написании программы (принято писать ноль). В общем случае в различных ветвях кода может быть несколько точек выхода с вызовом функции ExitProcess. Задавая различные значения кода завершения, можно идентифицировать причину завершения процесса. (Проанализировать этот код можно с помощью функций GetExitCodeProcess и GetExitCodeThread).

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: