Описание используемых функций — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Описание используемых функций

2020-04-01 152
Описание используемых функций 0.00 из 5.00 0 оценок
Заказать работу

 

Функция извлекает дескриптор для стандартного ввода данных, стандартного вывода или стандартной ошибки устройства.GetStdHandle(nStdHandle

);- стандартное устройство, для которого дескриптор должен быть возвращен.

На вход функции GetStdHandle должно быть подано одно из следующих значений:

·   STD_INPUT_HANDLE = -10 - дескриптор стандартного входного потока;

·   STD_OUTPUT_HANDLE = -11 - дескриптор стандартного выходного потока;

·   STD_ERROR_HANDLE = -12 - дескриптор стандартного потока ошибок.

Дескрипторы, возвращенные функцией GetStdHandle, могут быть использованы прикладными программами, которым нужно читать из консоли или записывать в консоль. Когда консоль создана, дескриптором стандартного ввода является дескриптор буфера ввода консоли, а стандартного вывода и обработки стандартной ошибки является дескриптор активного экранного буфера консоли. Эти дескрипторы могут быть использованы функциями ReadFile <http://www.vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm> и WriteFile <http://www.vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_writefile.htm>, или любой из консольных функций, которые обращаются к консольному буферу ввода или экранному буферу.

Стандартные дескрипторы процесса могут быть переназначен вызовом функции SetStdHandle, в этом случае функция GetStdHandle возвращает переназначенный дескриптор. Если стандартные дескрипторы были переназначены, можно задать значение CONIN$ при вызове к функции CreateFile <http://www.vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_createfile.htm>, чтобы получить дескриптор для буфера ввода консоли. Точно так же можно задать значение CONOUT$, чтобы получить дескриптор для активного экранного буфера консоли.

WriteConsole

Функция записывает символьную строку в экранный буфер консоли, начинающийся с текущей позиции курсора.

BOOL WriteConsole(hConsoleOutput, VOID * lpBuffer, nNumberOfCharsToWrite, lpNumberOfCharsWritten, lpReserved);

hConsoleOutput - дескриптор экранного буфера консоли.- указатель на буфер, содержащий символы, которые будут записаны в экранный буфер консоли. Общий размер должен быть меньше чем 64КБ.- число TCHARs для чтения.- указатель на переменную, которая принимает число фактических записей TCHARs.- зарезервировано, должно быть ПУСТО (NULL).

Функция WriteConsole записывает символы в экранный буфер консоли. Она ведет себя подобно функции WriteFile <http://www.vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_writefile.htm> и, кроме того, может записывать или в режиме ANSI или УНИКОДЕ. Чтобы создать приложение, которое поддерживает единственный набор источников информации, совместимых с обоими режимами, используют функцию WriteConsole, а не WriteFile. Хотя WriteConsole может быть использована только с дескриптором экранного буфера консоли, WriteFile может быть использована с другими дескрипторами (такими как файлы или каналы). Функция WriteConsole завершается ошибкой, если используется со стандартным дескриптором, который был переназначен, чтобы быть несколько другим, чем консольный дескриптор.

Функция WriteConsole записывает символы в экранном буфере консоли в текущей позиции курсора. Позиция курсора продвигается вперед, по мере написания символов.

Символы пишутся, с использованием атрибутов цвета текста и цвета фона, связанных с экранным буфером консоли.

SetConsoleCursorPosition

Функция устанавливает позицию курсора в заданном экранном буфере консоли.

BOOL SetConsoleCursorPosition(hConsoleOutput, dwCursorPosition); - дескриптор экранного буфера консоли.

dwCursorPosition - структура COORD <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/str_coord.htm>, которая устанавливает новую позицию курсора. Координаты - столбец и ряд символьного знакоместа экранного буфера. Координаты должны быть в пределах границ экранного буфера консоли.

Если новая позиция курсора не в пределах границ окна экранного буфера консоли, начало координат окна изменяется, чтобы сделать курсор видимым.

SetConsoleTitle

Функция предназначена для отображения заголовка окна консолиL SetConsolеTitle(LPCTSTR lpConsoleTitle);

