Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 171

Unknown Author

Backspace    - отмена последнего символа

Esc    - отмена всего набранного текста

Буфер, начальный адрес которого задается в регистрах DS и DX (это не буфер ОС, а буфер программы), должен иметь следующую структуру:

I max

п

si

s2

...    | sn

I CR

... 1 1

0

1

2

3

n+1

n+2

max+1

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

Число (п) реально введенных символов записывается функцией в байт буфера с индексом 1, а сами символы - начиная с позиции, имеющей индекс 2. В (п+2)-ю позицию буфера записывается ’’конец строки” CR (код 13), соответствующий клавише Enter, однако в числе п он не учитывается.

Пример:

BUF DB 10, ?, 10 DUP(' ')    ;в сегменте данных

LEA DX,BUF MOV АН,0Ah INT 21h

Если при вводе были набраны символы АВС, то содержимое буфера BUF будет следующим:

BUF[0]=10, BUF[1]=3, BUF[2]=41h (код A), BUF[3]=42h, BUF[4]=43h, BUF[5]=13 (CR), остальные байты не изменятся

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

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

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

13J.1. Схема хранения и подключения операций ввода-вывода

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

IO.ASM

P.ASM

-»P.OBJ—»| LINK | —* Р.ЕХЕ IOPROC.OBJ f

процедуры

ii~|'

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