Практическая работа №5
Тема: Программирование переходов. Программирование ввода-вывода.
Цель: формирование практических навыков использования команд прерываний в программах с операциями ввода-вывода.
Время выполнения: 2 часа.
Теоретические сведения
Операции ввода/вывода по прерыванию INT 21H
АН = 01: Ввод с клавиатуры с эхоотображением. Данная функция возвращает значение в регистре AL, Если содержимое AL не равно нулю, то оно представляет собой стандартный ASCII-символ, например букву или цифру. Нулевое значение в регистре AL свидетельствует о том, что на клавиатуре была нажата специальная клавиша, напримерHome,F1 или PgUp. Для определения скэн-кода клавиш необходимо повторить вызов функции. Данная функция реагирует на запрос Ctrl/break.
АН = 02: Вывод символа. Для ввода символа на экран в текущую позицию курсора необходимо поместить код данного символа в регистр DL. Коды табуляции, возврата каретки и перевода строки действуют обычным образом.
АН = 06: Ввод/вывод данных. Может использоваться как для ввода, так и для вывода. Для вывода занесите в DL выводимый символ (но не FFH!) и прерывание 21Н. Для ввода в DL занесите FFH, выполните прерывание 21Н. Программа при этом не останавливается, продолжает выполняться. При нажатии клавишы символ вводится в AL.
АН = 07: Прямой ввод с клавиатуры без эхоотображения. Данная функция работает аналогично функции 01 с двумя отличиями: введенный символ не отображается на экране, т.е. нет эха, и отсутствует реакция на запрос Ctrl/Break.
АН = 08: Ввод с клавиатуры без эхоотображения. Данная функция действует аналогично функции 01 с одним отличием: введенный символ не отображается на экране, т.е. нет эха.
АН = 09: Вывод строки символов. Выводимая строка должна заканчиваться знаком доллара $. Адрес начала строки должен быть помещен в DX. Знак доллара не выводится.
Например:
String DB “Введите символ$” ;Строка для вывода
Mov dx, offset string ;Смещение строки в регистр
DX Mov ah, 9 ; ;Выполняем функцию вывода строки
Int 21h ;Прерываемся для вывода строки
AH=0AH: Ввод данных в буфер: Определяется максимальная длина вводимого текста. Это необходимо для предупреждения пользователя звуковым сигналом, если набран слишком длинный текст; символы, превышающие максимальную длину, не принимаются. Во второй байт буфера команда возвращает действительную длину введенного текста в байтах. Адрес буфера помещается в региcтр DX.
Ниже приведен пример, в котором определен список параметров для области ввода. Первый байт содержит максимальную длину вводимых данных. Так как это однобайтовое поле, то возможное максимальное значение его - шестнадцатеричное FF или 255. Второй байт необходим DOS для занесения в него действительного числа введенных символов. Третьим байтом начинается поле, которое будет содержать введенные символы.
MAXLEN DB 20 ; максимальная длина
ACTLEN DB ? ; реальная длина
NAMEFLD DB 20 DUP (' ') введенные символы
Для запроса на ввод необходимо поместить в регистр АН номер функции - 10 (0АН), загрузить адрес списка параметров (MAXLEN в нашем примере) в регистр DX и выполнить INT 21H:
MOV AH,0AH ; запрос функции ввода
LEA DX,MAXLEN ; загрузить адрес буфера в DX
INT 21H ; вызвать системную программу DOS
Команда INT ожидает, пока пользователь не введет с клавиатуры текст, проверяя при этом, чтобы число введенных символов не превышало максимального значения, указанного в списке параметров (20 в нашем примере). Для указания конца ввода пользователь нажимает клавишу Return. Код этой клавиши (0D) также заносится в поле ввода (NAMEFLD в нашем примере). Если, например, пользователь ввел имя BROWN (Return), то список параметров будет содержать информацию:
Десятичные и символьные: 20 5 B R O W N #
Шестнадцатеричные: 14 05 42 52 4F 57 4E OD 20 ...
Во второй байт списка параметров (ACTLEN в нашем примере) команда заносит длину введенного имени - 05. Код Return находится по адресу NAMEFLD +5. Символ # использован здесь для индикации конца данных, так как 0DH не имеет отображаемого символа. Поскольку максимальная длина в 20 символов включает 0DH, то действительная длина вводимого текста может быть только 19 символов.
АН = 0ВH: Проверка состояния клавиатуры. Данная функция возвращает шестнадцатеричное значение FF в регистре AL, если ввод с клавиатуры возможен, в противном случае - 00. это средство связано с функциями 01,07,.08, которые не ожидают ввода с клавиатуры.
ВВОД/ВЫВОД ПО ПРЕРЫВАНИЮ INT 10H
AH=0: Установка режима дисплея. В AL указывается номер режима.
AL=0: Текстовый черно-белый 40х25.
AL=1: Текстовый цветной 40х25
AL=2: Текстовый черно-белый 80х25
AL=3: Текстовый цветной 80х25
AL=4: Графический цветной 320х200
Например, установить цветной графический режим:
MOV AH,0
MOV AL,4
INT 10H
AH=6: Очистка окна (скроллинг вверх)
MOV AH,6 ;задаем процедуру скроллинга вверх
MOV AL,0 ;очищаем все окно
MOV BH,7 ;байт атрибутов для заполнения
MOV CH,3 ;строка верхнего левого угла
MOV CL,4 ;столбец верхнего левого угла
MOV DH,13 ;строка нижнего правого угла
MOV DL,15 ;столбец нижнего правого угла
INT 10H
AH=2: Установка курсора в заданную позицию.
MOV AH,2 ;устанавливаем номер функции
MOV BH,0 ;номер активной страницы
MOV DH,13 ;строка установки курсора
MOV DL,20 ;столбец установки курсора
INT 10H ;позиционируем курсор
AH=9: Вывод символа с атрибутами на экран
Например:
; ---вывод символа в негативе
MOV AH,9 ;задаем функцию записи с атрибутами
MOV AL,CHAR ;символ в AL
MOV BL,112 ;атрибуты в BL
MOV AH,6 ;задаем процедуру скроллинга вверх
MOV BH,0 ;активная страница
MOV CX,1 ;вывести один раз
INT 10H
AH=0AH: Вывод символа без атрибутов на экран
AH=0EH: Вывод символа на экран с перемещением курсора
ВВОД С КЛАВИАТУРЫ ПО КОМАНДЕ BIOS INT 16H
Команда BIOS INT 16H выполняет специальную операцию, которая в соответствии с кодом в регистре АН обеспечивает следующие три функции ввода с клавиатуры.
АН = 00: Чтение символа. Данная функция помещает в регистр AL очередной ASCII-символ, введенный с клавиатуры, и устанавливает скэн-код в регистре АН. Если на клавиатуре нажата одна из специальных клавиш, например, Home или F1, то в регистр AL заносится ОО. Автоматическое эхо символа на экран не происходит.
АН = 01: Определение наличия введенного символа. Данная функция сбрасывает флаг нуля (ZF=0), если имеется символ для чтения с клавиатуры; очередной символ и скэн-код будут помещены в регистры AL и АН соответственно и данный элемент останется в буфере.
АН = 02: Определение текущего состояния клавиатуры. Данная функция возвращает в регистре AL состояние клавиатуры из адреса памяти 417Н:\
Бит:
7 Состояние вставки активно (Ins)
6 Состояние фиксации верхнего регистра (Caps Lock) включено
5 Состояние фиксации цифровой клавиатуры (Num Lock) включено
4 Состояние фиксации прокрутки (Scroll Lock) включено
3 Нажата комбинация клавиш Alt/Shft
2 Нажата комбинация клавиш Ctrl/Shft
1 Нажата левая клавиша Shift
0 Нажата правая клавиша Shift
Задания к практической работе
Задание 1. Запускаем Emu8086 и создаём новый файл через меню FILE – NEW – COM TEMPLATE (Файл – Новый – Шаблон файла COM). В редакторе исходного кода после этого мы увидим следующее:
Рисунок 1 - Создание нового файла в Emu8086
Здесь надо отметить, что программы, создаваемые с помощью Ассемблеров для компьютеров под управлением Windows, бывают двух типов: COM и EXE. Первое время мы будем создавать исполняемые файлы с расширением COM, так как они более простые.
После создания файла в Emu8086 описанным выше способом в редакторе исходного кода вы увидите строку «add your code hear» - «добавьте ваш код здесь» (рис. 1). Эту строку мы удаляем и вставляем вместо неё следующий текст:
Таким образом, полный текст программы будет выглядеть так:
Кроме этого в верхней части ещё имеются комментарии (на рис. 1. – это текст зелёного цвета). Комментарий в языке Ассемблера начинается с символа ; (точка с запятой) и продолжается до конца строки.
Также отметим, что регистр символов в языке ассемблера роли не играет. Вы можете написать RET, ret или Ret – это будет одна и та же команда.
Вы можете сохранить этот файл куда-нибудь на диск. Но можете и не сохранять. Чтобы выполнить программу, нажмите кнопку EMULATE (с зелёным треугольником) или клавишу F5. Откроется два окна: окно эмулятора и окно исходного кода (рис.2).
Рисунок 2 - Окно эмулятора Emu8086
В окне эмулятора отображаются регистры и находятся кнопки управления программой. В окне исходного кода отображается исходный текст вашей программы, где подсвечивается строка, которая выполняется в данный момент. Всё это очень удобно для изучения и отладки программ.
В окне эмулятора вы можете запустить вашу программу на выполнение целиком (кнопка RUN) либо в пошаговом режиме (кнопка SINGLE STEP). Пошаговый режим удобен для отладки. Ну а мы сейчас запустим программу на выполнение кнопкой RUN. После этого (если вы не сделали ошибок в тексте программы) вы увидите сообщение о завершении программы (рис. 3). Здесь вам сообщают о том, что программа передала управление операционной системе, то есть программа была успешно завершена. Нажмите кнопку ОК в этом окне и вы увидите, наконец, результат работы вашей первой программы на языке ассемблера (рис. 4).
Рисунок 3 - Сообщение о завершении программы.
Рисунок 4 - Ваша первая программа выполнена.
Как мы уже говорили, наша первая программа выводит на экран английскую букву «А». Результат оправдал наши ожидания – буква «А» выведена на экран.
Задание 2. Набрать каждый пример из теоретической части.
Задание 3. Составьте программу считывающую с клавиатуры 2 числа и выводящую на экран их сумму
Контрольные вопросы и задания
1. Что такое прерывание?
2. Что делает команда INT 21H, INT 10H, INT 16H?
3. Как задается функция для выполнения прерывания?
4. Куда вводятся символы при нажатии клавиши?
5. Что надо выполнить для вывода символа?
6. Что надо выполнить для ввода символа?
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.