Ввод-вывод с пульта управления

В качестве примера наиболее простой программы, реализуемой с помощью команд микропроцессора, рассмотрим программу вызова функции ОС (MS-DOS) по команде прерывания и отображения одного символа на экране дисплея персонального компьютера. Программа вывода на дисплей символа, например *, показана на рис. 1.

Рис. 1. Программа вывода одного символа на экран дисплея.

Она состоит из трех строк, расположенных между строками, предназначенными для комментариев и заполненными пунктиром.

Символ, который будет отображен на дисплее, заключен в кавычки; его код формируется в регистре DL.

Затем в регистр АН записывается число 2, являющееся кодом функции MSDOS и, когда по команде int 21h производится прерывание с передачей управления в ОС, функция MSDOS с кодом 2 выводит на экране содержимое регистра DL. Таким образом, как видно из примера, при использовании функции ОС не возникает необходимость непосредственно использовать команды ввода-вывода.

Недостатком такого способа ввода является то, что повторная передача управления операционной системе после окончания выполнения программы обработки прерывания несколько громоздка. Для инициирования такой передачи необходимо заново "запустить" программу на выполнение. Что бы этого избежать - "зациклить" выполнение кодов программы - например так:

Рис. 2. Программа, обеспечивающая вывод одного символа на экран дисплея и
ожидание ввода с клавиатуры (программа прекращает свое выполнение после поступления сигнала «CTRL-С»).

Приведенная выше программа с точки "зрения" Операционной Системы (ОС) "написана" ошибочно. В этой программе не предусмотрены так называемые стандартные соглашения о связи подпрограмм.
С точки "зрения" ОС любая пользовательская программа может быть рассмотрена как подпрограмма ОС. Это означает, что пользовательская программа вызывается ОС и при завершении работы пользовательская программа должна передать управление так же ОС. Для выполнения этих действий пользователь-программист обязан в своей программе выполнить ряд жестко оговоренных действий (написать ряд машинных команд), которые и организуют "стандартные соглашения о связи".

Перед передачей управления ОС MS-DOS два байта содержимого регистра дополнительного сегмента ES (или регистра сегмента данных DS) должны загружаться в системный стек в качестве базового адреса дополнительного сегмента, а 0 — в качестве смещения, и возврат должен осуществляться в позицию, указываемую этим 4-байтным адресом. Для выполнения указанных пересылок в программе, представленной на рис. 1, предусмотрены три команды push, mov, push. Необходимость в этих командах будет объяснено позднее, а в данном случае их использование можно считать стереотипным приемом. После команды ргос устанавливается указатель far.

На рис. 2 показана еще одна программа, которая используется для передачи управления к ОС после выполнения подпрограммы вывода одного символа на экран дисплея. Эта программа может с успехом заменить подпрограмму ргос— endp на рис. 1. После вывода символа на дисплей и вызова функции MS-DOS с кодом 1 процессор переходит в состояние ожидания ввода с клавиатуры. В этом случае, как уже было сказано, возвращение управления в MS-DOS осуществляется при вводе сигнала CTRL-С.

Рис. 3. Использование подпрограммы.

На рис. 3 и 5 представлены программы, которые состоят из подпрограмм отображения символа на экране дисплея и ввода с клавиатуры. В данном случае нет необходимости детально представлять себе, как осуществляются отображение и ввод в отдельности, достаточно сформировать код символа в регистре DL и включить в программу команду call display. На этом примере можно продемонстрировать эффективность составления программы в виде совокупности подпрограмм: подпрограмма display записана только один раз, а обращений к ней может быть сколько угодно (в данном случае их три). Запись программы в виде совокупности подпрограмм — это первое условие для написания хорошей программы.

Дополнительное замечание:

Запись программы в виде совокупности подпрограмм имеет еще одно преимущество (см. рис. 4, а), а именно подпрограммы display и kbin можно предварительно откомпилировать и записать в специальный файл (например, mylib.lib), а вместо них в программу включит только две строки:

extrn display : near extrn kbin: near

Рис. 4, Использование внешних подпрограмм:
а — использование программы из специального файла;
б — содержимое библиотечного файла.

Две указанные выше подпрограммы находятся во внешнем (external) файле. В подпрограммы display и kbin можно вносить какие угодно изменения, при этом в текст основной программы никаких изменений вносить не надо.

Специальный файл (mylib.asm а затем mylib.lib) записывается, как показано на рис. 4, б. В файле одна за другой располагаются две подпрограммы (display и kbin); в начале программы должен быть поставлен указатель

public display, kbin

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

В случаях, аналогичных приведенному примеру, специальный файл транслируется, например, по команде

tasm mylib;

Результатом трансляции является объектный файл mylib.obj, который включается в библиотечный файл и может использоваться другими программами.

Ниже можно видеть примеры команд ОС, по которым осуществляется трансляция, связь и выполнение программы:

tasm displ;

tlink displ mylib;

displ

В данной лабораторной работе следовать этой методике и создавать библиотеку не надо (см. лаб. раб. № 3). Для выполнения выше описанного примера поместите текст подпрограмм в файл в сегмент кода, содержащий исходный тест главной программы.

Представление символов в ASCII

С помощью программ, обсуждавшихся выше, можно осуществлять вывод на дисплей только специальных символов типа * или abc, здесь же будут рассмотрены программы для вывода на дисплей любых символов. Все символы при использовании их в качестве данных заключаются в кавычки, подобно тому как это сделано в приведенном выше примере '*'. Символы закодированы двоичными восьмиразрядными числами, представляющими собой значения кода ASCII (Стандартный американский код для обмена информацией). Набор символов, представляемых в коде ASCII, включает 94 символа (буквы английского алфавита, цифры, специальные знаки и символы), выражаемые в шестнадцатеричной системе счисления числами, начиная с 21h (числа до 21 используются для представления специальных операций).

На рис, 5 приведена программа вывода на дисплей всех 94 символов.

code segment 'CODE' PUBLIC
assume cs:code
main proc far
push ds
mov ax,0
push ax
;================================
mov cx,94 ; сколько раз повторить цикл
mov dl,21h ; c какого кода начинать
next:
call display ; вызвать подпрограмму вывода символа
inc dl ; увеличить значение dl на единицу
loop next ; вычесть из сх единицу и если сх больше нуля, перейти к next
;=================================
ret
main endp
;---------------
display proc
push ax
mov ah,2
int 21h
pop ax
ret
display endp
code ends
end main

Рис. 5. Программа вывода на экран дисплея символов, представляемых в ASCII.

Алгоритм работы этой программы следующий.

1. Сформировать в регистре СХ значение числа повторений (т. е. 94).

2. Сформировать в регистре DL код символа '!', представляемый в шестнадцатеричной системе счисления как 21h.
h в выражении 21h указывает на то, что число является шестнадцатеричным. Вместо записи 21h можно использовать запись '!'.

3. Вывести на экран дисплея содержимое регистра DL.

4. Увеличить содержимое регистра DL на 1.

5. Уменьшить содержимое регистра СХ на 1, и, если результат не равен нулю, перейти к next. Если результат равен нулю, перейти к следующему шагу.

6. Передать управление ОС.

В этой программе на шагах 3 и 6, так же как и в случаях, рассмотренных выше, в подпрограмме display с помощью команды int (прерывания) предусмотрен вызов функций MS-DOS. Код требуемой функции формируется в регистре АН. Данные, которые надлежит вывести, предварительно заносятся, например, в регистр DL. Прерывание производится по команде int21h. Основные функции MS-DOS, реализуемые по команде int можно посмотреть в справочных файлах и в программах типа HELP.