Функция SetConsoleTitle имеет один параметр - указатель на строку с заголовком консоли, заканчивающуюся нулем.

Функция отключает вызывающий процесс от его консоли.FreeConsole(VOID);

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

Процесс может использовать функцию FreeConsole, чтобы отключить себя от своей текущей консоли, а затем он может вызывать функцию AllocConsole <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_allocconsole.htm>, чтобы создать новую консоль или AttachConsole <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_attachconsole.htm>, чтобы подключиться на другую консоль.

AllocConsole

Функция назначает новую консоль для вызывающего процесса.AllocConsole(void);

Процесс может быть связан с только одной консолью, так что функция AllocConsole завершается ошибкой, если вызывающий процесс уже имеет консоль. Процесс может использовать функцию FreeConsole <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_freeconsole.htm>, чтобы отключить себя от своей текущей консоли, затем он может вызывать функцию AllocConsole, чтобы создать новую консоль или функцию AttachConsole <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_attachconsole.htm>, чтобы подключиться к другой консоли.

Если вызывающий процесс создает дочерний процесс, ребенок наследует новую консоль.

Функция AllocConsole инициализирует стандартный ввод данных, стандартный вывод и обработку стандартной ошибки для новой консоли. Дескриптор стандартного ввода - это дескриптор буфера ввода консоли, а дескрипторы стандартного вывода, и стандартной ошибки - это дескрипторы экранного буфера консоли. Чтобы получить эти дескрипторы, используйте функцию GetStdHandle <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_getstdhandle.htm>.

CharToOemA

Функция преобразует строку в определенный OEM набор символов.

BOOL CharToOem(lpszSrc,lpszDst

);-указатель на преобразуемую строку с завершающим нулем.- указатель на буфер для транслируемой строки. Если функция CharToOem используется как функция ANSI, строка может быть преобразована на месте путем установки параметра lpszDst для того же самого адреса, что и параметр lpszSrc. Этого нельзя делать, если CharToOem используется как широкосимвольная (Unicode) функция.

Функция устанавливает атрибуты символов, записанных в экранный буфер консоли функцией WriteFile <http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_writefile.htm> или WriteConsole <http://vsokovikov.narod.ru/New_MSDN_API/Console/fn_writeconsole.htm>, или повторенных в эхо режиме функцией ReadFile <http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm> или ReadConsole. Эта функция воздействует на текст, записанный после вызова функции.

BOOL SetConsoleTextAttribute(hConsoleOutput, wAttributes

);- дескриптор экранного буфера консоли.- цвет текста и фона

Чтобы выяснять текущие атрибуты цвета экранного буфера, необходимо вызвать функцию GetConsoleScreenBufferInfo <http://vsokovikov.narod.ru/New_MSDN_API/Console/fn_getconsolescreenbufferin.htm>.

ReadConsoleInputA

Функция читает данные из консольного буфера ввода и удаляет их из буфера.

BOOL ReadConsoleInput(hConsoleInput, _RECORD lpBuffer, nLength, lpNumberOfEventsRead

);- дескриптор консольного буфера ввода.

lpBuffer - указатель на массив структур INPUT_RECORD <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/str_input_record.htm>, который принимает данные буфера ввода. Общий размер требуемого массива должен быть меньше чем 64КБ.- размер массива, указанного параметром lpBuffer, в элементах массива.- указатель на переменную, которая принимает число прочитанных записей вводимых данных.

Если число записей, предписываемых в параметре nLength, превышает число записей, доступных в буфере, читается доступное число. Функция не возвращает значения до тех пор, пока, по крайней мере, не будет прочитана одна запись вводимых данных.

Процесс может установить консольный дескриптор буфера ввода в одной из функций ожидания <http://www.vsokovikov.narod.ru/New_MSDN_API/Synchronization/wait_functions.htm>, чтобы выяснить, когда имеется непрочитанный консольный ввод данных. Когда буфер ввода не пуст, состояние консольного дескриптора буфера ввода является сигнальным.

