Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000239.doc
Скачиваний:
23
Добавлен:
30.04.2022
Размер:
1.12 Mб
Скачать

8. Ввод и вывод данных

8.1. Реализация основных операций ввода-вывода

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

В данном случае, рекомендуется использовать пакет операций, который хранится в модулях IO.ASM и IOPROC.ASM. Последний модуль должен быть заранее оттранслирован и виде объектного модуля записан в файл с именем IOPROC.OBJ.

Схема подключения операций ввода-вывода (ВВ) к программам приведена на рис. 40.

Рис. 40. Подключение к программе модулей

с операциями ввода-вывода

Данный способ трансляции и компиляции программы можно реализовать с помощью следующего командного файла:

MASM PR.ASM, PR.OBJ

LINK PR.OBJ+IOPROC.OBJ, PR.EXE

PAUSE

В текст программы следует включить директиву INCLUDE IO.ASM, чтобы можно было использовать операции ввода-вывода.

Для выполнения программы следует создать командный файл, содержащий текст следующего вида:

PR.EXE

PAUSE

8.2. Операции ввода-вывода

Ввод с клавиатуры

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

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

Ввод символа осуществляется с помощью следующей команды:

INCH op

Допустимые типы операнда: регистр 1 байт, переменная размером 1 байт (байт памяти).

По этой команде вводится очередной символ и его код записывается в байтовый регистр или байт памяти.

Ввод числа осуществляется с помощью команды:

ININT op

Допустимые типы операнда: регистр (слово), переменная размером слово (2 байта).

По данной команде можно вводить число как со знаком, так и без знака. Вводимое число должно быть записано в десятичной системе. Если перед числом есть пробелы, то они игнорируются. Если число набрано без знака или со знаком «плюс», то оно вводится как число без знака и может иметь величину от 0 до 216-1. Если же перед числом указан знак «минус», то оно должно вводится как отрицательное число и должно иметь величину от -215 до -1. Концом числа считается любой символ, отличный от цифры. Если величина числа находится вне указанных границ или оно задано неправильно, то фиксируется ошибка и программа прекращает свою работу.

Введенное число всегда записывается в регистр или ячейку размером в слово, но не в байт. Поэтому, например, команда ININT AX допустима, а команда ININT AH – нет.

Очистка буфера ввода осуществляется командой

FLUSH

При использовании этой команды все, что было набрано на клавиатуре, уничтожается.

Вывод на экран

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

Переход на новую строку осуществляется с помощью команды

NEWLINE

Это аналог пустой процедуры WriteLn языка Паскаль: по этой команде курсор перемещается на начало следующей строки экрана.

Вывод символа на экран осуществляется с помощью процедуры

OUTCH op

Допустимые типы операнда: непосредственный операнд (константа) размером 1 байт; регистр 1 байт; переменная размером 1 байт (байт памяти).

Вывод строки осуществляется по команде

OUTSTR

В этой команде не указывается операнд. Его местонахождение определяется заранее – в регистре DX должен находиться начальный адрес выводимой строки. Сама строка должна заканчиваться символом ‘$’, по которому определяется ее конец. При вызове команды OUTSTR выводятся все символы строки, начиная с указанного адреса и до первого знака $, который уже не выводится.

Пример:

S DB ‘Hello’, ‘$’

AS DW S ;начальный адрес строки S

MOV DX, AS ;DX:=адрес S

OUTSTR ;вывод: Hello

Можно упростить данный программный код воспользовавшись оператором LEA.

S DB ‘Hello’, ‘$’

LEA DX, S ;DX:=адрес S

OUTSTR ;вывод: Hello

Ввод числа со знаком осуществляется с помощью команды

OUTINT op1 [, op2]

Вывод числа без знака

OUTWORD op1, [,op2]

Допустимые типы первого операнда: непосредственный операнд размером слово; регистр размером слово; переменная размером слово.

Допустимые типы второго операнда: непосредственный операнд размером 1 байт; регистр размером 1 байт; переменная размером 1 байт.

Обе команды эти команды действуют аналогично – выводят в десятичном виде число, заданное первым операндом и имеющее размер слова, только команда OUTINT трактует его как знаковое число, а команда OUTWORD – как беззнаковое. Например:

OUTINT 0FFFFh ;вывод -1

OUTWORD 0FFFFh ;вывод 65535

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

Например, по последовательности команд

OUTCH ‘*’

OUTINT 12

OUTWORD 345, 6

OUTINT -67

будет выдана следующая строка (для наглядности пробелы заменены знаками подчеркивания:

*12___345-67

Останов программы

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

FINISH

Эта команда должна обязательно быть исполнена, иначе программа не остановится.