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

Макрос input()вызываетсяфункционально, в отличие отprint. Практически это означает, что вызовinput()должен быть операндом выражения, в которое он возвращает вычисляемое им значение. Еще одна особенность функционального синтаксиса – перечисление параметров приводится в скобках, а не списком после имени макроса.

Макрос input()получает с клавиатуры текст, пишет его в автоматически создаваемую строковую переменную и возвращает адрес этой переменной.

mov lpstring, input()

Параметром макроса input() может выступать строка-подсказка для ввода. Эта строка может включать список строк в кавычках и байтов, задаваемых числами:

mov lpstring, input("Введите число ",62," ")

Здесь 62 – это код символа «>».

        1. Преобразование строки в число

Как говорилось выше, консольный ввод-вывод осуществляется исключительно как ввод-вывод текстов. Поэтому, если вы вводите с клавиатуры «94», то это строка из символов «9» и «4», а не число 94, представляемое в памяти в двоичном виде. Поэтому, если нам нужно ввести в программу число94, то это придется делать в два шага: 1) Ввести строку «94», 2) Преобразовать строку «94» в число 94. Для этого существует много макросов вmacros.asm, мы рассмотрим только два.

Функционально вызываемый макрос a2ud() читает строку, задаваемую указателем. Алгоритм считает ее десятичной записью числа, и преобразует ее в числовое значение. Это число пишется в автоматически создаваемую переменную типаDWORD(4 байта). Адрес этой переменной и есть значение, возвращаемое этим макросом:

mov EDX, a2ud(lpNumString) ; в EDX - адрес числа

Второй макрос имеет имя h2ud()и отличается отa2ud()только тем, что рассматривает преобразуемую в число строку как запись числа в 16-ричном формате. Всё остальное совпадает.

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

Эту задачу рещает процедурно вызываемый макрос inkeyс необязательным параметром (текст в кавычках и/или байты числами), играющим роль приглашения, вроде «Продолжить по кнопке». Примеры вызовов:

inkey

inkey NULL

Inkey "Жду кнопочку."

Просто inkeyпокажет приглашение «по умолчанию», скорее всего это будет "Press a key to continue ...". Вызовinkey NULL ничего не напишет, буде просто мигать курсором и ждать нажатия. Вызовinkey "Жду кнопочку." выведет текст-операнд и будет ждать кнопки.

Примечание А.Код нажатого символа должен, по замыслу авторов макроса, возвращаться в ЕАХ. Увы, ребята пропустили ошибочку. Не возвращает. Правда, ситуацию легко исправить. Откройтеmacros.asmи найдите в нем код макросаinkey(поиском пользоваться не разучились?) В нем передENDMстоит вызов print chr$(13,10), которым авторы желают выполнить перевод курсора на новую строку. Он-то и портит ЕАХ. Закомментируйте его. Теперьinkeyдействительно будет оставлять код введенного символа в ЕАХ.

        1. Преобразование числа в строку

Числа перед выводом нужно преобразовать в символьную строку, иначе байты числа будут трактоваться при выводе как коды символов и DWORD-число 94 (двоичный код 01011110 00000000 000000000 00000000; мы помним, что физически всё хранится «вывернутым наоборот», то есть здесь слева самый младший байт числа, а самый старший справа) следует трактовать как символ «^» с кодом 94, и следующие за ним три ноль-символа (ноль-символ, 255-символ и 32-символ, это пробел не имеют визуального изображения).

Функционально вызываемый макрос str$(число) возвращает адрес строки, в которую преобразуется число-аргумент. Например

Mov EDX, 1234

print "Вывод десятичного представления числа "

print str$(EDX),13,10

Два вызова printприходится писать потому, что указатель выводимой строки (второй вызов) по его спецификации должен быть только первым операндом. Из примера понятно, чтоstr$() формирует строку, которая показывает число в 10-чном формате.

Второй макрос – hex$() – формирует 16-ричное строковое представление числа. В остальном он аналогиченstr$().

Описанных макросов достаточно для ввода-вывода текстовых и целочисленных данных в учебных задачах нашего курса. Если вас интересуют другие макросы, читайте d:\MASM32\macros\macros.asmи d:\MASM32\help\hlhelp.chm.