Чтобы выяснять число непрочитанных записей вводимых данных в буфере ввода консоли, используют функцию GetNumberOfConsoleInputEvents <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_getnumberofconsoleinpute.htm>. Чтобы читать записи вводимых данных из консольного буфера ввода без воздействия на число непрочитанных записей, используют функцию PeekConsoleInput <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_peekconsoleinput.htm>. Чтобы сбросить все непрочитанные записи в буфере ввода консоли, используют функцию FlushConsoleInputBuffer <http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_flushconsoleinputbuffer.htm>.

ExitProcess

Функция заканчивает работу процесса и всех его потоков.ExitProcess(uExitCode

);

uExitCode - определяет код выхода для процесса, и для всех потоков, которые завершают работу в результате вызова этой функции. Для того, чтобы получить значение выхода из процесса необходимо используют функцию GetExitCodeProcess <http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_getexitcodeprocess.htm>. Для того, чтобы получить значение выхода из потока необходимо использовать функцию GetExitCodeThread <http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_getexitcodethread.htm>.

Функция ExitProcess - предпочтительный метод завершения процесса. Эта функция обеспечивает чистое отключение процесса. Такое завершение включает в себя вызов функций точек входа всех связанных динамически подключаемых библиотек (DLL) со значениями, указывающими, что процесс отключается от DLL. Если процесс заканчивается путем вызова TerminateProcess <http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_terminateprocess.htm>, DLL, к которым процесс подключен, не уведомляются о завершении процесса. После того, как все связанные DLL исполнили любое значение завершения, эта функция завершает работу текущего процесса.

Завершение процесса происходит по нижеследующим причинам:

. Все дескрипторы объектов, открытые процессом, закрываются.

. Все потоки в процессе завершают свою работу по исполнению кода.

. Состояние объекта процесса становится сигнальным, удовлетворяя любые потоки, которые ждали завершения процесса.

. Состояния всех потоков процесса, становятся сигнальными, удовлетворяя любые потоки, которые ждали завершения работы потоков.

. Состояние завершения процесса изменяется из STILL_ACTIVE в значение выхода процесса.

Завершение процесса не заставляет дочерние процессы закончить свою работу.

Завершение процесса необязательно удаляет объект процесса из операционной системы. Объект процесса удаляется тогда, когда закрывается последний дескриптор процесса.


KEY_EVENT - клавиатурное событие

Смещение Длина Значение
+4 4 При нажатии клавиши значение поля больше нуля.
+8 2 Количество повторов при удержании клавиши.
+10 2 Виртуальный код клавиши.
+12 2 Скан-код клавиши.
+14 2 Для функции ReadConsoleInputA-младший байт равен ASCII-коду клавиши. Для функции ReadConsoleInputW слово содержит код клавиши в двухбайтной кодировке (Unicode).
+16 4 Содержится состояния управляющих клавиш. Может являться суммой следующих констант: 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 Смысл констант очевиден.

_EVENT - событие с мышью

Смещение Длина Значение
+4 4 Младшее слово - Х-координата курсора мыши, старшее слово - Y-координата мыши.
+8 4 Описывает состояние кнопок мыши. Первый бит - левая кнопка, второй бит - правая кнопка, третий бит - средняя кнопка. Бит установлен - кнопка нажата.
+12 4 Состояние управляющих клавиш. Аналогично предыдущей таблице.
+16 4 Может содержать следующие значения: MOUSE_MOV equ 1h; было движение мыши DOUBLE_CL equ 2h; был двойной щелчок

 


ЛИСТИНГ ПРОГРАММЫ

.asm

..386P

; плоская модель

.MODEL FLAT, stdcall

; константы

STD_OUTPUT_HANDLE equ -11_INPUT_HANDLE equ -10

; тип события_EV equ 1h_EV equ 2h

; атрибуты цветов_BLUE equ 1h; синий цвет букв_GREEN equ 2h; зеленый цвет букв_RED equ 4h; красный цвет букв_INTENSITY equ 8h; повышенная интенсивность_BLUE equ 10h; синий свет фона_GREEN equ 20h; зеленый цвет фона_RED equ 40h; красный цвет фона

BACKGROUND_INTENSITY equ 80h; повышенная интенсивность= 2h+8h; цвет выводимого текста= 1h+2h+8h; цвет выводимого текста 2

; прототипы внешних процедур

