- •Введение
- •1. Особенности персонального компьютера
- •1.1. Оперативная память
- •1.2. Регистры
- •1.3. Представление данных
- •1.4. Представление команд
- •2. Язык ассемблера. Начальные сведения
- •2.1. Лексемы
- •2.2. Предложения
- •2.3. Директивы определения данных
- •2.4. Директивы эквивалентности и присваивания
- •2.5. Выражения
- •3. Пересылки. Арифметические команды
- •3.1. Обозначения операторов команд
- •3.2. Команды пересылки
- •3.3. Команды сложения и вычитания
- •3.4. Команды умножения и деления
- •3.5. Изменение размера числа
- •3.6. Примеры
- •3.7. Лабораторная работа № 1
- •4. Переходы. Циклы
- •4.1. Безусловный переход
- •4.2. Команды сравнения и условного перехода
- •4.3. Команды управления циклом
- •4.4. Вспомогательные операции ввода-вывода
- •4.5. Массивы
- •4.6. Лабораторная работа № 2
- •5. Программные сегменты
- •5.1. Сегментирование адресов в пк
- •5.2. Программные сегменты
- •5.3. Начальная загрузка сегментных регистров
- •5.4. Структура программы
- •6. Стек
- •6.1. Стек и сегмент стека
- •6.2. Стековые команды
- •6.3. Приемы работы со стеком
- •7. Процедуры
- •7.1. Дальние переходы
- •7.2. Подпрограммы-процедуры
- •7.3. Передача параметров через регистры
- •7.4. Передача параметров через стек
- •7.5. Локальные данные процедур
- •7.6. Лабораторная работа № 3
- •8. Ввод и вывод данных
- •8.1. Реализация основных операций ввода-вывода
- •8.2. Операции ввода-вывода
- •8.3. Пример структуры программы
- •Заключение
- •Библиографический список
- •Оглавление
- •Учебное издание
- •394026 Воронеж, Московский просп., 14
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