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

4.4. Вспомогательные операции ввода-вывода

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

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

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

OUTINT WORD PTR Х,7

надо писать:

OUTINT <WORD PTR X>,7

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

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

FINISH

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

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

Ввод данных с клавиатуры реализован с использованием промежуточного буфера ввода (специальной области памяти): все набираемые на клавиатуре символы сначала попадают в этот буфер (после нажатия на клавиатуре клавиши Enter), и уже отсюда они затем будут считываться командами ввода. Это означает, что можно досрочно ввести мною данных, и они не пропадут. Например, если в программе осуществляется ввод по одному символу, то все равно можно сразу набрать много символов - затем они будут считываться по одному. Кроме того, при вводе (пока не нажата клавиша Enter) допускается редактирование вводимого текста: при нажатии клавиши "стречка плево" или Backspace уничтожается последний набранный символ, а при нажатии клавиши Esc уничтожается весь набранный текст.

Отметим также, что команды ввода не выдают на экран никакого приглашения к вводу, поэтому сама программа выдавать символы приглашения (например, символ >).

Теперь перечислим команды ввода.

ввод символа: INCH op

Допустимые типы операнда: r8, m8.

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

ввод числа: ININT op

Допустимые типы операнда: r16, m16.

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

Отметим, что введенное число всегда записывается в регистр или ячейку размером в слово, но не байт. Поэтому, например, команда ININT АХ допустима, а команда ININT АН - нет.

Очистка буфера ввода: FLUSH

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

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

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

Переход на новую строку: NEWLINE

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

Вывод символа: OUTCH ор

Допустимые типы операнда: i8, r8, m8.

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

Вывод строки: OUTSTR

Как видно, в этой команде не указывается операнд, но он есть, его местонахождение фиксировано: в регистре DX должен находиться начальный адрес вы­водимой строки. Кроме того, сама строка должна оканчиваться символом '$', по которому и определяется ее конец. По OUTSTR выводятся все символы строки, начиная с указанного адреса и до первого знака S, который уже не выводится.

Пример:

S DB 'Hello', '$'

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

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

OUTSTR ; вывод: Hello

Вывод числа со знаком: ODTINT op1 [,ор2]

Вывод числа без знака: OUTWORD op1 [,op2]

Допустимые типы операндов: op1: i16, г16, m16; op2: i8, r8, m8.

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

OUTINT 0FFFFh ; вывод -1

OUTWORD 0FFFFh ; вывод 65535

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

Например, по командам

OUTCH '*'

OUTINT 12

OUTWORD 345,6

OUTINT -67

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

* 1 2_ _ _ 3 4 5 – 6 7