EXTERN GetStdHandle@4:NEARWriteConsoleA@20:NEARSetConsoleCursorPosition@8:NEARSetConsoleTitleA@4:NEARFreeConsole@0:NEARAllocConsole@0:NEARCharToOemA@8:NEARSetConsoleCursorPosition@8:NEARSetConsoleTextAttribute@8:NEARReadConsoleA@20:NEARSetConsoleScreenBufferSize@8:NEARExitProcess@4:NEARReadConsoleInputA@16:NEAR

; директивы компоновщику для подключения библиотекc:\masm32\lib\user32.libc:\masm32\lib\kernel32.lib

;------------------------------------------------------------STRUCWORD?WORD?ENDS

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'DWORD?DWORD?DB "Введите строку: ",13,10,0DB "Rabota konsoli",0 DB 200 dup (?)DWORD?; количество выведенных символовCOOR <?>

C0 DWORD?_KEY WORD 9 dup (?)

_DATA ENDS

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE':

; перекодируем строкуOFFSET STR1OFFSET STR1CharToOemA@8

; образовать консоль

; вначале освободить уже существующую

CALL FreeConsole@0AllocConsole@0

; получить HANDL1 вводаSTD_INPUT_HANDLEGetStdHandle@4

MOV HANDL1, EAX

; получить HANDL вывода

PUSH STD_OUTPUT_HANDLEGetStdHandle@4

MOV HANDL, EAX

; установить новый размер окна консоли

MOV CRD.X, 100CRD.Y, 25CRDEAXSetConsoleScreenBufferSize@8

; задать заголовок окна консоли

PUSH OFFSET STR2SetConsoleTitleA@4

; установить позицию курсораCRD.X,0

MOV CRD.Y,0CRDHANDL

CALL SetConsoleCursorPosition@8

; задать цветовые атрибуты выводимого текста

PUSH COL1HANDLSetConsoleTextAttribute@8

; вывести строкуOFFSET STR1LENSTR; в EBX длина строки0OFFSET LENSEBXOFFSET STR1HANDLWriteConsoleA@20

; ждать ввод строки:CRD.X,0

MOV CRD.Y,1CRDHANDL

CALL SetConsoleCursorPosition@8

; проверим, не с мышью ли что?

PUSH 0OFFSET LENS200OFFSET BUFHANDL1ReadConsoleA@20OFFSET C01OFFSET MOUS_KEYHANDL1ReadConsoleInputA@16WORD PTR MOUS_KEY, MOUSE_EV

JNE L00

; вывести полученную строку

; вначале задать цветовые атрибуты выводимого текста

PUSH COL2HANDLSetConsoleTextAttribute@8

;------------------------------------------------------------0OFFSET LENS[LENS]; длина вводимой строкиOFFSET BUFHANDLWriteConsoleA@20

; небольшая задержкаECX,01FFFFFFFH:L1

; закрыть консоль

CALL FreeConsole@0ExitProcess@4

; строка - [EBP+08H]

; длина в EBXPROC0,0EAX

;--------------EDI, DWORD PTR [EBP+08H]

MOV EBX, EDIECX, 100; ограничить длину строки

XOR AL,ALSCASB; найти символ 0

SUB EDI, EBX; длина строки, включая 0

MOV EBX, EDIEBX

;--------------EAX4ENDP

_TEXT ENDSSTART


Результаты работы

 

рисунок 1- работа программы

 


Вывод

 

В результате выполнения курсовой работы был изучен один из разделов операционной системы - работа с консольными приложениями, также в консольном приложении были задействованы клавиатура и мышь. Была написана программа на 32-битном ассемблере с применением API-функций.


Список литературы

 

1. Пирогов В. Ю. Ассемблер для Windows. - М.: Издатель Молгачева С.В., 2002. -552 с.

.   Методические указания для выполнения курсовой работы «Изучение операционной системы Windows» по курсу «Операционные системы» для студентов специальности 23.01.00 «Вычислительные машины, комплексы,

.   Особенности работы с 32-битным ассемблером (дата обращения: 20.04.2014) http://wasm.ru/wault/


Поделиться с друзьями:

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.069 с.