Страница:
использовании его для просмотра стека заносит в стек другие
значения, включая содержимое IP, для собственных нужд.
ПРОГРАММА: РАСШИРЕННЫЕ ОПЕРАЦИИ ПЕРЕСЫЛКИ
------------------------------------------------------------
В предыдущих программах были показаны команды пересылки
непосредcтвенных данных в регистр, пересылки данных из
памяти в регистр, пересылки содержимого регистра в память и
Ассемблер для IBM PC. Глава 7 143
пересылки содержимого oдного регистра в другой. Во всех
случаях длина данных была огpаничена одним или двумя байтами
и не предусмотрена пересылка данных из одной области памяти
непосредственно другую область. В данном разделе объясняется
процесс пересылки данных, которые имееют длину более двух
байт. В главе 11 будет показано использование операций над
строками для пересылки данных из одной области памяти
непосредственно в другую область.
В EXE-программе, приведенной на рис. 7.5, сегмент данных
cодержит три девятибайтовых поля, NAME1, NAME2, NAME3. Цель
программы - переслать данные из поля NAME1 в поле NAME2 и
переслать данные из поля NAME2 в поле NAME3. Так как эти
поля имеют длину девять байт каждая, то для пересылки данных
кроме простой команды MOV потребуются еще другие команды.
Программа содержит несколько новых особенностей.
Процедура BEGIN инициализирует сегментные регистры и
затем вызывает процедуры B10MOVE и C10MOVE. Процедура
B10MOVE пересылает содержимое поля NAME1 в поле NAME2. Так
как каждый раз пересылается только один байт, то процедура
начинает с самого левого байта в поле NAME1 и в цикле пересы
лает затем второй байт, третий и т.д.:
------------------------------------------------------------
------------------------------------------------------------
Рис. 7.5. Расширенные операции пересылки.
NAME1: A B C D E F G H I
| | | | | | | | |
NAME2: J K L M N O P Q R
Для продвижения в полях NAME1 и NAME2 в регистр CX заносится
значение 9, а регистры SI и DI используются в качестве
индексных. Две команды LEA загружают относительные aдреса
полей NAME1 и NAME2 в регистры SI и DI:
LEA SI,NAME1 ;Загрузка относительных адресов
LEA DI,NAME2 ; NAME1 и NAME2
Для пересылки содержимого первого байта из поля NAME1 в
первый байт поля NAME2 используются адреса в регистрах SI и
DI. kвадратные скобки в командах MOV обозначают, что для
доступа к памяти используется адрес в регистре, указанном в
квадратных cкобках. Таким образом, команда
MOV AL,[SI]
означает: использовать адрес в регистре SI (т.е.NAME1) для
пересылки соответствующего байта в регистр AL. А команда
MOV [DI],AL
означает: пересылать содержимое регистра AL по адресу,
лежащему в регистре DI (т.е. NAME2).
Ассемблер для IBM PC. Глава 7 144
Следующие команды увеличивают значения регистров SI и DI
и уменьшают значение в регистре SH. Если в регистре CX не
нулевое значение, управление передается на следующий цикл
(на метку B20).Т ак как содержимое регистров SI и DI было
увеличено на 1, то следующие команды MOV будут иметь дело с
адресами NAME1+1 и NAME2+1. Цикл продолжается таким образом,
пока не будет передано содержимое NAME1+8 и NAME2+8.
Процедура C10MOVE аналогична процедуре B10MOVE с двумя
исключениями: она пересылает данные из поля NAME2 в поле
NAME3 и использует команду LOOP вместо DEC и JNZ.
Задание: Введите программу, приведенную на рис.7.5,
выполните ее ассемблирование, компановку и трассировку с
помощью отладчика DEBUG. Обратите внимание на изменения в
регистрах, командном указателе и в стеке. Для просмотра
изменений в полях NAME2 и NAME3 используйте команду D DS:0.
КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ: AND, OR, XOR, TEST, NOT
------------------------------------------------------------
Логические операции являются важным элементом в
проектировании микросхем и имеют много общего в логике
программирования. Команды AND, OR, XOR и TEST - являются
командами логических операций. Эти команды используются для
сброса и установки бит и для арифметических операций в коде
ASCII (см.гл.13). Все эти команды обрабатывают один байт или
одно слово в регистре или в памяти, и устанавливают флаги
CF, OF, PF, SF, ZF.
AND: Если оба из сравниваемых битов равны 1, то результат
равен 1; во всех остальных случаях результат - 0.
OR: Если хотя бы один из сравниваемых битов равен 1, то
результат равен 1; если сравниваемые биты равны 0, то
результат - 0.
XOR: Если один из сравниваемых битов равен 0, а другой равен
1, то результат равен 1; если сравниваемые биты одинаковы
(оба - 0 или оба - 1) то результат - 0.
TEST: действует как AND-устанавливает флаги, но не изменяет
биты.
Первый операнд в логических командах указывает на один
байт или слово в регистре или в памяти и является единствен
ным значением, которое может изменятся после выполнения
команд. В следующих командах AND, OR и XOR используются
одинаковые битовые значения:
AND OR XOR
0101 0101 0101
0011 0011 0011
Результат: 0001 0111 0110
Ассемблер для IBM PC. Глава 7 145
Для следующих несвязанных примеров, предположим, что AL
содержит 1100 0101, а BH содержит 0101 1100:
1. AND AL,BH ;Устанавливает в AL 0100 0100
2. OR BH,AL ;Устанавливает в BH 1101 1101
3. XOR AL,AL ;Устанавливает в AL 0000 0000
4. AND AL,00 ;Устанавливает в AL 0000 0000
5. AND AL,0FH ;Устанавливает в AL 0000 0101
6. OR CL,CL ;Устанавливает флаги SF и ZF
Примеры 3 и 4 демонстрируют способ очистки регистра. В
примере 5 обнуляются левые четыре бита регистра AL. Хотя
команды сравнения CMP могут быть понятнее, можно применить
команду OR для следующих целей:
1. OR CX,CX ;Проверка CX на нуль
JZ ... ;Переход, если нуль
2. OR CX,CX ;Проверка знака в CX
JS ... ;Переход, если отрицательно
Команда TEST действует аналогично команде AND, но
устанавливает только флаги, а операнд не изменяется. Ниже
придено несколько примеров:
1. TEST BL,11110000B ;Любой из левых бит в BL
JNZ ... ; равен единице?
2. TEST AL,00000001B ;Регистр AL содержит
JNZ ... ; нечетное значение?
3. TEST DX,OFFH ;Регистр DX содержит
JZ ... ; нулевое значение?
Еще одна логическая команда NOT устанавливает обpатное значе
ние бит в байте или в слове, в регистре или в памяти: нули
становятся единицами, а единицы - нулями. Если, например,
pегистр AL содержит 1100 0101, то команда NOT AL изменяет
это значение на 0011 1010. Флаги не меняются. Команда NOT не
эквивалентна команде NEG, которая меняет значение с
положительного на отрицательное и наоборот, посредством
замены бит на противоположное значение и прибавления единицы
(см."Отрицательные числа" в гл.1.).
ПРОГРАММА: ИЗМЕНЕНИЕ СТРОЧНЫХ БУКВ НА ЗАГЛАВНЫЕ
------------------------------------------------------------
Существуют различные причины для преобразований между
строчными и заглавными буквами. Например, вы могли получить
файл данных, созданный на компьютере, который работает
только с заглавными буквами. Или некая программа должна
позволить пользователям вводить команды как заглавными, так
и строчными буквами (например, YES или yes) и преобразовать
их в заглавные для проверки. Заглавные буквы от A до Z имеют
Ассемблер для IBM PC. Глава 7 146
шест.коды от 41 до 5A, а строчные буквы от a до z имеют
шест.коды от 61 до 7A. Единственная pазница в том, что пятый
бит равен 0 для заглавных букв и 1 для строчных:
Биты: 76543210 Биты: 76543210
Буква A: 01000001 Буква a: 01100001
Буква Z: 01011010 Буква z: 01111010
COM-программа, приведенная на рис. 7.6, преобразует
данные в поле TITLEX из строчных букв в прописные, начиная с
адреса TITLEX+1. Программа инициализирует регистр BX адресом
TITLEX+1 и использует его для пересылки символов в регистр
AH, начиная с TITLEX+1. Если полученное значение лежит в
пределах от шест.61 и до 7A, то команда AND устанавливает
бит 5 в 0:
AND AH,11011111B
Все символы, отличные от строчных букв (от a до z), не
изменяются. Измененные символы засылаются обратно в область
TITLEX, значение в регистре BX увеличивается для очередного
символа и осуществляется переход на следующий цикл.
Используемый таким образом регистр BX действует как
индексный регистр для адресации в памяти. Для этих целей
можно использовать также регистры SI и DI.
------------------------------------------------------------
------------------------------------------------------------
Рис. 7.6. Изменение строчных букв на прописные.
КОМАНДЫ СДВИГА И ЦИКЛИЧЕСКОГО СДВИГА
------------------------------------------------------------
Команды сдвига и циклического сдвига, которые представля
ют собой часть логических возможностей компьютера, имеют
следующие свойства:
- обрабатывают байт или слово;
- имеют доступ к регистру или к памяти;
- сдвигают влево или вправо;
- сдвигают на величину до 8 бит (для байта) и 16 бит (для
слова);
- сдвигают логически (без знака) или арифметически (со
знаком).
Значение сдвига на 1 может быть закодировано как непосред
cтвенный операнд, значение больше 1 должно находиться в
регистре CL.
Команды сдвига
При выполнении команд сдвига флаг CF всегда содержит зна
чение последнего выдвинутого бита. Существуют следующие
команды cдвига:
Ассемблер для IBM PC. Глава 7 147
SHR ;Логический (беззнаковый) сдвиг вправо
SHL ;Логический (беззнаковый) сдвиг влево
SAR ;Арифметический сдвиг вправо
SAL ;Арифметический сдвиг влево
Следующий фрагмент иллюстрирует выполнение команды SHR:
MOV CL,03 ; AX:
MOV AX,10110111B ; 10110111
SHR AX,1 ; 01011011 ;Сдвиг вправо на 1
SHR AX,CL ; 00001011 ;Сдвиг вправо на 3
Первая команда SHR сдвигает содержимое регистра AX вправо на
1 бит. Выдвинутый в результате один бит попадает в флаг CF,
а самый левый бит регистра AX заполняется нулем. Вторая
команда cдвигает содержимое регистра AX еще на три бита. При
этом флаг CF последовательно принимает значения 1, 1, 0, а в
три левых бита в регистре AX заносятся нули.
Рассмотрим действие команд арифметического вправо SAR:
MOV CL,03 ; AX:
MOV AX,10110111B ; 10110111
SAR AX,1 ; 11011011 ;Сдвиг вправо на 1
SAR AX,CL ; 11111011 ;Сдвиг вправо на 3
Команда SAR имеет важное отличие от команды SHR: для заполне
ния левого бита используется знаковый бит. Таким образом,
положительные и отрицательные величины сохраняют свой знак.
В приведенном примере знаковый бит содержит единицу.
При сдвигах влево правые биты заполняются нулями. Таким
обpазом, результат команд сдвига SHL и SAL индентичен.
Сдвиг влево часто используется для удваивания чисел, а
сдвиг вправо - для деления на 2. Эти операции осуществляются
значительно быстрее, чем команды умножения или деления.
Деление пополам нечетных чисел (например, 5 или 7) образует
меньшие значения (2 или 3, соответственно) и устанавливаеют
флаг CF в 1. Кроме того, если необходимо выполнить сдвиг на
2 бита, то использование двух команд сдвига более эффектив
но, чем использование одной команды с загрузкой регистра CL
значением 2.
Для проверки бита, занесенного в флаг CF используется
команда JC (переход, если есть перенос).
Команды циклического сдвига
Циклический сдвиг представляет собой операцию сдвига, при
которой выдвинутый бит занимает освободившийся разряд.
Существуют следующие команды циклического сдвига:
ROR ;Циклический сдвиг вправо
ROL ;Циклический сдвиг влево
RCR ;Циклический сдвиг вправо с переносом
RCL ;Циклический сдвиг влево с переносом
Ассемблер для IBM PC. Глава 7 148
Следующая последовательность команд иллюстрирует операцию
циклического сдвига ROR:
MOV CL,03 ; BX:
MOV BX,10110111B ; 10110111
ROR BX,1 ; 11011011 ;Сдвиг вправо на 1
ROR BX,CL ; 01111011 ;Сдвиг вправо на 3
Первая команда ROR при выполнении циклического сдвига
переносит правый единичный бит регистра BX в освободившуюся
левую позицию. Вторая команда ROR переносит таким образом
три правых бита.
В командах RCR и RCL в сдвиге участвует флаг CF. Выдвигае
мый из регистра бит заносится в флаг CF, а значение CF при
этом поступает в освободившуюся позицию.
Рассмотрим пример, в котором используются команды
циклического и простого сдвига. Предположим, что 32-битовое
значение находится в регистрах DX:AX так, что левые 16 бит
лежат в регистре DX, а правые - в AX. Для умножения на 2
этого значения возможны cледующие две команды:
SHL AX,1 ;Умножение пары регистров
RCL DX,1 ; DX:AX на 2
Здесь команда SHL сдвигает все биты регистра AX влево,
причем самый левый бит попадает в флаг CF. Затем команда RCL
сдвигает все биты регистра DX влево и в освободившийся
правый бит заносит значение из флага CF.
ОРГАНИЗАЦИЯ ПРОГРАММ
------------------------------------------------------------
Ниже даны основные рекомендации для написания ассемблер
ных программ:
1. Четко представляйте себе задачу, которую должна решить
программа
2. Сделайте эскиз задачи в общих чертах и спланируйте
общую логику программы. Например, если необходимо прове
рить операции пеpесылки нескольких байт (как в примере
на рис.7.5), начните c определения полей с пересылаемы
ми данными. Затем спланируйте общую стратегию для
инициализации, условного перехода и команды LOOP.
Приведем основную логику, которую используют многие
программисты в таком случае:
инициализация стека и сегментных регистров
вызов подпрограммы цикла
возврат
Подпрограмма цикла может быть спланирована следующим
образом:
инициализация регистров значениями адресов
Ассемблер для IBM PC. Глава 7 149
и числа циклов
Метка: пересылка одного байта
увеличение адресов на 1
уменьшение счетчика на 1:
если счетчик не ноль, то идти на метку
если ноль, возврат
3. Представьте программу в виде логических блоков, следую
щих друг за другом. Процедуры не превышающие 25 строк
(размер экрана) удобнее для отладки.
4. Пользуйтесь тестовыми примерами программ. Попытки запом
нить все технические детали и программирование сложных
программ "из головы" часто приводят к многочисленным
ошибкам.
5. Используйте комментарии для описания того, что должна
делать процедура, какие арифметические действия или
операции сравнения будут выполняться и что делают редко
используемые команды. (Например, команда XLAT, не
имеющая операндов).
6. Для кодирования программы используйте заготовку програм
мы, скопированной в файл с новым именем.
В следующих программах данной книги важным является
использование команды LEA, индексных регистров SI и DI,
вызываемых процедур. Получив теперь базовые знания по
ассемблеру, можем перейти к более развитому и полезному
программированию.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------
ъ Метки процедур (например, B20:) должны завершаться двое
точием для указания типа NEAR. Отсутствие двоеточия
приводит к ассемблерной ошибке.
ъ Метки для команд условного перехода и LOOP должны
лежать в границах -128 до +127 байт. Операнд таких
команд генерирует один байт объектного кода. Шест. от
01 до 7F соответствует десятичным значениям от +1 до
+127, а шест. от FF до 80 покрывает значения от -1 до
+128. Так как длина машинной команды может быть от 1 до
4 байт, то соблюдать границы не просто. Практически
можно ориентироваться на размер в два экрана исходного
текста (примерно 50 строк).
ъ При использовании команды LOOP, инициализируйте регистр
CX положительным числом. Команда LOOP контролирует
только нулевое значение, при отрицательном программа
будет продолжать циклиться.
Ассемблер для IBM PC. Глава 7 150
ъ Если некоторая команда устанавливает флаг, то данный
флаг сохраняет это значение, пока другая команда его не
изменит. Например, если за арифметической командой,
которая устанавливает флаги, следуют команды MOV, то
они не изменят флаги. Однако, для минимизации числа
возможных ошибок, cледует кодировать команды условного
перехода непосредственно после команд, устанавливающих
проверяемые флаги.
ъ Выбирайте команды условного перехода соответственно
операциям над знаковыми или беззнаковыми данными.
ъ Для вызова процедуры используйте команду CALL, а для
возврата из процедуры - команду RET. Вызываемая процеду
ра может, в свою очередь, вызвать другую процедуру, и
если следовать существующим соглашениям, то команда RET
всегда будет выбирать из стека правильный адрес возвра
та. Единственные примеры в этой книге, где используется
переход в процедуру вместо ее вызова - в начале COM-
программ.
ъ Будьте внимательны при использовании индексных операн
дов. Сравните:
MOV AX,SI
MOV AX,[SI]
Первая команда MOV пересылает в регистр AX содержимое
регистра SI. Вторая команда MOV для доступа к пересылае
мому слову в памяти использует относительный адрес в
регистре SI.
ъ Используйте команды сдвига для удванивания значений и
для деления пополам, но при этом внимательно выбирайте
соответствующие команды для знаковых и беззнаковых
данных.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------
7.1. Какое максимальное количество байт могут обойти коман
ды коpоткий JMP, LOOP и относительный переход? Какой
машинный код операнда при этом генерируется?
7.2. Команда JMP начинается на шест. 0624. Определите
адрес перехода, если шест. объектный код для операнда
команды JMP: а) 27, б) 6B, в) C6.
7.3. Напишите программу вычисления 12 чисел Фибоначи: 1,
1, 2, 3, 5, 8, 13,... (каждое число в
последовательности представляет собой сумму двух
предыдущих чисел). Для организации цикла используйте
команду LOOP. Выполните ассемблирование, компановку и
с помощью отладчика DEBUG трассировку программы.
Ассемблер для IBM PC. Глава 7 151
7.4. Предположим, что регистры AX и BX содержат знаковые
данные, a CX и DX - беззнаковые. Определите команды
CMP (где необходимо) и команды безусловного перехода
для следующих проверок:
а) значение в DX больше, чем в CX?
б) значение в BX больше, чем в AX?
в) CX содержит нуль?
г) было ли переполнение?
д) значение в BX равно или меньше, чем в AX?
е) значение в DX равно или меньше, чем в CX?
7.5. На какие флаги воздействуют следующие события и какое
значение этих флагов?
a) произошло переполнение;
б) результат отрицательный;
в) результат нулевой;
г) обработка в одношаговом режиме;
д) передача данных должна быть справа налево.
7.6. Что произойдет при выполнении программы , приведенной
на рис.7.4, если в процедуре BEGIN будет
отсутствовать команда RET?
7.7. Какая разница между кодированием в директиве PROC
опеpанда с типом FAR и с типом NEAR?
7.8. Каким образом может программа начать выполнение
процедуры?
7.9. В EXE-программе процедура A10 вызывает B10, B10
вызывает C10, а C10 вызывает D10. Сколько адресов,
кроме начальных адресов возврата в DOS, содержит
стек?
7.10. Предположим , что регистр BL содержит 11100011 и поле
по имени BOONO содержит 01111001. Определите воздейст
вие на регистр BL для следующих команд: а) XOR
BL,BOONO; б) AND BL,BOONO; в) OR BL,BOONO; г) XOR
BL,11111111B; д) AND BL,00000000B.
7.11. Измените программу на рис.7.6 для: а) определения
содержимого TITLEX заглавными буквами; б) преобразова
ние заглавных букв в строчные.
7.12. Предположим, что регистр DX содержит 10111001
10111001, а pегистр CL - 03. Определите содержимое
регистра DX после следующих несвязанных команд: а)
SHR DX,1; б) SHR DX,CL; в) SHL DX,CL; г) SHL DL,1;
д) ROR DX,CL; е) ROR DL,CL; ж) SAL DH,1.
7.13. Используя команды сдвига, пересылки и сложения,
умножьте содержимое регистра AX на 10.
7.14. Пример программы, приведенной в конце раздела "сдвиг
и циклический сдвиг", умножает содержимое пары
регистров DX:AX на 2. Измените программу для: а)
умножения на 4; б) деления на 4; в) умножения 48 бит
в регистрах DX:AX:BX на 2.
Ассемблер для IBM PC. Глава 8 172
------------------------------------------------------------
Экранные операции I: Основные свойства
Цель: Объяснить требования для вывода информации на экран, а
также для ввода данных с клавиатуры.
ВВЕДЕНИЕ
------------------------------------------------------------
В предыдущих главах мы имели дело с программами, в котор
ых данные oпределялись в операндах команд (непосредственные
данные) или инициализировались в конкретных полях программы.
Число практических применений таких программ в действитель
ности мало. Большинcтво программ требуют ввода данных с
клавиатуры, диска или модема и обеспечивают вывод данных в
удобном формате на экран, принтер или диск. Данные,
предназначенные для вывода на экран и ввода с клавиатуры,
имеют ASCII формат.
Для выполнения ввода и вывода используется команда INT
(прерывание). Существуют различные требования для указания
системе какое действие (ввод или вывод) и на каком
устройстве необходимо выполнить. Данная глава раскрывает
основные требования для вывода информации на экран и ввода
данных с клавиатуры.
Все необходимые экранные и клавиатурные операции можно
выполнить используя команду INT 10H, которая передает
управление непосредственно в BIOS. Для выполнения некоторых
более сложных операций существует прерывание более высокого
уровня INT 21H, которое сначала передает управление в DOS.
Например, при вводе с клавиатуры может потребоваться подсчет
введенных символов, проверку на максимальное число символов
и проверку на символ Return. Преpывание DOS INT 21H
выполняет многие из этих дополнительных вычислений и затем
автоматически передает управление в BIOS.
Материал данной главы подходит как для монохромных
(черно-белых, BW), так и для цветных видеоммониторов. В
главах 9 и 10 приведен материал для управления более
совершенными экранами и для использоваения цвета.
КОМАНДА ПРЕРЫВАНИЯ: INT
------------------------------------------------------------
Команда INT прерывает обработку программы, передает
управление в DOS или BIOS для определенного действия и затем
возвращает управление в прерванную программу для продолжения
обработки. Наиболее часто прерывание используется для
выполнения операций ввода или вывода. Для выхода из
программы на обработку прерывания и для последующего
возврата команда INT выполняет следующие действия:
Ассемблер для IBM PC. Глава 8 173
ъ уменьшает указатель стека на 2 и заносит в вершину
стека содержимое флагового регистра;
ъ очищает флаги TF и IF;
ъ уменьшает указатель стека на 2 и заносит содержимое
регистра CS в стек;
ъ уменьшает указатель стека на 2 и заносит в стек
значение командного указателя;
ъ обеспечивает выполнение необходимых ддействий;
ъ восстанавливает из стека значение регистра и возвращает
управление в прерванную программу на команду, следующую
после INT.
Этот процесс выполняется полностью автоматически. Необхо
димо лишь определить сегмент стека достаточно большим для
записи в него значений регистров.
В данной главе рассмотрим два типа прерываний: команду
BIOS INT 10H и команду DOS INT 21H для вывода на экран и
ввода с клавиатуры. В последующих примерах в зависимости от
требований используются как INT 10H так и INT 21H.
УСТАНОВКА КУРСОРА
------------------------------------------------------------
Экран можно представить в виде двумерного пространства с
адресуемыми позициями в любую из которых может быть установ
лен курсор. Обычный видеомонитор, например, имеет 25 строк
(нумеруемых от 0 до 24) и 80 столбцов (нумеруемых от 0 до
79). В следующей таблице приведены некоторые примеры
положений курсора на экране:
--------------------------------------------------------
Дес. формат Шест.формат
-------------- --------------
Положение строка столбец строка столбец
--------------------------------------------------------
Верхний левый угол 00 00 00 00
Верхний правый угол 00 79 00 4F
Центр экрана 12 39/40 00 27/28
Нижний левый угол 24 00 18 00
Нижний правый угол 24 79 18 4F
--------------------------------------------------------
Команда INT 10H включает в себя установку курсора в любую
позицию и очистку экрана. Ниже приведен пример установки
курсора на 5-ую строку и 12-ый столбец:
MOV AH,02 ;Запрос на установку курсора
MOV BH,00 ;Экран 0
MOV DH,05 ;Строка 05
MOV DL,12 ;Столбец 12
INT 10H ;Передача управления в BIOS
Ассемблер для IBM PC. Глава 8 174
Значение 02 в регистре AH указывает команде INT 10H на выпол
нение операции установки курсора. Значение строки и столбца
должны быть в регистре DX, а номер экрана (или страницы) в
регистре BH (обычно 0). Содержимое других регистров несущест
венно. Для установки строки и столбца можно также использо
вать одну команду 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, то очистка
перейдет вновь к началу экрана и вторично заполнит некоторые
позиции прробелами. Для монохромных экранов это не вызывает
каких-либо неприятностей, но для некоторых цветных мониторов
значения, включая содержимое IP, для собственных нужд.
ПРОГРАММА: РАСШИРЕННЫЕ ОПЕРАЦИИ ПЕРЕСЫЛКИ
------------------------------------------------------------
В предыдущих программах были показаны команды пересылки
непосредcтвенных данных в регистр, пересылки данных из
памяти в регистр, пересылки содержимого регистра в память и
Ассемблер для IBM PC. Глава 7 143
пересылки содержимого oдного регистра в другой. Во всех
случаях длина данных была огpаничена одним или двумя байтами
и не предусмотрена пересылка данных из одной области памяти
непосредственно другую область. В данном разделе объясняется
процесс пересылки данных, которые имееют длину более двух
байт. В главе 11 будет показано использование операций над
строками для пересылки данных из одной области памяти
непосредственно в другую область.
В EXE-программе, приведенной на рис. 7.5, сегмент данных
cодержит три девятибайтовых поля, NAME1, NAME2, NAME3. Цель
программы - переслать данные из поля NAME1 в поле NAME2 и
переслать данные из поля NAME2 в поле NAME3. Так как эти
поля имеют длину девять байт каждая, то для пересылки данных
кроме простой команды MOV потребуются еще другие команды.
Программа содержит несколько новых особенностей.
Процедура BEGIN инициализирует сегментные регистры и
затем вызывает процедуры B10MOVE и C10MOVE. Процедура
B10MOVE пересылает содержимое поля NAME1 в поле NAME2. Так
как каждый раз пересылается только один байт, то процедура
начинает с самого левого байта в поле NAME1 и в цикле пересы
лает затем второй байт, третий и т.д.:
------------------------------------------------------------
------------------------------------------------------------
Рис. 7.5. Расширенные операции пересылки.
NAME1: A B C D E F G H I
| | | | | | | | |
NAME2: J K L M N O P Q R
Для продвижения в полях NAME1 и NAME2 в регистр CX заносится
значение 9, а регистры SI и DI используются в качестве
индексных. Две команды LEA загружают относительные aдреса
полей NAME1 и NAME2 в регистры SI и DI:
LEA SI,NAME1 ;Загрузка относительных адресов
LEA DI,NAME2 ; NAME1 и NAME2
Для пересылки содержимого первого байта из поля NAME1 в
первый байт поля NAME2 используются адреса в регистрах SI и
DI. kвадратные скобки в командах MOV обозначают, что для
доступа к памяти используется адрес в регистре, указанном в
квадратных cкобках. Таким образом, команда
MOV AL,[SI]
означает: использовать адрес в регистре SI (т.е.NAME1) для
пересылки соответствующего байта в регистр AL. А команда
MOV [DI],AL
означает: пересылать содержимое регистра AL по адресу,
лежащему в регистре DI (т.е. NAME2).
Ассемблер для IBM PC. Глава 7 144
Следующие команды увеличивают значения регистров SI и DI
и уменьшают значение в регистре SH. Если в регистре CX не
нулевое значение, управление передается на следующий цикл
(на метку B20).Т ак как содержимое регистров SI и DI было
увеличено на 1, то следующие команды MOV будут иметь дело с
адресами NAME1+1 и NAME2+1. Цикл продолжается таким образом,
пока не будет передано содержимое NAME1+8 и NAME2+8.
Процедура C10MOVE аналогична процедуре B10MOVE с двумя
исключениями: она пересылает данные из поля NAME2 в поле
NAME3 и использует команду LOOP вместо DEC и JNZ.
Задание: Введите программу, приведенную на рис.7.5,
выполните ее ассемблирование, компановку и трассировку с
помощью отладчика DEBUG. Обратите внимание на изменения в
регистрах, командном указателе и в стеке. Для просмотра
изменений в полях NAME2 и NAME3 используйте команду D DS:0.
КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ: AND, OR, XOR, TEST, NOT
------------------------------------------------------------
Логические операции являются важным элементом в
проектировании микросхем и имеют много общего в логике
программирования. Команды AND, OR, XOR и TEST - являются
командами логических операций. Эти команды используются для
сброса и установки бит и для арифметических операций в коде
ASCII (см.гл.13). Все эти команды обрабатывают один байт или
одно слово в регистре или в памяти, и устанавливают флаги
CF, OF, PF, SF, ZF.
AND: Если оба из сравниваемых битов равны 1, то результат
равен 1; во всех остальных случаях результат - 0.
OR: Если хотя бы один из сравниваемых битов равен 1, то
результат равен 1; если сравниваемые биты равны 0, то
результат - 0.
XOR: Если один из сравниваемых битов равен 0, а другой равен
1, то результат равен 1; если сравниваемые биты одинаковы
(оба - 0 или оба - 1) то результат - 0.
TEST: действует как AND-устанавливает флаги, но не изменяет
биты.
Первый операнд в логических командах указывает на один
байт или слово в регистре или в памяти и является единствен
ным значением, которое может изменятся после выполнения
команд. В следующих командах AND, OR и XOR используются
одинаковые битовые значения:
AND OR XOR
0101 0101 0101
0011 0011 0011
Результат: 0001 0111 0110
Ассемблер для IBM PC. Глава 7 145
Для следующих несвязанных примеров, предположим, что AL
содержит 1100 0101, а BH содержит 0101 1100:
1. AND AL,BH ;Устанавливает в AL 0100 0100
2. OR BH,AL ;Устанавливает в BH 1101 1101
3. XOR AL,AL ;Устанавливает в AL 0000 0000
4. AND AL,00 ;Устанавливает в AL 0000 0000
5. AND AL,0FH ;Устанавливает в AL 0000 0101
6. OR CL,CL ;Устанавливает флаги SF и ZF
Примеры 3 и 4 демонстрируют способ очистки регистра. В
примере 5 обнуляются левые четыре бита регистра AL. Хотя
команды сравнения CMP могут быть понятнее, можно применить
команду OR для следующих целей:
1. OR CX,CX ;Проверка CX на нуль
JZ ... ;Переход, если нуль
2. OR CX,CX ;Проверка знака в CX
JS ... ;Переход, если отрицательно
Команда TEST действует аналогично команде AND, но
устанавливает только флаги, а операнд не изменяется. Ниже
придено несколько примеров:
1. TEST BL,11110000B ;Любой из левых бит в BL
JNZ ... ; равен единице?
2. TEST AL,00000001B ;Регистр AL содержит
JNZ ... ; нечетное значение?
3. TEST DX,OFFH ;Регистр DX содержит
JZ ... ; нулевое значение?
Еще одна логическая команда NOT устанавливает обpатное значе
ние бит в байте или в слове, в регистре или в памяти: нули
становятся единицами, а единицы - нулями. Если, например,
pегистр AL содержит 1100 0101, то команда NOT AL изменяет
это значение на 0011 1010. Флаги не меняются. Команда NOT не
эквивалентна команде NEG, которая меняет значение с
положительного на отрицательное и наоборот, посредством
замены бит на противоположное значение и прибавления единицы
(см."Отрицательные числа" в гл.1.).
ПРОГРАММА: ИЗМЕНЕНИЕ СТРОЧНЫХ БУКВ НА ЗАГЛАВНЫЕ
------------------------------------------------------------
Существуют различные причины для преобразований между
строчными и заглавными буквами. Например, вы могли получить
файл данных, созданный на компьютере, который работает
только с заглавными буквами. Или некая программа должна
позволить пользователям вводить команды как заглавными, так
и строчными буквами (например, YES или yes) и преобразовать
их в заглавные для проверки. Заглавные буквы от A до Z имеют
Ассемблер для IBM PC. Глава 7 146
шест.коды от 41 до 5A, а строчные буквы от a до z имеют
шест.коды от 61 до 7A. Единственная pазница в том, что пятый
бит равен 0 для заглавных букв и 1 для строчных:
Биты: 76543210 Биты: 76543210
Буква A: 01000001 Буква a: 01100001
Буква Z: 01011010 Буква z: 01111010
COM-программа, приведенная на рис. 7.6, преобразует
данные в поле TITLEX из строчных букв в прописные, начиная с
адреса TITLEX+1. Программа инициализирует регистр BX адресом
TITLEX+1 и использует его для пересылки символов в регистр
AH, начиная с TITLEX+1. Если полученное значение лежит в
пределах от шест.61 и до 7A, то команда AND устанавливает
бит 5 в 0:
AND AH,11011111B
Все символы, отличные от строчных букв (от a до z), не
изменяются. Измененные символы засылаются обратно в область
TITLEX, значение в регистре BX увеличивается для очередного
символа и осуществляется переход на следующий цикл.
Используемый таким образом регистр BX действует как
индексный регистр для адресации в памяти. Для этих целей
можно использовать также регистры SI и DI.
------------------------------------------------------------
------------------------------------------------------------
Рис. 7.6. Изменение строчных букв на прописные.
КОМАНДЫ СДВИГА И ЦИКЛИЧЕСКОГО СДВИГА
------------------------------------------------------------
Команды сдвига и циклического сдвига, которые представля
ют собой часть логических возможностей компьютера, имеют
следующие свойства:
- обрабатывают байт или слово;
- имеют доступ к регистру или к памяти;
- сдвигают влево или вправо;
- сдвигают на величину до 8 бит (для байта) и 16 бит (для
слова);
- сдвигают логически (без знака) или арифметически (со
знаком).
Значение сдвига на 1 может быть закодировано как непосред
cтвенный операнд, значение больше 1 должно находиться в
регистре CL.
Команды сдвига
При выполнении команд сдвига флаг CF всегда содержит зна
чение последнего выдвинутого бита. Существуют следующие
команды cдвига:
Ассемблер для IBM PC. Глава 7 147
SHR ;Логический (беззнаковый) сдвиг вправо
SHL ;Логический (беззнаковый) сдвиг влево
SAR ;Арифметический сдвиг вправо
SAL ;Арифметический сдвиг влево
Следующий фрагмент иллюстрирует выполнение команды SHR:
MOV CL,03 ; AX:
MOV AX,10110111B ; 10110111
SHR AX,1 ; 01011011 ;Сдвиг вправо на 1
SHR AX,CL ; 00001011 ;Сдвиг вправо на 3
Первая команда SHR сдвигает содержимое регистра AX вправо на
1 бит. Выдвинутый в результате один бит попадает в флаг CF,
а самый левый бит регистра AX заполняется нулем. Вторая
команда cдвигает содержимое регистра AX еще на три бита. При
этом флаг CF последовательно принимает значения 1, 1, 0, а в
три левых бита в регистре AX заносятся нули.
Рассмотрим действие команд арифметического вправо SAR:
MOV CL,03 ; AX:
MOV AX,10110111B ; 10110111
SAR AX,1 ; 11011011 ;Сдвиг вправо на 1
SAR AX,CL ; 11111011 ;Сдвиг вправо на 3
Команда SAR имеет важное отличие от команды SHR: для заполне
ния левого бита используется знаковый бит. Таким образом,
положительные и отрицательные величины сохраняют свой знак.
В приведенном примере знаковый бит содержит единицу.
При сдвигах влево правые биты заполняются нулями. Таким
обpазом, результат команд сдвига SHL и SAL индентичен.
Сдвиг влево часто используется для удваивания чисел, а
сдвиг вправо - для деления на 2. Эти операции осуществляются
значительно быстрее, чем команды умножения или деления.
Деление пополам нечетных чисел (например, 5 или 7) образует
меньшие значения (2 или 3, соответственно) и устанавливаеют
флаг CF в 1. Кроме того, если необходимо выполнить сдвиг на
2 бита, то использование двух команд сдвига более эффектив
но, чем использование одной команды с загрузкой регистра CL
значением 2.
Для проверки бита, занесенного в флаг CF используется
команда JC (переход, если есть перенос).
Команды циклического сдвига
Циклический сдвиг представляет собой операцию сдвига, при
которой выдвинутый бит занимает освободившийся разряд.
Существуют следующие команды циклического сдвига:
ROR ;Циклический сдвиг вправо
ROL ;Циклический сдвиг влево
RCR ;Циклический сдвиг вправо с переносом
RCL ;Циклический сдвиг влево с переносом
Ассемблер для IBM PC. Глава 7 148
Следующая последовательность команд иллюстрирует операцию
циклического сдвига ROR:
MOV CL,03 ; BX:
MOV BX,10110111B ; 10110111
ROR BX,1 ; 11011011 ;Сдвиг вправо на 1
ROR BX,CL ; 01111011 ;Сдвиг вправо на 3
Первая команда ROR при выполнении циклического сдвига
переносит правый единичный бит регистра BX в освободившуюся
левую позицию. Вторая команда ROR переносит таким образом
три правых бита.
В командах RCR и RCL в сдвиге участвует флаг CF. Выдвигае
мый из регистра бит заносится в флаг CF, а значение CF при
этом поступает в освободившуюся позицию.
Рассмотрим пример, в котором используются команды
циклического и простого сдвига. Предположим, что 32-битовое
значение находится в регистрах DX:AX так, что левые 16 бит
лежат в регистре DX, а правые - в AX. Для умножения на 2
этого значения возможны cледующие две команды:
SHL AX,1 ;Умножение пары регистров
RCL DX,1 ; DX:AX на 2
Здесь команда SHL сдвигает все биты регистра AX влево,
причем самый левый бит попадает в флаг CF. Затем команда RCL
сдвигает все биты регистра DX влево и в освободившийся
правый бит заносит значение из флага CF.
ОРГАНИЗАЦИЯ ПРОГРАММ
------------------------------------------------------------
Ниже даны основные рекомендации для написания ассемблер
ных программ:
1. Четко представляйте себе задачу, которую должна решить
программа
2. Сделайте эскиз задачи в общих чертах и спланируйте
общую логику программы. Например, если необходимо прове
рить операции пеpесылки нескольких байт (как в примере
на рис.7.5), начните c определения полей с пересылаемы
ми данными. Затем спланируйте общую стратегию для
инициализации, условного перехода и команды LOOP.
Приведем основную логику, которую используют многие
программисты в таком случае:
инициализация стека и сегментных регистров
вызов подпрограммы цикла
возврат
Подпрограмма цикла может быть спланирована следующим
образом:
инициализация регистров значениями адресов
Ассемблер для IBM PC. Глава 7 149
и числа циклов
Метка: пересылка одного байта
увеличение адресов на 1
уменьшение счетчика на 1:
если счетчик не ноль, то идти на метку
если ноль, возврат
3. Представьте программу в виде логических блоков, следую
щих друг за другом. Процедуры не превышающие 25 строк
(размер экрана) удобнее для отладки.
4. Пользуйтесь тестовыми примерами программ. Попытки запом
нить все технические детали и программирование сложных
программ "из головы" часто приводят к многочисленным
ошибкам.
5. Используйте комментарии для описания того, что должна
делать процедура, какие арифметические действия или
операции сравнения будут выполняться и что делают редко
используемые команды. (Например, команда XLAT, не
имеющая операндов).
6. Для кодирования программы используйте заготовку програм
мы, скопированной в файл с новым именем.
В следующих программах данной книги важным является
использование команды LEA, индексных регистров SI и DI,
вызываемых процедур. Получив теперь базовые знания по
ассемблеру, можем перейти к более развитому и полезному
программированию.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------
ъ Метки процедур (например, B20:) должны завершаться двое
точием для указания типа NEAR. Отсутствие двоеточия
приводит к ассемблерной ошибке.
ъ Метки для команд условного перехода и LOOP должны
лежать в границах -128 до +127 байт. Операнд таких
команд генерирует один байт объектного кода. Шест. от
01 до 7F соответствует десятичным значениям от +1 до
+127, а шест. от FF до 80 покрывает значения от -1 до
+128. Так как длина машинной команды может быть от 1 до
4 байт, то соблюдать границы не просто. Практически
можно ориентироваться на размер в два экрана исходного
текста (примерно 50 строк).
ъ При использовании команды LOOP, инициализируйте регистр
CX положительным числом. Команда LOOP контролирует
только нулевое значение, при отрицательном программа
будет продолжать циклиться.
Ассемблер для IBM PC. Глава 7 150
ъ Если некоторая команда устанавливает флаг, то данный
флаг сохраняет это значение, пока другая команда его не
изменит. Например, если за арифметической командой,
которая устанавливает флаги, следуют команды MOV, то
они не изменят флаги. Однако, для минимизации числа
возможных ошибок, cледует кодировать команды условного
перехода непосредственно после команд, устанавливающих
проверяемые флаги.
ъ Выбирайте команды условного перехода соответственно
операциям над знаковыми или беззнаковыми данными.
ъ Для вызова процедуры используйте команду CALL, а для
возврата из процедуры - команду RET. Вызываемая процеду
ра может, в свою очередь, вызвать другую процедуру, и
если следовать существующим соглашениям, то команда RET
всегда будет выбирать из стека правильный адрес возвра
та. Единственные примеры в этой книге, где используется
переход в процедуру вместо ее вызова - в начале COM-
программ.
ъ Будьте внимательны при использовании индексных операн
дов. Сравните:
MOV AX,SI
MOV AX,[SI]
Первая команда MOV пересылает в регистр AX содержимое
регистра SI. Вторая команда MOV для доступа к пересылае
мому слову в памяти использует относительный адрес в
регистре SI.
ъ Используйте команды сдвига для удванивания значений и
для деления пополам, но при этом внимательно выбирайте
соответствующие команды для знаковых и беззнаковых
данных.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------
7.1. Какое максимальное количество байт могут обойти коман
ды коpоткий JMP, LOOP и относительный переход? Какой
машинный код операнда при этом генерируется?
7.2. Команда JMP начинается на шест. 0624. Определите
адрес перехода, если шест. объектный код для операнда
команды JMP: а) 27, б) 6B, в) C6.
7.3. Напишите программу вычисления 12 чисел Фибоначи: 1,
1, 2, 3, 5, 8, 13,... (каждое число в
последовательности представляет собой сумму двух
предыдущих чисел). Для организации цикла используйте
команду LOOP. Выполните ассемблирование, компановку и
с помощью отладчика DEBUG трассировку программы.
Ассемблер для IBM PC. Глава 7 151
7.4. Предположим, что регистры AX и BX содержат знаковые
данные, a CX и DX - беззнаковые. Определите команды
CMP (где необходимо) и команды безусловного перехода
для следующих проверок:
а) значение в DX больше, чем в CX?
б) значение в BX больше, чем в AX?
в) CX содержит нуль?
г) было ли переполнение?
д) значение в BX равно или меньше, чем в AX?
е) значение в DX равно или меньше, чем в CX?
7.5. На какие флаги воздействуют следующие события и какое
значение этих флагов?
a) произошло переполнение;
б) результат отрицательный;
в) результат нулевой;
г) обработка в одношаговом режиме;
д) передача данных должна быть справа налево.
7.6. Что произойдет при выполнении программы , приведенной
на рис.7.4, если в процедуре BEGIN будет
отсутствовать команда RET?
7.7. Какая разница между кодированием в директиве PROC
опеpанда с типом FAR и с типом NEAR?
7.8. Каким образом может программа начать выполнение
процедуры?
7.9. В EXE-программе процедура A10 вызывает B10, B10
вызывает C10, а C10 вызывает D10. Сколько адресов,
кроме начальных адресов возврата в DOS, содержит
стек?
7.10. Предположим , что регистр BL содержит 11100011 и поле
по имени BOONO содержит 01111001. Определите воздейст
вие на регистр BL для следующих команд: а) XOR
BL,BOONO; б) AND BL,BOONO; в) OR BL,BOONO; г) XOR
BL,11111111B; д) AND BL,00000000B.
7.11. Измените программу на рис.7.6 для: а) определения
содержимого TITLEX заглавными буквами; б) преобразова
ние заглавных букв в строчные.
7.12. Предположим, что регистр DX содержит 10111001
10111001, а pегистр CL - 03. Определите содержимое
регистра DX после следующих несвязанных команд: а)
SHR DX,1; б) SHR DX,CL; в) SHL DX,CL; г) SHL DL,1;
д) ROR DX,CL; е) ROR DL,CL; ж) SAL DH,1.
7.13. Используя команды сдвига, пересылки и сложения,
умножьте содержимое регистра AX на 10.
7.14. Пример программы, приведенной в конце раздела "сдвиг
и циклический сдвиг", умножает содержимое пары
регистров DX:AX на 2. Измените программу для: а)
умножения на 4; б) деления на 4; в) умножения 48 бит
в регистрах DX:AX:BX на 2.
Ассемблер для IBM PC. Глава 8 172
------------------------------------------------------------
Экранные операции I: Основные свойства
Цель: Объяснить требования для вывода информации на экран, а
также для ввода данных с клавиатуры.
ВВЕДЕНИЕ
------------------------------------------------------------
В предыдущих главах мы имели дело с программами, в котор
ых данные oпределялись в операндах команд (непосредственные
данные) или инициализировались в конкретных полях программы.
Число практических применений таких программ в действитель
ности мало. Большинcтво программ требуют ввода данных с
клавиатуры, диска или модема и обеспечивают вывод данных в
удобном формате на экран, принтер или диск. Данные,
предназначенные для вывода на экран и ввода с клавиатуры,
имеют ASCII формат.
Для выполнения ввода и вывода используется команда INT
(прерывание). Существуют различные требования для указания
системе какое действие (ввод или вывод) и на каком
устройстве необходимо выполнить. Данная глава раскрывает
основные требования для вывода информации на экран и ввода
данных с клавиатуры.
Все необходимые экранные и клавиатурные операции можно
выполнить используя команду INT 10H, которая передает
управление непосредственно в BIOS. Для выполнения некоторых
более сложных операций существует прерывание более высокого
уровня INT 21H, которое сначала передает управление в DOS.
Например, при вводе с клавиатуры может потребоваться подсчет
введенных символов, проверку на максимальное число символов
и проверку на символ Return. Преpывание DOS INT 21H
выполняет многие из этих дополнительных вычислений и затем
автоматически передает управление в BIOS.
Материал данной главы подходит как для монохромных
(черно-белых, BW), так и для цветных видеоммониторов. В
главах 9 и 10 приведен материал для управления более
совершенными экранами и для использоваения цвета.
КОМАНДА ПРЕРЫВАНИЯ: INT
------------------------------------------------------------
Команда INT прерывает обработку программы, передает
управление в DOS или BIOS для определенного действия и затем
возвращает управление в прерванную программу для продолжения
обработки. Наиболее часто прерывание используется для
выполнения операций ввода или вывода. Для выхода из
программы на обработку прерывания и для последующего
возврата команда INT выполняет следующие действия:
Ассемблер для IBM PC. Глава 8 173
ъ уменьшает указатель стека на 2 и заносит в вершину
стека содержимое флагового регистра;
ъ очищает флаги TF и IF;
ъ уменьшает указатель стека на 2 и заносит содержимое
регистра CS в стек;
ъ уменьшает указатель стека на 2 и заносит в стек
значение командного указателя;
ъ обеспечивает выполнение необходимых ддействий;
ъ восстанавливает из стека значение регистра и возвращает
управление в прерванную программу на команду, следующую
после INT.
Этот процесс выполняется полностью автоматически. Необхо
димо лишь определить сегмент стека достаточно большим для
записи в него значений регистров.
В данной главе рассмотрим два типа прерываний: команду
BIOS INT 10H и команду DOS INT 21H для вывода на экран и
ввода с клавиатуры. В последующих примерах в зависимости от
требований используются как INT 10H так и INT 21H.
УСТАНОВКА КУРСОРА
------------------------------------------------------------
Экран можно представить в виде двумерного пространства с
адресуемыми позициями в любую из которых может быть установ
лен курсор. Обычный видеомонитор, например, имеет 25 строк
(нумеруемых от 0 до 24) и 80 столбцов (нумеруемых от 0 до
79). В следующей таблице приведены некоторые примеры
положений курсора на экране:
--------------------------------------------------------
Дес. формат Шест.формат
-------------- --------------
Положение строка столбец строка столбец
--------------------------------------------------------
Верхний левый угол 00 00 00 00
Верхний правый угол 00 79 00 4F
Центр экрана 12 39/40 00 27/28
Нижний левый угол 24 00 18 00
Нижний правый угол 24 79 18 4F
--------------------------------------------------------
Команда INT 10H включает в себя установку курсора в любую
позицию и очистку экрана. Ниже приведен пример установки
курсора на 5-ую строку и 12-ый столбец:
MOV AH,02 ;Запрос на установку курсора
MOV BH,00 ;Экран 0
MOV DH,05 ;Строка 05
MOV DL,12 ;Столбец 12
INT 10H ;Передача управления в BIOS
Ассемблер для IBM PC. Глава 8 174
Значение 02 в регистре AH указывает команде INT 10H на выпол
нение операции установки курсора. Значение строки и столбца
должны быть в регистре DX, а номер экрана (или страницы) в
регистре BH (обычно 0). Содержимое других регистров несущест
венно. Для установки строки и столбца можно также использо
вать одну команду 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, то очистка
перейдет вновь к началу экрана и вторично заполнит некоторые
позиции прробелами. Для монохромных экранов это не вызывает
каких-либо неприятностей, но для некоторых цветных мониторов