Консольные приложения. Мышь и клавиатура в консольном приложении
Введение в API-программирование: структура API-программ, консольные приложения. Изучения 32-битного программирования на ассемблере под Windows ассемблере с использованием API-функций. Написание программы, демонстрирующей усвоение полученных знаний.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 18.05.2014 |
Размер файла | 77,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Оглавление
- 1. Цель работы
- 2. Краткая теория
- 3. Листинг программы
- 4. Результаты работы
- Вывод
1. Цель работы
Курсовая работа заключается в изучении одного из разделов операционной системы - работа с консольными приложениями.
Выполнение курсовой работы требует самостоятельного изучения 32-битного программирования на ассемблере под Windows ассемблере с использованием API-функций и в конечном итоге написание программы, демонстрирующей усвоение полученных знаний.
2. Краткая теория
Введение в API-программирование
API (application programming interface) - интерфейс прикладного программирования (иногда интерфейс программирования приложений). Другими словами, это те возможности (функции, переменные, константы, классы), которые предоставляет приложение для использования прикладными программами.
API определяет функциональность, которую предоставляет программа (модуль, библиотека), при этом API позволяет абстрагироваться от того, как именно эта функциональность реализована.
Если программу (модуль, библиотеку) рассматривать как чёрный ящик, то API -- это множество «ручек», которые доступны пользователю данного ящика, которые он может вертеть и дёргать, при этом ящик будет производить какие-то определенные действия понятные и необходимые пользователю, но пользователь, при этом, не имеет даже представления о их реализации. программа консольный ассемблер
Программные компоненты взаимодействуют друг с другом посредством API. При этом обычно компоненты образуют иерархию - высокоуровневые компоненты используют API низкоуровневых компонентов, а те, в свою очередь, используют API ещё более низкоуровневых компонентов.
API операционных систем
Практически все операционные системы (Unix, Windows, Mac OS, и т. д.) имеют API, с помощью которого программисты могут создавать приложения для этой операционной системы. Главный API операционных систем - это множество системных вызовов.
В индустрии программного обеспечения общие стандартные API для стандартной функциональности имеют важную роль, так как они гарантируют, что все программы, использующие общий API, будут работать одинаково хорошо или, по крайней мере, типичным привычным образом. В случае API графических интерфейсов это означает, что программы будут иметь похожий пользовательский интерфейс, что облегчает процесс освоения новых программных продуктов.
Widows API
Windows API - общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Windows (от Windows 3.11 до Windows 98) и Windows NT корпорации «Microsoft». Является самым прямым способом взаимодействия приложений с Windows.
Работа через Windows API -- это наиболее близкий к системе способ взаимодействия с ней из прикладных программ.
Win32 - 32х разрядный API для современных версий Windows. Самая популярная ныне версия. Win32 появился вместе с Windows NT и затем был перенесён (в несколько ограниченном виде) в системы серии Windows 9x.
Win64 -- 64-разрядная версия Win32, содержащая дополнительные функции для использования на 64-разрядных компьютерах.
Структура API-программ
Центральным понятием программирования в среде Windows является сообщение. Система посылает сообщение приложению, а то, в свою очередь, должно правильно отреагировать на него. Получателями сообщений являются функции окон приложения, на программирование которых и уходит большая часть времени при разработке API-приложений.
Классическая структура API-программы определяется четырьмя компонентами: инициализация; цикл ожидания, или цикл обработки сообщений; функция главного окна; другие функции. В простейшем случае последний компонент может отсутствовать. Два первых компонента располагаются в функции WinMain, остальные реализуются отдельными функциями.
Консольные приложения
Как известно, Windows поддерживает работу двух типов приложений -- оконных, в полной мере использующих все достоинства графического интерфейса, и консольных, работающих исключительно в текстовом режиме.
Организация ввода-вывода в консольном приложении Windows
Язык ассемблера -- язык системных программистов, исследователей принципов работы операционных систем, программ и аппаратных средств. Здесь не нужны красивые графические оболочки, а, наоборот, велика потребность в удобных средствах для работы с текстовой информацией. Операционная система Windows обеспечивает встроенную поддержку консолей, которые, по определению, являются интерфейсами ввода-вывода для приложений, работающих в текстовом режиме. Консоль состоит из одного входного и нескольких экранных буферов. Входной буфер представляет собой очередь, каждая запись которой содержит информацию относительно отдельного входного события консоли. Экранный буфер -- двумерный массив, содержащий символы, выводимые в окно консоли, и данные об их цвете. Очередь входного буфера содержит информацию о следующих событиях:
· нажатии и отпускании клавиш;
· манипуляциях мышью -- движение, нажатие-отпускание кнопок;
· изменение размера активного экранного буфера, состояние прокрутки.
Для поддержки работы консольных приложений API Win32 содержит более сорока функций, предназначенных для интеграции в среду Windows программ, работающих в текстовом режиме. Данные функции предоставляют два уровня доступа к консоли -- высокий и низкий. Консольные функции ввода высокого уровня позволяют приложению извлечь данные, полученные при вводе с клавиатуры и сохраненные во входном буфере консоли. Консольные функции вывода высокого уровня позволяют приложению записать данные в устройства стандартного вывода или ошибки с тем, чтобы отобразить этот текст в экранном буфере консоли. Функции высокого уровня также поддерживают переназначение стандартных дескрипторов ввода-вывода и управление режимами работы консоли. Консольные функции низкого уровня позволяют приложениям получить детальную информацию о вводе с клавиатуры, событиях нажатия-отпускания кнопок мыши и о манипуляциях пользователя с окном консоли, а также осуществить больший контроль над выводом данных на экран. Таким образом, API Win32 предоставляет два разных подхода для обеспечения ввода-вывода с консолью, выбор нужного зависит от гибкости и полноты контроля, которыми хочет обладать приложение для обеспечения своей работы с консолью. Функции высокого уровня обеспечивают простоту процесса ввода-вывода путем использования стандартных дескрипторов ввода-вывода, но при этом невозможен доступ к входному и экранным буферам консоли. Функции низкого уровня требуют учета большего количества деталей и объема кода, но это компенсируется большей гибкостью.
Высокоуровневый и низкоуровневый консольный ввод-вывод не являются взаимоисключающими, и приложение может использовать любую комбинацию этих функций. С каждой консолью связаны две кодовые таблицы -- по одной для ввода и вывода. Консоль использует входную кодовую таблицу для трансляции ввода с клавиатуры в соответствующее символьное значение. Аналогичным образом используется кодовая таблица вывода -- для трансляции символьных значений, формируемых различными функциями вывода, в символ, отображаемый в окне консоли. Для работы с кодовыми таблицами приложение может использовать пары -- функции SetConsoleCP и GetConsoleCP для входных кодовых таблиц и функции SetConsoleOutputCP и GetConsoieOutputCP для выходных кодовых таблиц. Идентификаторы кодовых таблиц, доступные на компьютере, сохраняются в системном реестре следующим ключом:
<HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage
Организация низкоуровнего консольного ввода-вывода
Низкий уровень консольного ввода-вывода по сравнению с высоким уровнем и обладает более широкими и гибкими возможностями. Низкоуровневые функции консольного ввода-вывода обеспечивают прямой доступ к входному и экранным буферам консоли, предоставляя приложению доступ к событиям мыши и клавиатуры, а также к информации об изменении размеров окна консоли. Функции низкоуровневого ввода-вывода позволяют приложению иметь доступ по чтению-записи к указанному числу последовательных символьных ячеек в экранном буфере или к прямоугольному блоку символьных ячеек в указанной позиции экранного буфера.
Поддержка работы с мышью в консоли
Большое достоинство консольных приложений -- встроенная средствами Windows поддержка мыши. Она реализуется с помощью функции ReadConsolelnput. Важно отметить, что эта функция используется для получения информация о событиях не только мыши, но и о событиях клавиатуры, изменении размера окна и так далее.
B00L ReadConsoleInput(
HANDLE hConsolelnput,
PINPUT_RECORD lpBuffer,
DWORD nLength,
LPDWORD lpNumberOfEventsRead);
hConsolelnput -- стандартный дескриптор ввода, полученный функцией GetStdHandle;
lpBuffer -- указатель на буфер, в который записывается информация о событии мыши, -- эта область памяти имеет структуру, называемую INPUT_ RECORD;
nLength -- размер во входных записях буфера, на который указывает указатель lpBuffer;
lpNumberOfEventsRead -- определяет переменную, в которую записывается
действительное число прочитанных записей входного буфера.
Расширенная поддержка клавиатуры в консоли
Функции работы с текстом высокого уровня не дают других возможностей работы с клавиатурой, кроме как примитивного ввода текста. При разработке программ текстового режима часто требуется информация о состоянии управляющих клавиш, о факте удержания клавиши, что может свидетельствовать о желании пользователя повторить ввод некоторого символа или просто о желании получить тривиальный скан-код клавиши. Эти и другие события клавиатуры доступны программе посредством функции ReadConsolelnput. События клавиатуры генерируются при нажатии любой клавиши. Процесс их обработки аналогичен обработке событий мыши. В первую очередь заполняется о нажатии некоторых управляющих клавиш. Для всех остальных клавиш просто фиксируется факт нажатия. При этом необходимо помнить, что однократному нажатию клавиши реально соответствуют два события -- нажатие и отпускание клавиши. В связи с этим программа выводит два сообщения. На практике этого можно избежать, анализируя поле bKeyDown: bKeyDown=l, когда клавиша нажата; bKeyDown=0, когда клавиша отпущена. Выход из программы -- при выполнении любых действий с мышью.
Описание используемых функций Wsprintf
Функция форматирует и хранит ряд символов и значений в буфере. Любые параметры преобразуются и копируются в буфер выводимых данных согласно соответствующей спецификации формата в форматируемой строке. Функция добавляет в конец символ завершающего нуля к символам, которые она пишет, но в возвращаемом значении она не включает его в число символов.
int wsprintf(
LPTSTR lpOut,
LPCTSTR lpFmt,
...
);
lpOut - указатель на буфер, который получит форматированный вывод данных. Максимальный размер буфера составляет 1024 байта.
lpFmt - указатель на строку с завершающим нулем, которая содержит в себе спецификации управления форматом. В дополнение к обычным символам ASCII спецификация формата для каждого параметра показывается в этой строке.
… - указывает один или несколько дополнительных параметров. Число и тип характеристик параметра зависят от соответствующих спецификаций управления форматом в параметре lpFmt.
GetStdHandle
Функция извлекает дескриптор для стандартного ввода данных, стандартного вывода или стандартной ошибки устройства.
HANDLE GetStdHandle(
DWORD nStdHandle
);
nStdHandle - стандартное устройство, для которого дескриптор должен быть возвращен.
На вход функции GetStdHandle должно быть подано одно из следующих значений:
· STD_INPUT_HANDLE = -10 -- дескриптор стандартного входного потока;
· STD_OUTPUT_HANDLE = -11 -- дескриптор стандартного выходного потока;
· STD_ERROR_HANDLE = -12 -- дескриптор стандартного потока ошибок.
Дескрипторы, возвращенные функцией GetStdHandle, могут быть использованы прикладными программами, которым нужно читать из консоли или записывать в консоль. Когда консоль создана, дескриптором стандартного ввода является дескриптор буфера ввода консоли, а стандартного вывода и обработки стандартной ошибки является дескриптор активного экранного буфера консоли. Эти дескрипторы могут быть использованы функциями ReadFile и WriteFile, или любой из консольных функций, которые обращаются к консольному буферу ввода или экранному буферу.
Стандартные дескрипторы процесса могут быть переназначен вызовом функции SetStdHandle, в этом случае функция GetStdHandle возвращает переназначенный дескриптор. Если стандартные дескрипторы были переназначены, можно задать значение CONIN$ при вызове к функции CreateFile, чтобы получить дескриптор для буфера ввода консоли. Точно так же можно задать значение CONOUT$, чтобы получить дескриптор для активного экранного буфера консоли.
WriteConsole
Функция записывает символьную строку в экранный буфер консоли, начинающийся с текущей позиции курсора.
BOOL WriteConsole(
HANDLE hConsoleOutput,
CONST VOID * lpBuffer,
DWORD nNumberOfCharsToWrite,
LPDWORD lpNumberOfCharsWritten,
LPVOID lpReserved );
hConsoleOutput - дескриптор экранного буфера консоли.
lpBuffer - указатель на буфер, содержащий символы, которые будут записаны в экранный буфер консоли. Общий размер должен быть меньше чем 64КБ.
nNumberOfCharsToWrite - число TCHARs для чтения.
lpNumberOfCharsWritten - указатель на переменную, которая принимает число фактических записей TCHARs.
lpReserved - зарезервировано, должно быть ПУСТО (NULL).
Функция WriteConsole записывает символы в экранный буфер консоли. Она ведет себя подобно функции WriteFile и, кроме того, может записывать или в режиме ANSI или УНИКОДЕ. Чтобы создать приложение, которое поддерживает единственный набор источников информации, совместимых с обоими режимами, используют функцию WriteConsole, а не WriteFile. Хотя WriteConsole может быть использована только с дескриптором экранного буфера консоли, WriteFile может быть использована с другими дескрипторами (такими как файлы или каналы). Функция WriteConsole завершается ошибкой, если используется со стандартным дескриптором, который был переназначен, чтобы быть несколько другим, чем консольный дескриптор.
Функция WriteConsole записывает символы в экранном буфере консоли в текущей позиции курсора. Позиция курсора продвигается вперед, по мере написания символов.
Символы пишутся, с использованием атрибутов цвета текста и цвета фона, связанных с экранным буфером консоли.
SetConsoleCursorPosition
Функция устанавливает позицию курсора в заданном экранном буфере консоли.
BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD dwCursorPosition );
hConsoleOutput - дескриптор экранного буфера консоли.
dwCursorPosition - структура COORD, которая устанавливает новую позицию курсора. Координаты - столбец и ряд символьного знакоместа экранного буфера. Координаты должны быть в пределах границ экранного буфера консоли.
Если новая позиция курсора не в пределах границ окна экранного буфера консоли, начало координат окна изменяется, чтобы сделать курсор видимым.
SetConsoleTitle
Функция предназначена для отображения заголовка окна консоли
B00L SetConsolеTitle(LPCTSTR lpConsoleTitle) ;
Функция SetConsoleTitle имеет один параметр -- указатель на строку с заголовком консоли, заканчивающуюся нулем.
FreeConsole
Функция отключает вызывающий процесс от его консоли.
BOOL FreeConsole(VOID);
Если другие процессы совместно используют консоль, консоль не разрушается, но вызывающий процесс не может ссылаться на неё.
Процесс может использовать функцию FreeConsole, чтобы отключить себя от своей текущей консоли, а затем он может вызывать функцию AllocConsole, чтобы создать новую консоль или AttachConsole, чтобы подключиться на другую консоль.
AllocConsole
Функция назначает новую консоль для вызывающего процесса.
BOOL AllocConsole(void);
Процесс может быть связан с только одной консолью, так что функция AllocConsole завершается ошибкой, если вызывающий процесс уже имеет консоль. Процесс может использовать функцию FreeConsole, чтобы отключить себя от своей текущей консоли, затем он может вызывать функцию AllocConsole, чтобы создать новую консоль или функцию AttachConsole, чтобы подключиться к другой консоли.
Если вызывающий процесс создает дочерний процесс, ребенок наследует новую консоль.
Функция AllocConsole инициализирует стандартный ввод данных, стандартный вывод и обработку стандартной ошибки для новой консоли. Дескриптор стандартного ввода - это дескриптор буфера ввода консоли, а дескрипторы стандартного вывода, и стандартной ошибки - это дескрипторы экранного буфера консоли. Чтобы получить эти дескрипторы, используйте функцию GetStdHandle.
CharToOemA
Функция преобразует строку в определенный OEM набор символов.
BOOL CharToOem(
LPCTSTR lpszSrc,
LPSTR lpszDst
);
lpszSrc -указатель на преобразуемую строку с завершающим нулем.
lpszDst - указатель на буфер для транслируемой строки. Если функция CharToOem используется как функция ANSI, строка может быть преобразована на месте путем установки параметра lpszDst для того же самого адреса, что и параметр lpszSrc. Этого нельзя делать, если CharToOem используется как широкосимвольная (Unicode) функция.
SetConsoleTextAttribute
Функция устанавливает атрибуты символов, записанных в экранный буфер консоли функцией WriteFile или WriteConsole, или повторенных в эхо режиме функцией ReadFile или ReadConsole. Эта функция воздействует на текст, записанный после вызова функции.
BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput,
WORD wAttributes
);
hConsoleOutput - дескриптор экранного буфера консоли.
wAttributes - цвет текста и фона
Чтобы выяснять текущие атрибуты цвета экранного буфера, необходимо вызвать функцию GetConsoleScreenBufferInfo.
ReadConsoleInputA
Функция читает данные из консольного буфера ввода и удаляет их из буфера.
BOOL ReadConsoleInput(
HANDLE hConsoleInput,
PINPUT_RECORD lpBuffer ,
DWORD nLength ,
LPDWORD lpNumberOfEventsRead
);
hConsoleInput - дескриптор консольного буфера ввода.
lpBuffer - указатель на массив структур INPUT_RECORD, который принимает данные буфера ввода. Общий размер требуемого массива должен быть меньше чем 64КБ.
nLength - размер массива, указанного параметром lpBuffer, в элементах массива.
lpNumberOfEventsRead - указатель на переменную, которая принимает число прочитанных записей вводимых данных.
Если число записей, предписываемых в параметре nLength, превышает число записей, доступных в буфере, читается доступное число. Функция не возвращает значения до тех пор, пока, по крайней мере, не будет прочитана одна запись вводимых данных.
Процесс может установить консольный дескриптор буфера ввода в одной из функций ожидания, чтобы выяснить, когда имеется непрочитанный консольный ввод данных. Когда буфер ввода не пуст, состояние консольного дескриптора буфера ввода является сигнальным.
Чтобы выяснять число непрочитанных записей вводимых данных в буфере ввода консоли, используют функцию GetNumberOfConsoleInputEvents. Чтобы читать записи вводимых данных из консольного буфера ввода без воздействия на число непрочитанных записей, используют функцию PeekConsoleInput. Чтобы сбросить все непрочитанные записи в буфере ввода консоли, используют функцию FlushConsoleInputBuffer.
ExitProcess
Функция заканчивает работу процесса и всех его потоков.
VOID ExitProcess(
UINT uExitCode
);
uExitCode - определяет код выхода для процесса, и для всех потоков, которые завершают работу в результате вызова этой функции. Для того, чтобы получить значение выхода из процесса необходимо используют функцию GetExitCodeProcess. Для того, чтобы получить значение выхода из потока необходимо использовать функцию GetExitCodeThread.
Функция ExitProcess - предпочтительный метод завершения процесса. Эта функция обеспечивает чистое отключение процесса. Такое завершение включает в себя вызов функций точек входа всех связанных динамически подключаемых библиотек (DLL) со значениями, указывающими, что процесс отключается от DLL. Если процесс заканчивается путем вызова TerminateProcess, DLL, к которым процесс подключен, не уведомляются о завершении процесса. После того, как все связанные DLL исполнили любое значение завершения, эта функция завершает работу текущего процесса.
Завершение процесса происходит по нижеследующим причинам:
1. Все дескрипторы объектов, открытые процессом, закрываются.
2. Все потоки в процессе завершают свою работу по исполнению кода.
3. Состояние объекта процесса становится сигнальным, удовлетворяя любые потоки, которые ждали завершения процесса.
4. Состояния всех потоков процесса, становятся сигнальными, удовлетворяя любые потоки, которые ждали завершения работы потоков.
5. Состояние завершения процесса изменяется из STILL_ACTIVE в значение выхода процесса.
Завершение процесса не заставляет дочерние процессы закончить свою работу.
Завершение процесса необязательно удаляет объект процесса из операционной системы. Объект процесса удаляется тогда, когда закрывается последний дескриптор процесса.
KEY_EVENT - клавиатурное событие
Смещение |
Длина |
Значение |
|
+4 |
4 |
При нажатии клавиши значение поля больше нуля. |
|
+8 |
2 |
Количество повторов при удержании клавиши. |
|
+10 |
2 |
Виртуальный код клавиши. |
|
+12 |
2 |
Скан-код клавиши. |
|
+14 |
2 |
Для функции ReadConsoleInputA-младший байт равен ASCII-коду клавиши. Для функции ReadConsoleInputW слово содержит код клавиши в двухбайтной кодировке (Unicode). |
|
+16 |
4 |
Содержится состояния управляющих клавиш. Может являться суммой следующих констант: |
MOUSE_EVENT - событие с мышью
Смещение |
Длина |
Значение |
|
+4 |
4 |
Младшее слово - Х-координата курсора мыши, |
|
+8 |
4 |
Описывает состояние кнопок мыши. Первый бит - левая кнопка, второй бит - правая кнопка, третий бит - средняя кнопка. Бит установлен - кнопка нажата. |
|
+12 |
4 |
Состояние управляющих клавиш. Аналогично предыдущей таблице. |
|
+16 |
4 |
Может содержать следующие значения: |
3. ЛИСТИНГ ПРОГРАММЫ
main.asm
.386P
;Плоская модель памяти.
.MODEL FLAT, STDCALL
;Константы.
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
;Тип события.
KEY_EV equ 1h
MOUSE_EV equ 2h
; константы - состояния клавиатуры
RIGHT_ALT_PRESSED equ 1h
LEFT_ALT_PRESSED equ 2h
RIGHT_CTRL_PRESSED equ 4h
LEFT_CTRL_PRESSED equ 8h
SHIFT_PRESSED equ 10h
NUMLOCK_ON equ 20h
SCROLLLOCK_ON equ 40h
CAPSLOCK_ON equ 80h
ENHANCED_KEY equ 100h
;Прототипы внешних процедур.
EXTERN wsprintfA:NEAR
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 SetConsoleTextAttribute@8:NEAR
EXTERN ReadConsoleInputA@16: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 ?
TITL DB "Обработка событий мыши",0
BUF DB 200 dup(0)
LENS DWORD ? ;Количество выведенных символов.
CO DWORD ?
FORM DB "Координаты: %u %u ",0
CRD COOR <?>
STR1 DB "Для выхода нажмите ESC",0
MOUS_KEY WORD 19 dup(?)
_DATA ENDS
;Сегмент кода.
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
;Образовать консоль.
;Вначале освободить уже существующую.
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
;Задать заголовок окна консоли.
PUSH OFFSET TITL
PUSH OFFSET TITL
CALL CharToOemA@8
PUSH OFFSET TITL
CALL SetConsoleTitleA@4
;*************************************
;Перекодировка строки.
PUSH OFFSET STR1
PUSH OFFSET STR1
CALL CharToOemA@8
;Длина строки.
PUSH OFFSET STR1
CALL LENSTR
;Вывести строку.
PUSH 0
PUSH OFFSET LENS
PUSH EBX
PUSH OFFSET STR1
PUSH HANDL
CALL WriteConsoleA@20
;Цикл ожиданий: движение мыши или нажатие ESC.
LOO:
;Координаты курсора.
MOV CRD.X,0
MOV CRD.Y,10
PUSH CRD
PUSH HANDL
CALL SetConsoleCursorPosition@8
;Прочитать одну запись о событии.
PUSH OFFSET CO ;Количество реально почитанных записей.
PUSH 1 ;Количество получаемых записей.
PUSH OFFSET MOUS_KEY ;Буфер для размещения записей.
PUSH HANDL1 ;Дексриптор входного буфера консоли.
CALL ReadConsoleInputA@16
;Проверим, не с мышью ли что?
CMP WORD PTR MOUS_KEY,MOUSE_EV
JNE LOO1
;Здесь преобразуем координаты мыши в строку.
MOV AX,WORD PTR MOUS_KEY+6 ;У - мышь.
;Копирование с обнулением старших битов.
MOVZX EAX,AX
PUSH EAX
MOV AX,WORD PTR MOUS_KEY+4 ;Х - мышь.
;Копирование с обнулением старших битов.
MOVZX EAX,AX
PUSH EAX
PUSH OFFSET FORM
PUSH OFFSET BUF
CALL wsprintfA
;Восстановить стек.
ADD ESP,16
;Перекодировать строку для вывода.
PUSH OFFSET BUF
PUSH OFFSET BUF
CALL CharToOemA@8
;Длина строки.
PUSH OFFSET BUF
CALL LENSTR
;Вывести на экран координаты курсора.
PUSH 0
PUSH OFFSET LENS
PUSH EBX
PUSH OFFSET BUF
PUSH HANDL
CALL WriteConsoleA@20
JMP LOO ;К началу цикла.
LOO1:
;Нет ли события от клавиатуры?
CMP WORD PTR MOUS_KEY,KEY_EV
JNE LOO ;Есть, какое?
CMP BYTE PTR MOUS_KEY+14,27
JNE LOO
;*************************************
;Закрыть консоль.
CALL FreeConsole@0
PUSH 0
CALL ExitProcess@4
RET
;Процедура определения длины строки.
;Строка - [EBP+08H].
;Длина в ЕВХ
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
4. РЕЗУЛЬТАТЫ РАБОТЫ
ВЫВОД
В результате выполнения курсовой работы был изучен один из разделов операционной - техника работы с консольными приложениями. Была написана программа на 32-битном ассемблере с применением API-функций.
Размещено на Allbest.ru
...Подобные документы
Введение в API-программирование. Структура API-программ. Организация ввода-вывода в консольном приложении Windows. Организация низкоуровнего консольного ввода-вывода. Расширенная поддержка клавиатуры в консоли. Поддержка работы с мышью в консоли.
курсовая работа [91,0 K], добавлен 10.02.2015Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.
курсовая работа [164,5 K], добавлен 18.05.2014Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.
курсовая работа [165,6 K], добавлен 18.05.2014Программирование оконных Windows-приложений, средства TASM для их разработки. Углубленное программирование на ассемблере для Win32, минимальная программа. Организация высокоуровневого консольного ввода-вывода. Наборы символов и функции Wlndows APL.
курсовая работа [51,6 K], добавлен 23.06.2015Изучение основ программирования на 32-битном ассемблере с применением API-функций. Ознакомление с основами разработки программы, демонстрирующей работу одного из разделов ОС Windows - всплывающих подсказок. Анализ результатов работы данной программы.
отчет по практике [105,1 K], добавлен 10.02.2015Моделирование цифровых узлов комбинационного и последовательностного типа electronic work bench. Основы программирования на Ассемблере: арифметические команды, манипуляции над битами, строковые операции. Программирование с использованием пакета MASM.
отчет по практике [1,9 M], добавлен 10.01.2015Ассемблер как символический аналог машинного языка. Архитектура микропроцессора: организация памяти, способы адресации операндов, правила использования регистров. Текст программы. Этапы программирования на ассемблере, алгоритмы выполнения задач.
контрольная работа [515,1 K], добавлен 20.01.2016Введение в API-программирование. Транслирование клавиатурных сообщений в ASCII-коды. Текст программы на 32-битном ассемблере с применением API-функций. Функция для создания диалогового окна. Определение открываемого диска, каталога и имени файла.
курсовая работа [40,6 K], добавлен 18.05.2014Создание и компиляция программ на ассемблере. Структура программ, использование специальных директив резервирования и инициализации данных. Организация ввода-вывода на ассемблере и организация вычислений. Команды передачи управления и обработки строк.
методичка [104,8 K], добавлен 02.12.2009Техника создания графики при помощи API функций, экспортируемых библиотекой GDI32.DLL. Разработка на языке программирования С++ в среде программирования Microsoft Visual C++ программы для отображения часов реального времени в цифровом и аналоговом виде.
курсовая работа [2,8 M], добавлен 27.01.2010Описание функций, использующихся в программах. Основы 32-битного программирования на языке Assembler для ОС WINDOWS. Использование функции invoke, которая позволяет намного сократить текст программы и делает приложения похожими на программы для "ЯВы".
курсовая работа [252,6 K], добавлен 20.02.2015Разработка приложения "Ведомость начисления заработной платы" в среде программирования C++Builder. Алгоритм и сценарий работы программы. Проектирование интерфейса пользователя. Написание программных модулей и результаты тестирования данной программы.
курсовая работа [597,4 K], добавлен 31.01.2016Основы программирования в операционной системе Windows. Создание процессов в 32-битных операционных системах. Основное отличие дескриптора от идентификатора. Понятие критической секции. Основы вызова API-функций. Методы многозадачного программирования.
курсовая работа [501,1 K], добавлен 18.05.2014Изучение 32-х битного программирования на ассемблере. Рассмотрение ресурса как некого визуального элемента с заданными свойствами, его выгоды, примеры использования. Используемые функции. Редакторы и трансляторы ресурсов. Результат работы программы.
курсовая работа [719,5 K], добавлен 18.05.2014Основы организации приложения в Windows. Посылка и передача сообщений для окон. Создание и отображение главного окна приложения. Деактивация приложения, его фазы. Сообщения клавиатуры и функции для работы с ней. Определение состояния отдельных клавиш.
лекция [65,7 K], добавлен 24.06.2009Анализ возможных подходов к созданию web-приложения с использованием программирования Java и CGI. Разработка структуры базы данных и реализация полученной модели в рамках СУБД. Обеспечение диалога CGI-программы с пользователем, используя браузер.
курсовая работа [310,9 K], добавлен 07.08.2011Команды, необходимые для организации разветвлений и циклических структур в программах, условных переходов, изменения признака переноса, изменения содержимого аккумулятора. Логические команды над аккумулятором и регистром. Программа на ассемблере.
лабораторная работа [25,2 K], добавлен 03.03.2009Изучение учебника и справочной подсистемы Windows 95/NT, получение навыков работы с "мышью", манипулирование окнами и значками программ и документов, запуска программ в системе Windows 95/NT. Разработка простого приложения для Windows при помощи Delphi.
контрольная работа [1,1 M], добавлен 15.01.2009Изучение архитектуры персонального компьютера на примере микропроцессора фирмы Intel. Регистры общего назначения. Оперативная память; форматы данных и команд. Команд пересылки с различными способами адресации операндов. Структура программы на Ассемблере.
курс лекций [506,4 K], добавлен 03.05.2014Создание программы для хранения и обработки данных о съеме/сдаче жилья. Написание программы на языке C++ с использованием библиотеки Qt; использование исходного кода для создания приложения под Windows, Linux, Mac OS X без дополнительных изменений кода.
курсовая работа [60,4 K], добавлен 07.03.2013