использовать одну команду MOV c непосредственным шест. значением:
MOV DX,050CH ;Строка 5, столбец 12
ОЧИСТКА ЭКРАНА
________________________________________________________________
Запросы и команды остаются на экране пока не будут смещены в
результате прокручивания ("скроллинга") или переписаны на этом же месте
другими запросами или командами. Когда программа начинает cвое выполнение,
экран может быть очищен. Очищаемая область экрана может начинаться в любой
позиции и заканчиваться в любой другой позиции с большим номером.
Начальное значение строки и столбца заносится в регистр DX, значение 07 -
в регистр BH и 0600H в AX. В следующем примере выполняется очистка всего
экрана:
MOV AX,0600H ;AH 06 (прокрутка)
;AL 00 (весь экран)
MOV BH,07 ;Нормальный атрибут (черно/белый)
MOV CX,0000 ;Верхняя левая позиция
MOV DX,184FH ;Нижняя правая позиция
INT 10H ;Передача управления в BIOS
Значение 06 в регистре AH указывает команде INT 10H на выполнение
операции очистки экрана. Эта операция очищает экран пробелами; в следующей
главе скроллинг (прокрутка) будет рассмотрен подробнее. Если вы по ошибке
установили нижнюю правую позицию больше, чем шест. 184F, то очистка
перейдет вновь к началу экрана и вторично заполнит некоторые позиции
пробелами. Для монохромных экранов это не вызывает каких-либо
неприятностей, но для некоторых цветных мониторов могут возникнуть
серьезные ошибки.
ЭКРАННЫЕ И КЛАВИАТУРНЫЕ ОПЕРАЦИИ: БАЗОВАЯ ВЕРСИЯ DOS
________________________________________________________________
Обычно программы должны выдать на экран сообщение о завершении или об
обнаружении ошибки, отобразить запрос для ввода данных или для получения
указания пользователя. Рассмотрим сначала методы, применяемые в базовой
версии DOS, в последующих pазделах будут показаны расширенные методы,
введенные в DOS версии 2.0. Операции из базовой DOS работают во всех
версиях, хотя в руководстве по DOS рекомендуется применять расширенные
возможности для новых разработок. В базовой версии DOS команды вывода на
экран более сложны, но команды ввода с клавиатуры проще в использовании,
благодаря встроенным проверкам.
ВЫВОД НА ЭКРАН: БАЗОВАЯ ВЕРСИЯ DOS
________________________________________________________________
Вывод на экран в базовой версии DOS требует определения текстового
сообщения в области данных, установки в регистре AH значения 09 (вызов
функции DOS) и указания команды DOS INT 21H. В процессе выполнения
операции конец сообщения определяется по oграничителю ($), как это
показано ниже:
NAMPRMP DB 'Имя покупателя?','$'
.
.
MOV AH,09 ;Запрос вывода на экран
LEA DX,NAMPRMP ;Загрузка адреса сообщ.
INT 21H ;Вызов DOS
Знак ограничителя "$" можно кодировать непосредственно после cимвольной
строки (как показано в примере), внутри строки: 'Имя покупателя?$', или в
следующем операторе DB '$'. Используя данную операцию, нельзя вывести на
экран символ доллара "$". Кроме того, если знак доллара будет
отсутствовать в конце строки, то на экран будут выводиться все последующие
символы, пока знак "$" не встретиться в памяти.
Команда LEA загружает адрес области NAMPRMP в регистр DX для передачи
в DOS адреса выводимой информации. Адрес поля NAMPRMP, загружаемый в DX по
команде LEA, является oтносительным, поэтому для вычисления абсолютного
адреса данных DOS складывает значения регистров DS и DX (DS:DX).
ПРОГРАММА: ВЫВОД НА ЭКРАН НАБОРА СИМВОЛОВ КОДА ASCII
________________________________________________________________
Большинство из 256 кодов ASCII имеют символьное представление, и
могут быть выведены на экран. Шест. коды 00 и FF не имеют символов и
выводятся на экран в виде пробелов, хотя символ пробела имеет в ASCII
шест. код 20.
На рис.8.1 показана COM-программа, которая выводит на экран полный
набор символов кода ASCII. Программа вызывает три процедуры; B10CLR,
C10SET и D10DISP. Процедура B10CLR очищает экран, а процедура C10SET
устанавливает курсор в положение 00,00. Процедура D10DISP выводит
содержимое поля CTR, которое в начале инициализировано значением 00 и
затем yвеличивается на 1 при каждом выводе на экран, пока не достигнет
шест. значения FF.
__________________________________________________________________________
page 60,132
TITLE ALLASC (COM) Вывод на экран ASCII-символов 00-FF
CODESC SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:NOTHING
ORG 100H
BEGIN: JMP SHORT MAIN
CTR DB 00,'S'
; Основная процедура:
; ------------------
MAIN PROC NEAR
CALL B10CDR ;Очистить экран
CALL C10SET ;Установить курсор
CALL D10DISP ;Вывести символ на экран
RET
MAIN ENDP
; Очистка экрана:
; --------------
B10CLR PROC
MOV AX,0600H
MOV BH,07
MOV CX,0000 ;Левая верхняя позиция
MOV DX,184FH ;Правая нижняя позиция
INT 10H
RET
B10CLR ENDP
; Установка курсора в 00,00:
; -------------------------
C10SET PROC
MOV AN,02
MOV BN,00
MOV DX,0000
INT 10H
RET
C10SET ENDP
; Вывод на экран ASCII символов:
; -----------------------------
D10DISP PROC
MOV CX,256 ;256 итераций
LEA DX,CTR ;Адрес счетчика
D20
MOV AH,09 ;Функция вывода символа
INT 21H
INC CTR ;Увеличить счетчик
LOOP D20 ;Уменьшить CX,
; цикл, если не ноль
RET ;Вернуться
D10DISP ENDP
CODESG ENDS
END BEGIN
__________________________________________________________________________
Рис.8.1. Вывод на экран набора символов кода ASCII
Так как символ доллара не выводится на экран и кроме того коды от
шест.08 до шест.0D являются специальными управляющими cимволами, то это
приводит к перемещению курсора и другим управляющим воздействиям. Задание:
введите программу (рис.8.1), выполните ассемблирование, компоновку и
преобразование в COM-файл. Для запуска программы введите ее имя, например,
В:ASCII.COM.
Первая выведенная строка начинается с пробельного символа (шест.00),
двух "улыбающихся лиц" (шест.01 и 02) и трех карточных символов (шест.03,
04 и 05). Код 07 выдает звуковой сигнал. Код 06 должен отобразиться
карточным символом "пики", но управляющие символы от шест.08 до 0D сотрут
его. Код 0D является "возвратом каретки" и приводит к переходу на новую
(следующую)строку. Код шест.0E - представляется в виде музыкальной ноты.
Символы после шест.7F являются графическими.
Можно изменить программу для обхода управляющих символов. Ниже
приведен пример фрагмента программы, позволяющий обойти все символы между
шест.08 и 0D. Вы можете поэкспериментировать, oбходя только, скажем,
шест.08 (возврат на символ) и 0D (возврат каретки):
CMP CTR,08H ;Меньше чем 08?
JB D30 ; да - принять
CMP CTR,0DH ; Меньше/равно 0D?
JBE D40 ; да - обойти
D30:
MOV AH,40H ;Вывод символов < 08
... ; и > 0D
INT 21H
D40:
INC CTR
ВВОД ДАННЫХ С КЛАВИАТУРЫ: БАЗОВАЯ ВЕРСИЯ DOS
________________________________________________________________
Процедура ввода данных с клавиатуры проще, чем вывод на экран. Для
ввода, использующего базовую DOS, область ввода требует наличия cписка
параметров, содержащего поля, которые необходимы при выполнении команды
INT. Во-первых, должна быть определена максимальная длина вводимого
текста. Это необходимо для предупреждения пользователя звуковым сигналом,
если набран слишком длинный текст; символы, превышающие максимальную длину
не принимаются. Во-вторых, в списке параметров должно быть определенное
поле, куда команда возвращает действительную длину введенного текста в
байтах.
Ниже приведен пример, в котором определен список параметров для
области ввода. LABEL представляет собой директиву с атрибутом BYTE. Первый
байт содержит максимальную длину вводимых данных. Так как это однобайтовое
поле, то возможное максимальное значение его - шест.FF или 255. Второй
байт необходим DOS для занесения в него действительного числа введенных
символов. Третьим байтом начинается поле, которое будет содержать
введенные символы.
NAMEPAR LABEL BYTE ;Список параметров:
MAXLEN DB 20 ; Максимальная длина
ACTLEN DB ? ; Реальная длина
NAMEFLD DB 20 DUP (' ') ; Введенные символы
Так как в списке параметров директива LABEL не занимает места, то
NAMEPAR и MAXLEN указывают на один и тот же aдрес памяти. В трансляторе
MASM для определения списка параметров в виде структуры может
использоваться также директива STRUC. Однако, в связи с тем, что ссылки на
имена, определенные внутри, требуют специальной адресации, воздержимся
cейчас от рассмотрения данной темы до гл.24 "Директивы ассемблера".
Для запроса на ввод необходимо поместить в регистр AH номер функции -
10 (шест. 0AH), загрузить адрес списка параметров (NAMEPAR в нашем
примере) в регистр DX и выполнить INT 21H:
MOV AH,0AH ;Запрос функции ввода
LEA DX,NAMEPAR ;Загрузить адреса списка параметров
INT 21H ;Вызвать DOS
Команда INT ожидает пока пользователь не введет с клавиатуры текст,
проверяя при этом, чтобы число введенных cимволов не превышало
максимального значения, указанного в списке параметров (20 в нашем
примере). Для указания конца ввода пользователь нажимает клавишу Return.
Код этой клавиши (шест. 0D) также заносится в поле ввода (NAMEFLD в нашем
примере). Если, например, пользователь ввел имя BROWN (Return), то cписок
параметров будет содержать информацию:
дес.: |20| 5| В| R| O| W| N| #| | | | | ...
шест.: |14|05|42|52|4F|57|4E|0D|20|20|20|20| ...
Во второй байт списка параметров (ACTLEN в нашем примере) команда
заносит длину введенного имени - 05. Код Return находится по адресу
NAMEFLD +5. Символ # использован здесь для индикации конца данных, так как
шест. 0D не имеет отображаемого символа. Поскольку максимальная длина в 20
символов включает шест.0D, то действительная длина вводимого текста может
быть только 19 символов.
ПРОГРАММА: ВВОД И ВЫВОД ИМЕН
________________________________________________________________
EXE-программа, приведенная на рис. 8.2, запрашивает ввод имени, затем
отображает в середине экрана введенное имя и включает звуковой сигнал.
Программа продолжает запрашивать и отображать имена, пока пользователь не
нажмет Return в ответ на очередной запрос. Рассмотрим ситуацию, когда
пользователь ввел имя TED SMITH: