Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2014- СП 3.0 ЛАБЫ ОБЯЗАТ.doc
Скачиваний:
99
Добавлен:
01.03.2016
Размер:
896 Кб
Скачать

InputBuffer db 25 dup (0) ; вводной буфер фрагмент 3

bLen dd 23 ; длина буфера ввода, нужна при вводе

ProchitanoByte dd 0 ; сколько байт фактически было введено

PotokStdIn dd ? ; для записи манипулятора Стд Потока Ввода

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

; ФРАГМЕНТ4

invoke GetStdHandle,STD_INPUT_HANDLE

mov PotokStdIn, eax ; запросилиуWindowsманипуляторстдпотокаввода

; Задатьсвойствапотокаввода

invoke SetConsoleMode,PotokStdIn,\

ENABLE_LINE_INPUT or \ ; закончить по Enter

ENABLE_ECHO_INPUT or \ ; выводить вводимое (ввод с эхом)

ENABLE_PROCESSED_INPUT ; обрабатывать строчные символы CR,LF,BS и Сtrl-C

invoke ReadFile, PotokStdIn, ADDR InputBuffer, bLen, ADDR ProchitanoByte, NULL

Как видно из описанного, использование функций WriteFile() иReadFile() решает задачу ввода-вывода, но их использование достаточно утомительно – слишком много всяких предварительных организующих действий. Вполне понятно стремление программистов «упрятать» эти излишние конечному пользователю подробности внутрь то ли процедур, то ли макросов. Тогда повторное использование ввода-вывода станет внешне более простым, значит, более удобным.

К счастью, создателями пакета MASM32 эта работа успешно проделана. Нам остается только научиться правильно пользоваться этими средствами. Мы не будем здесь пока рассматривать процедуры, упрощающие ввод-вывод, а рассмотрим только некоторые макросы, решающие ту же задачу.

      1. Высокоуровневый консольный ввод-вывод с использованием макросов

Приличного объема библиотека готовых макросов пакета MASM32 приведена в файле d:\MASM32\macros\macros.asm. Мы подключаем эту библиотеку к нашим программам директивой

include \masm32\macros\macros.asm

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

include \masm32\include\windows.inc; main windows include file

include \masm32\include\masm32.inc ; masm32 library include

Comment * -------------------------------

Windows API include files

-------------------*---------------------

include \masm32\include\gdi32.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

include \masm32\include\Comctl32.inc

include \masm32\include\comdlg32.inc

include \masm32\include\shell32.inc

include \masm32\include\oleaut32.inc

include \masm32\include\ole32.inc

include \masm32\include\msvcrt.inc

include \masm32\include\dialogs.inc ; macro file for dialogs

Впрочем, в используемых нами примерах так оно и есть.

Рассмотрим несколько самых употребительных макросов для консольного ввода-вывода.

        1. Макрос консольного вывода print

Гибкий и мощный макрос. Показывает строку, задаваемую указателем на неё:

print lptext

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

print lptext, “ продолжение вывода ”,13,10

Указатель строки в вызове printможет отсутствовать, но, если он есть, он должен указываться только на первом месте.

При использовании printследует помнить, что он меняет значение регистраEAX. Поэтому, если нужно сохранить ЕАХ, следует использовать связку

Push EAX

Print c параметрами

Pop EAX

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