Сист. прогр. Ч1 (1085770), страница 11
Текст из файла (страница 11)
При использовании команды LOOP инициализируйте регистр СХ положительным числом. Команда LOOP контролирует только нулевое значение, при отрицательном программа будет продолжаться циклически.
Если некоторая команда устанавливает флаг, то данный флаг
сохраняет это значение, пока другая команда его не изменит.
Например, если за арифметической командой, которая
устанавливает флаги, следуют команды MOV, то они не
изменят флаги. Однако для минимизации числа возможных
ошибок следует кодировать команды условного перехода
непосредственно после команд, устанавливающих
проверяемые флаги.
Выбирайте команды условного перехода соответственно операциям над знаковыми или беззнаковыми данными.
Для вызова процедуры используйте команду CALL, а для возврата из процедуры - команду RET. Вызываемая процедура может в свою очередь вызвать другую процедуру, и если следовать существующим соглашениям, то команда RET всегда будет выбирать из стека правильный адрес возврата. Единственные примеры в этой книге, где используется переход в процедуру вместо ее вызова, - в начале СОМ-программ.
Будьте внимательны при использовании индексных операндов. Сравните:
MOV AX,SI
mov ах,[SI]
Первая команду MOV пересылает в регистр АХ содержимое регистра SI. Вторая команда MOV для доступа к пересылаемому слову в памяти использует относительный адрес в регистре SI.
Используйте команды сдвига для удваивания значений и деления пополам, но при этом внимательно выбирайте соответствующие команды для знаковых и беззнаковых данных.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
Какое максимальное количество байтов могут обойти команды короткий JMP, LOOP и относительный переход? Какой машинный код операнда при этом генерируется?
Команда JMP начинается на 0624Н. Определите адрес перехода, если шестнадцатеричный объектный код для операнда команды JMP: а) 27, б) 6В, в) Сб.
Напишите программу для вычисления 12 чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13,... (каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду LOOP. Выполните ассемблирование, компоновку и с помощью отладчика DEBUG трассировку программы.
Предположим, что регистры АХ и ВХ содержат знаковые данные, а СХ и DX - беззнаковые. Определите команды СМР (где необходимо) и команды безусловного перехода для следующих проверок:
а) значение в DX больше, чем в СХ?
б) значение в ВХ больше, чем в АХ?
в) СХ содержит нуль?
г) было ли переполнение?
д) значение в ВХ равно или меньше, чем в АХ?
е) значение в DX равно или меньше, чем в СХ?
На какие флаги воздействуют следующие события и какое значение этих флагов?
а) произошло переполнение;
б) результат отрицательный;
в) результат нулевой;
г) обработка в одношаговом режиме;
д) передача данных должна быть справа налево.
Что произойдет при выполнении программы, приведенной на рис.7.4, если в процедуре BEGIN будет отсутствовать команда RET?
Какая разница между кодированием в директиве PROC операнда с типом FAR и с типом NEAR?
Каким образом может программа начать выполнение процедуры?
В ЕХЕ-программе процедура А10 вызывает В10, В10 вызывает С10, а С10 вызывает D10. Сколько адресов, кроме начальных адресов возврата в DOS, содержит стек?
Предположим, что регистр BL содержит 11100011 и поле по имени BOONO содержит 01111001. Определите воздействие на регистр BL для следующих команд: a) XOR BL,BOONO; б) AND BL,BOONO; в) OR BL,BOONO; г) XOR ВL,1111111В; д) AND BL,00000000B;
Измените программу на рис.7.6 для: а) определения
содержимого TITLEX заглавными буквами; б)
преобразования заглавных букв в строчные.
Предположим, что регистр DX содержит 10111001 10111001, а регистр CL - 03. Определите содержимое регистра DX после следующих несвязанных команд: a) SHR DX,1; б) SHR DX,CL; в) SHL DX,CL; г) SHL DL,1; д) ROR DX,CL; e) ROR DL,CL; ж) SAL DH,1.
8. ПРЕРЫВАНИЯ
В предыдущих главах рассматривались программы, в которых данные определялись в операндах команд (непосредственные данные) или инициализировались в конкретных полях программы. Число практических применений таких программ в действительности мало. Большинство программ требуют ввода данных с клавиатуры, диска или модема и обеспечивают вывод данных в удобном формате на экран, принтер или диск. Данные, предназначенные для вывода на экран и ввода с клавиатуры, имеют ASCII-формат.
Для выполнения ввода и вывода используется команда INT (прерывание). Существуют разнообразные способы указать системе, какое действие (ввод или вывод) и на каком устройстве необходимо выполнить. Данная глава раскрывает основные требования для вывода информации на экран и ввода данных с клавиатуры.
Все необходимые экранные и клавиатурные операции можно выполнить с помощью команды INT 10Н, которая передает управление непосредственно в BIOS. Для выполнения некоторых более сложных операций существует прерывание более высокого уровня INT 21Н, которое сначала передает управление в DOS. Например, при вводе с клавиатуры может потребоваться подсчет введенных символов, проверка на максимальное число символов и проверка на символ "Return". Прерывание DOS INT 21Н осуществляет многие из этих дополнительных вычислений и затем автоматически передает управление в BIOS.
Материал данной главы подходит как для монохромных (черно-белых, BW), так и для цветных видеомониторов.
КОМАНДА ПРЕРЫВАНИЯ INT
Команда INT прерывает обработку программы, передает
управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу для продолжения обработки. Наиболее часто прерывание используется для выполнения операции ввода или вывода. Для выхода из программы на обработку прерывания и для последующего возврата команда INT выполняет следующее:
- уменьшает указатель стека на 2 и заносит в вершину стека содержимое флагового регистра;
- очищает флаги TF и IF;
- уменьшает указатель стека на 2 и заносит содержимое
регистра CS в стек;
- уменьшает указатель стека на 2 и заносит в стек значение
командного указателя;
- обеспечивает выполнение необходимых действий;
- восстанавливает из стека значения регистров и возвращает управление в прерванную программу на команду, следующую после INT.
Этот процесс полностью автоматический. Необходимо лишь определить сегмент стека достаточно большим для записи в него значений регистров.
В данной главе рассмотрим два типа прерываний: команду BIOS INT 10Н и команду DOS INT 21Н для вывода на экран и ввода с клавиатуры, В последующих примерах в зависимости от требований используются как INT 10Н, так и INT 21Н.
УСТАНОВКА КУРСОРА
Экран можно представить в виде двумерного, пространства с адресуемыми позициями, в любую из которых может быть установлен курсор. Обычный видеомонитор, например, имеет 25 строк (нумеруемых от 0 до 24) и 80 столбцов (нумеруемых от 0 до 79).
Команда INT 10Н включает в себя установку курсора в любую позицию и очистку экрана. Ниже приведен пример установки курсора на 5-ю строку и 12-й столбец.
MOV АН,02 ;3anpoc на установку курсора
MOV BH,00 ;Экран 0
MOV DН,05 ;Строка 05
MOV DL,12 ;Столбец 12
IНТ 10Н ; Передача управления в BIOS
Значение 02 в регистре АН указывает команде INT 10Н на выполнение операции установки курсора. Значения строки и столбца должны быть в регистре DX, а номер экрана (или страницы) - в регистре ВН (обычно 0). Содержимое других регистров несущественно. Для установки строки и столбца можно также использовать одну команду MOV с непосредственным шестнадцатиричным значением;
MOV DХ,050СН ;Строка 5, столбец 12
ОЧИСТКА ЭКРАНА
Запросы и команды остаются на экране до тех пор, пока не будут смещены в результате прокручивания ("скроллинга") или переписаны на том же месте другими запросами или командами. Когда программа начинает свое выполнение, экран может быть очищен. Очищаемая область экрана может начинаться в любой позиции и заканчиваться в любой другой позиции с большим номером. Начальное значение строки и столбца заносится в регистр СХ, конечное - в DX, значение 07 - в регистр ВН и 0600Н в АХ. В следующем примере выполняется очистка всего экрана:
MOV AX,0600H ;АН 06 (прокрутка) AL 00 (весь экран)
MOV ВН,07 ;Нормальный атрибут (черно/белый)
MOV CX,0000 : Верхняя левая позиция
MOV DX,184FH ;Нижняя правая позиция
INT 10Н ; Передача управления в BIOS
Значение 06 в регистре АН указывает команде INT 10H на выполнение операции очистки экрана. Эта операция очищает экран пробелами; в следующей главе скроллинг (прокрутка) описывается подробнее. Если вы по ошибке установили нижнюю правую позицию больше, чем 184FH, то очистка перейдет вновь к началу экрана и вторично заполнит некоторые позиции пробелами. Такая операция не приведет к каким-либо ошибкам при работе с монохромными экранами, однако - для некоторых цветных мониторов могут возникнуть серьезные ошибки.
ЭКРАННЫЕ И КЛАВИАТУРНЫЕ ОПЕРАЦИИ В БАЗОВОЙ ВЕРСИИ DOS
Обычно программы должны выдать на экран сообщение о своем завершении или обнаружении ошибки, отобразить запрос для ввода данных или для получения указания пользователя. Рассмотрим сначала методы, применяемые в базовой версии DOS, в последующих разделах будут показаны расширенные методы, введенные в DOS версии 2.0. Операции из базовой DOS работают во всех версиях, хотя в руководстве по DOS рекомендуется применять расширенные возможности для новых разработок. В базовой версии DOS команды вывода на экран более сложны, но команды ввода с клавиатуры проще в использовании благодаря встроенным проверкам.
ВЫВОД НА ЭКРАН В БАЗОВОЙ ВЕРСИИ DOS
Вывод на экран в базовой версии DOS требует определения текстового сообщения в области данных, установки в регистре АН значения 09 (вызов функции DOS) и указания команды DOS INT 21Н. В процессе выполнения операции конец сообщения определяется по ограничителю ($), как показано ниже:
NAMPRMP DВ 'Имя покупателя?','$'
…..
MOV АН,09 ;Запрос вывода на экран
LEA DX,NAMPRMP ;3агрузка адреса сообщения
INT 21Н ;Вызов DOS
Знак ограничителя '$' можно кодировать непосредственно после символьной строки, как показано в примере, внутри строки 'Имя покупателя?$' или в следующем операторе DB '$'. Используя данную операцию, нельзя вывести на экран символ доллара "$". Кроме того, если знак доллара будет отсутствовать в конце строки, то на экран будут выводиться все последующие символы, пока знак "$" не встретится в памяти.
Команда LEA загружает адрес области NAMPRMP в регистр DX для передачи в DOS адреса выводимой информации. Адрес поля NAMPRMP, загружаемый в DX по команде LEA, является относительным, поэтому для вычисления абсолютного адреса данных DOS складывает значения регистров DS и DX (DS:DX).
ПРОГРАММА: ВЫВОД НА ЭКРАН НАБОРА СИМВОЛОВ ASCII-КОДА
Большинство из 256 ASCII-кодов имеют символьное представление и могут быть выведены на экран. Шестнадцатиричные коды 00 и FF не имеют символов и выводятся на экран в виде пробелов, хотя символ пробела имеет ASCII-код 20Н.
На рис. 8.1 показана СОМ-программа, которая выводит на экран полный набор символов ASCII-кода. Программа вызывает три процедуры: B10CLR, C10SET и D10DISP. Процедура B10CLR очищает экран, а процедура C10SET устанавливает курсор в положение (0,0). Процедура D10DISP выводит содержимое поля CTR, которое вначале инициализировано значением 00 и затем увеличивается на 1 при каждом выводе на экран, пока не достигнет шестнадцатиричного значения FF.
page 60, 132
TITLE ALLASC (COM) ;Вывод на экран ASCII- символов O0-FF
COODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG, DS:CODESG, SS:CODESG, ES:NOTHING
ORG 100Н
BEGIN: JMP SHORT MAIN
CTR DB 00, ‘$’
; Основная процедура:
MAIN PROC NEAR
CALL B10CDR ;0чистить экран
CALL C10SET Установить курсор
CALL D10DISP ; Вывести симв. на экран
RET
MAIN ENDP
; Очистка экрана:
B10CLR PROC
MOV AX, 0600H
MOV BH, 07
MOV CX, 0000 ; Левая верхняя позиция
MOV DX, 184FH ; Правая нижняя позиция
INT 10Н
RET
B10CLR ENDP
; Установка курсора в 00, 00:
C10SET PROC
MOV AH, 02
MOV BH, 00
MOV DX, 0000