
Jazik_Assemblera_dlja_IBM_PC_i_programmir
.pdf9.3.Напишите скэн-коды для следующих функциональных клавишей: а) стрелка вверх, б) клавиша F3, в) Home, г) PgUp.
9.4.Используя отладчик DEBUG, проверьте воздействие на содержимое регистра AX при нажатии клавишей на клавиатуре. Для ввода ассемблерных команд используйте команду A 100 (Return). Ведите следующие команды:
MOV AH,00
INT 16H
JMP 100
Используя команду U 100,104, дисассемблируйте программу и с помощью G 104 выполните команды MOV и INT. На команде INT выполнение программы остановиться и система перейдет в ожидание вашего ввода. Для проверки регистра AH нажмите любую клавишу. Продолжая вводить команду G 104, и, нажимая различные клавиши, проверьте работу программы. Для выхода введите команду Q.
9.5. Составьте команды для определения нажатия клавиши: если нажата клавиша PgDn, то необходимо установить курсор по координатам - строка 24 и столбец 0.
ГЛАВА 10 Экранные операции III: Цвет и графика
__________________________________________________________________________
Ц е л ь: Показать расширенные возможности компьютера, связанные с использованием цвета и графики на экране.
ВВЕДЕНИЕ
________________________________________________________________
Данная глава знакомит с использованием цвета для текстового и графического режимов. Существуют следующие три типа видео монитоpов, используемые для изображения цветной графики (в порядке возpастания стоимости и качества):
1.Немодифицированный цветной телевизионный приемник (обычный домашний телевизор), применяемый многими для своих компьютеров.
2.Комбинированный видеомонитор, принимающий цветовой сигнал без радиочастотной модуляции, и используемый для передачи по радиоволнам. Обеспечивает высокое качество изображения.
3.RGB-монитор, посылающий входные сигналы на три раздельные электронные пушки - красную, зеленую и синюю для каждого из трех основных цветов. Являясь наиболее дорогим, RGB-монитор обеспечивает наилучшее качество изображения.
Стандартный адаптер для цветного графического монитора (CGA - Color/Graphics Adapter) использует 16К байт памяти, начинающейся по адресу шест.B8000, 8К байт - для символов и 8К байт для их атрибутов. При работе в формате 80х25 адаптер может хранить четыре страницы (0-3) дисплейного буфера по 4К байт каждая. При работе в формате 40х25 адаптер может хранить восемь страниц (0-7) по 2К байт каждая. По умолчанию используется нулевая страница (в начале дисплейной памяти). Программа может вывести на экран любую страницу и в это время формировать другую страницу в памяти для последующего вывода на экран.
Усовершенствованный графический адаптер (EGA - Enhanced Graphics Adapter) обеспечивает более высокую разрешающую способность, по сравнению со стандартным цветным адаптером (CGA) и в большинстве случаев является совместимым с ним. Разрешающая способность обеспечивает 320х200, 640х200 и
640х350 точек на экране.
Цветные адаптеры имеют два основных режима работы: текстовой (алфавитно-цифровой) и графический, и возможны также дополнительные режимы между двумя основными. По умолчанию используется текстовой режим. Установка режима описана в главе 9 в разделе "Преpывание BIOS INT 10H" (AH=0). Для установки графического режима или возврата в текстовой режим используется прерывание BIOS INT 10H, как это показано в двух следующих примерах:
MOV |
AH,00 ;Режим |
MOV |
AH,00 |
;Режим |
MOV AL,03 ;Цвет+текст |
MOV |
AL,04 |
;Графика среднего |
|
INT |
10H |
INT 10H |
; разрешения |
ТЕКСТОВЫЙ (АЛФАВИТНО-ЦИФРОВОЙ) РЕЖИМ
________________________________________________________________
Текстовой режим предназначен для обычных вычислений с выводом букв и цифр на экран. Данный режим одинаков для черно-белых (BW) и для цветных мониторов за исключением того, что цветные мониторы не поддерживают атрибут подчеркивания. Текстовой режим обеспечивает работу с полным набором ASCII кодов (256 символов), как для черно-белых (BW), так и для цветных мониторов. Каждый символ на экране может отображаться в одном из 16 цветов на одном из восьми цветов фона. Бордюр экрана может иметь также один из 16 цветов.
Цвета
-------
Тремя основными цветами являются красный, зеленый и синий. Комбинируя
основные цвета, друг с |
другом, можно |
получить восемь |
|
цветов, |
включая |
черный и белый. Используя два уровня яркости для каждого |
цвета, |
получим |
|||
всего 16 цветов: |
|
|
|
|
|
Черный |
I R G B |
Серый |
I R G B |
|
|
0 0 0 0 |
1 |
0 0 0 |
|
||
Синий |
0 0 0 1 |
Ярко-синий |
1 |
0 0 1 |
|
Зеленый |
0 0 1 0 |
Ярко-зеленый |
1 |
0 1 0 |
|
Голубой |
0 0 1 1 |
Ярко-голубой |
1 |
0 1 1 |
|
Красный |
0 1 0 0 |
Ярко-красный |
1 |
1 0 0 |
|
Сиреневый |
0 1 0 1 |
Ярко-сиреневый |
1 |
1 0 1 |
|
Коричневый |
0 1 1 0 |
Желтый |
1 |
1 1 0 |
|
Белый |
0 1 1 0 |
Ярко-белый |
1 |
1 1 1 |
|
Таким образом любые символы могут быть отображены на |
экране |
в oдном |
из 16 цветов. Фон любого символа может иметь один из первых восьми цветов. Если фон и текст имеют один и тот же цвет, то текст получается невидимым. Используя байт атрибута, можно получить также мигающие символы.
Байт-атрибут
--------------
Текстовой режим допускает использование байта атрибута, рассмотpенного в гл.9. В приведенной ниже таблице, атрибут BL обозначает
мигание (BLinking), RGB - соответственно |
красный, зеленый и синий цвет, I |
|||||||
- выделение яркостью: |
|
|
|
|
|
|
|
|
|
|
|
Фон |
|
|
Текст |
|
|
Атрибут: |
BL R |
G |
B |
I |
R |
G |
B |
|
Номера битов: |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Мигание и выделение яркостью |
относится |
к |
тексту. Ниже приведены |
|||||
некоторые типичные атрибуты: |
|
|
|
|
|
|
|
|
Текст по фону |
Бит: |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Шест. |
Черный по черному |
|
BL R |
G |
B |
I |
R |
G |
B |
||
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
00 |
|
Синий по черному |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
01 |
Красный по синему |
|
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
14 |
Голубой по зеленому |
|
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
23 |
Светло-сиреневый по белому |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
7D |
|
Серый по зеленому, мигание |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
A8 |
Байт-атрибут используется |
аналагично |
показанному для |
черно-белого |
||||
(BW) монитора. |
Тип монитора |
можно определить |
из |
программы |
с помощью |
||
команды INT |
11H. |
Для BW монитора код 07 устанавливает нормальный атрибут. |
|||||
Для цветных |
мониторов можно использовать |
любую |
из |
цветовых |
комбинаций. |
Цвет на экране сохраняется до тех пор, пока другая команда не изменит его. Для установки цвета можно использовать в команде INT 10H функции AH=06, AH=07 и AH=09. Например, для вывода пяти мигающих звездочек светло-зеленым цветом на сиреневом фоне возможна следующая программа:
MOV |
AH,09 |
;Функция вывода на экран |
MOV |
AL,'*' |
;Выводимый символ |
MOV |
BH,00 |
;Страница 0 |
MOV |
BL,0DAH |
;Атрибут цвета |
MOV |
CX,05 |
;Число повторений |
INT |
10H |
;Вызвать BIOS |
ГРАФИЧЕСКИЙ РЕЖИМ
________________________________________________________________
Для генерации цветных изображений в графическом режиме используются минимальные точки растра - пиксели или пэлы (pixel). Цветной графический адаптер (CGA) имеет три степени разрешения:
1.Низкое разрешение (не поддерживается в ROM) обеспечивает вывод 100 строк по 160 точек (т.е. четыре бита на точку). Каждая точка может иметь один из 16 стандартных цветов, как описано в предыдущем разделе "Цвета". Реализация данного режима включает прямую адресацию контролера Motorola 6845 CRT. Для этого используются два порта: шест.3D4 и 3D5.
2.Среднее разрешение для стандартной цветной графики обеспечивает 200 строк по 320 точек. Каждый байт в этом случае представляет четыре точки (т.е. два бита на точку).
3.Высокое разрешение обеспечивает 200 строк по 640 точек. Поскольку в данном случае требуется 16К байт памяти, высокое разрешение достигается только в черно-белом (BW) режиме. Каждый байт здесь представляет 8 точек (т.е. один бит на точку). Нулевое значение бита дает черный цвет точки, единичное - белый.
Заметим, что в графическом режиме ROM содержит точечные образы только для первых 128 ASCII-кодов. Команда INT 1FH обеспечивает доступ к 1К байтовой области в памяти, определяющей остальные 128 символов. (8 байт на символ). Отображение графических байтов в видео сигналы аналогично, как для среднего, так и для высокого pазрешения.
РЕЖИМ СРЕДНЕГО РАЗРЕШЕНИЯ
________________________________________________________________
При среднем разрешении каждый байт представляет четыре точки, пронумерованных от 0 до 3:
Байт: |C1 C0|C1 C0|C1 C0|C1 C0|
Пиксели: 0 1 2 3
В любой момент для каждой точки возможны четыре цвета, от 0 до 3. Ограничение в 4 цвета объясняется тем, что двухбитовая точка имеет 4 комбинации значений битов: 00, 01, 10 и 11. Можно выбpать значение 00 для любого из 16 возможных цветов фона или выбрать значение 01, 10, и 11 для одной из двух палитр. Каждая палитpа имеет три цвета:
C1 |
C0 |
Палитра 0 |
Палитра 1 |
0 |
0 |
фон |
фон |
0 |
1 |
зеленый |
голубой |
1 |
0 |
красный |
сиреневый |
1 |
1 |
коричневый |
белый |
Для выбора цвета палитры и фона используется INT 10H. Таким обpазом, если, например, выбран фон желтого цвета и палитра 0, то возможны следующие цвета точки: желтый, зеленый, красный и коричневый. Байт, содержащий значение 10101010, соответствует красным точкам. Если выбрать цвет фона - синий и палитру 1, то возможные цвета: синий, голубой, сиреневый и белый. Байт, содержащий значение 00011011, отображает синюю, голубую, сиреневую и белую точки.
Прерывание BIOS INT 10H для графики
-------------------------------------
Функция AH=00 команды INT 10H устанавливает графический режим. Функция AH=11 команды INT 10H позволяет выбрать цвет палитры и вывести на экран графический символ. Код в регистре AH определяет функцию:
AH=00: Установка режима. Нулевое значение в регистре AH и 04 в pегистре AL устанавливают стандартный цветной графический режим:
MOV AH,00 ;Функция установки режима
MOV AL,04 ;Разрешение 320х200
INT 10H
Установка графического режима приводит к исчезновению курсора с экрана. Подробности по установке режима приведены в главе 9.
AH=0BH: Установка цветовой палитры. Число в регистре BH определяет назначение регистра BL:
BH=00 выбирает цвета фона и бордюра в соответствии с содержимым pегистра BL. Цвет фона от 1 до 16 соответствует шест. значениям oт 0 до F;
BH=01 выбирает палитру соответственно содержимому регистра BL (0 или 1):
MOV |
AH,0BH |
;Функция установки цвета |
MOV |
BH,01 |
;Выбор палитры |
MOV |
BL,00 |
; 0 (зеленый, красный, корич.) |
INT |
10H |
;Вызвать BIOS |
Палитра, установленная один раз, сохраняется, пока не будет отменена другой командой. При смене палитры весь экран меняет цветовую комбинацию. При использовании функции AH=0BH в текстовом режиме, значение, установленное для цвета 0 в палитре, определяет цвет бордюра.
AH=0CH: Вывод точки на экран. Использование кода 0C в регистре AH позволяет вывести на экран точку в выбранном цвете (фон и палитра). Например, для разрешения 320х200 загрузим в регистр DX вертикальную координату (от 0 до 199), а в регистр CX - горизонтальную координату (от 0 до 319). В регистр AL поместим цвет точки (от 0 до 3):
MOV AH,0CH |
;Функция вывода точки |
MOV |
AL,цвет |
;Цвет точки |
MOV |
CX,столбец |
;Горизонтальная координата |
MOV |
DX,строка |
;Вертикальная координата |
INT |
10H |
;Вызвать BIOS |
AH=0DH: Чтение точки с экрана. Данная функция позволяет прочитать точку для определения ее цвета. В регистр DX должна быть загружена вертикальная координата (от 0 до 199), а в регистр CX - горизонтальная (от 0 до 319). В регистре AH должно быть значение 0D. Функция возвращает цвет точки в регистре AL.
ПРОГРАММА: УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА И ОТОБРАЖЕНИЕ ЦВЕТА
________________________________________________________________
Программа, приведенная на рис.10.1, использует команду INT 10H для установки графического режима, выбора зеленого фона и вывода на экран точек (40 строк по 320 столбцов). В программе происходит увеличение значения цвета на 1 для каждой строки. Так как в определении цвета участвуют только три правых бита, цвета повторяются через каждые семь строк.
__________________________________________________________________________
TITLE |
GRAPHIX |
(COM) Пример цвета и графики |
||
CODESG |
SEGMENT |
PARA 'Code' |
|
|
|
ASSUME |
CS:CODESG,DS:CODESG,SS:CODESG |
||
|
ORG |
100H |
|
|
MAIN |
PROC |
NEAR |
;Установка режима графики |
|
|
MOV |
AN,00 |
||
|
MOV |
AL,0DH |
; для EGA (CGA=04) |
|
|
MOV |
AH,0BH |
;Установить палитру |
|
|
MOV |
BH,00 |
;Фон |
|
|
MOV |
BL,02 |
;Зеленый |
|
|
INT |
10H |
;Начальные цвет, |
|
|
MOV |
BX,00 |
||
|
MOV |
CX,00 |
; столбец |
|
A50: |
MOV |
DX,00 |
; и строка |
|
MOV |
AH,0CH |
;Функция вывода точки |
||
|
||||
|
MOV |
AL,BL |
;Установить цвет |
|
|
INT |
10H |
;BX, CX, и DX сохраняются |
|
|
INC |
CX |
;Увеличить столбец |
|
|
CMP |
CX,320 |
;Столбец 320? |
|
|
JNE |
A50 |
; нет - цикл, |
|
|
MOV |
CX,00 |
; да - сбросить столбец |
|
|
INS |
BL |
;Изменить цвет |
|
|
INS |
DX |
;Увеличить строку |
|
|
CMP |
DX,40 |
;Строка 40? |
|
|
JNE |
A50 |
; нет - цикл, |
|
MAIN |
RET |
|
; да - завершить |
|
ENDP |
|
|
||
CODESG |
ENDS |
MAIN |
|
|
|
END |
|
__________________________________________________________________________
Рис.10.1 Вывод на экран в цветном графическом режиме.
После выполнения программы дисплей остается в графическом режиме. Восстановление текстового режима возможно с помощью команды DOS MODE (MODE CO80) или пользовательской COM программой, в которой для этой цели используется команда INT 10H.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Память объемом 16К для |
цветного дисплея позволяет |
хранить |
дополнительные страницы (экраны). |
Возможны четыре страницы для экранов на |
|
80 столбцов или восемь страниц для |
экранов на 40 столбцов. |
|
-Графический режим обеспечивает низкое разрешение (не поддерживается
вROM), среднее разрешение (для цветной графики) и высокое разрешение (для черно-белой графики).
- Точка растра (минимальный |
элемент графического |
изображения) |
|
представляется определенным числом |
бит в |
зависимости |
от графического |
адаптера и разрешающей способности (низкой, |
средней или высокой). |
- Для графики среднего разрешения на цветном графическом адаптере (CGA) можно выбрать четыре цвета, один из которых принадлежит к 16 возможным цветам, а три других формируют цветовую палитру.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
_________________________________________________________________
10.1.Сколько цветов возможно для фона и для текста на стандартном цветном адаптере (CGA) в текстовом режиме?
10.2.Напишите байты атрибуты в двоичном формате для а) сиреневого на ярко-голубом, б) коричневого на желтом, в)красного на сером с миганием.
10.3.Объясните разницу в количестве цветов, возможных при низком, среднем и высоком разрешении.
10.4.Напишите команды для вывода пяти символов карточной масти "бубны" в текстовом режиме ярко-зеленым цветом на сиреневом фоне.
10.5.Напишите команды для установки графического режима с разрешением а) 320х200 в адаптере CGA и б) 640х200 в адаптере EGA.
10.6.Напишите команды для установки синего фона в графическом режиме.
10.7.Напишите команды для чтения точки на 12 строке и 13 столбце в графическом режиме.
10.8.Модифицируйте программу на рис.10.1 для: а) графического режима на вашем мониторе; б) красного фона; в) строк с 10 по 30; г) столбцов с 20
по 300.
ГЛАВА 11 Команды обработки строк
__________________________________________________________________________
Ц е л ь: Объяснить назначение специальных цепочечных команд, используемых для обработки символьных данных.
ВВЕДЕНИЕ
________________________________________________________________
Команды, показанные |
в предыдущих |
главах, |
оперировали одним байтом, |
|
или одним словом за одно |
выполнение. |
Часто, |
однако, бывает |
необходимо |
переслать или сравнить поля данных, которые превышают по длине |
одно слово. |
Например, |
необходимо сравнить описания или имена для того, |
|
чтобы |
||||
отсортировать их в восходящей последовательности. |
Элементы такого формата |
||||||
известны как строковые данные и могут являться как символьными, |
так и |
||||||
числовыми. |
Для обработки строковых данных ассемблер |
имеет |
пять |
команд |
|||
обработки |
строк: |
|
|
|
|
|
|
MOVS - |
переслать один байт или одно слово из |
одной |
области |
памяти |
в |
||
LODS - |
другую; |
AL |
или |
одно |
слово |
в |
|
загрузить из памяти один байт в регистр |
|||||||
STOS - |
регистр AX; |
|
|
|
|
|
|
записать содержимое регистра AL или AX в память; |
в |
один байт |
|||||
CMPS - |
сравнить содержимое двух областей памяти, размером |
||||||
SCAS - |
или в одно слово; |
|
|
|
|
|
|
сравнить содержимое регистра AL или AX с содержимым памяти. |
|
Префикс REP позволяет этим командам обрабатывать строки любой длины.
СВОЙСТВА ОПЕРАЦИЙ НАД СТРОКАМИ
________________________________________________________________
Цепочечная команда может быть закодирована для повторяющейся обpаботки одного байта или одного слова за одно выполнение. Например, можно выбрать "байтовую" команду для обработки строки с нечетным числом байт или "двухбайтовую" команду для обработки четного числа байт. Ниже перечислены регистры, участвующие в цепочечных командах (для однобайтовых и двухбайтовых вариантов). Предположим, что регистры DI и SI содержат необходимые адреса:
Команда |
Операнды |
Байт |
Слово |
MOVS |
DI,SI |
MOVSB |
MOVSW |
LODS |
AL,SI или AX,SI |
LODSB |
LODSW |
STOS |
DI,AL или DI,AX |
STOSB |
STOSW |
CMPS |
SI,DI |
CMPSB |
CMPSW |
SCAS |
DI,AL или DI,AX |
SCASB |
SCASW |
Например, можно кодировать операнды для команды MOVS, но опустить их для MOVSB и MOVSW. Эти команды предполагают, что pегистры DI и SI содержат относительные адреса, указывающие на необходимые области памяти (для загрузки можно использовать команду LEA). Регистр SI обычно связан с регистром сегмента данных - DS:SI. Регистр DI всегда связан с регистром дополнительного сегмента - ES:DI. Следовательно, команды MOVS, STOS, CMPS и SCAS требуют инициализации регистра ES (обычно адресом в регистре DS).
REP: ПРЕФИКС ПОВТОРЕНИЯ ЦЕПОЧЕЧНОЙ КОМАНДЫ
________________________________________________________________
Несмотря на то, что цепочечные команды |
имеют отношение к одному байту |
||
или одному слову, префикс REP обеспечивает |
повторение команды |
несколько |
|
раз. Префикс кодируется непосредственно |
перед |
цепочечной |
командой, |
например, REP MOVSB. Для использования префикса REP необходимо |
установить |
||
начальное значение в регистре CX. При выполнении |
цепочечной |
команды с |
|
префиксом REP происходит уменьшение на 1 значения в регистре CX |
до нуля. |
||
Таким образом, можно обрабатывать строки любой длины. |
|
Флаг направления определяет направление повторяющейся операции:
-для направления слева направо необходимо с помощью команды CLD установить флаг DF в 0;
-для направления справа налево необходимо с помощью команды STD установить флаг DF в 1.
Вследующем примере выполняется пересылка 20 байт из STRING1 в
STRING2. Предположим, что оба регистра DS и |
ES инициализированы |
адресом |
||
сегмента данных: |
|
|
|
|
STRING1 |
DB |
20 DUP('*') |
|
|
STRING2 |
DB |
20 DUP(' ') |
|
|
|
... |
|
;Сброс флага DF |
|
|
CLD |
CX,20 |
|
|
|
MOV |
;Счетчик на 20 байт |
|
|
|
LEA |
DI,STRING2 |
;Адрес области "куда" |
|
|
LEA |
SI,STRING1 |
;Адрес области "откуда" |
|
|
REP MOVSB |
;Переслать данные |
|
|
При выполнении |
команд |
CMPS и SCAS |
возможна установка |
флагов |
состояния, так чтобы операция могла прекратиться сразу после |
обнаружения |
|
необходимого условия. Ниже приведены модификации префикса REP для этих |
||
целей: |
|
|
REP - |
повторять операцию, пока CX не равно 0; |
|
REPZ или REPE - |
повторять операцию, пока флаг ZF показывает "равно или |
|
|
ноль". Прекратить операцию при флаге ZF, |
указывающему |
REPNE или REPNZ - |
на не равно или не ноль или при CX равном 0; |
|
повторять операцию, пока флаг ZF показывает "не равно |
||
|
или не ноль". Прекратить операцию при флаге ZF, |
|
|
указывающему на "равно или нуль" или при CX равным 0. |
Для процессоров 8086, 80286 и 80386, обрабатывающих слово за oдно выполнение, использование цепочечных команд, где это возможно, приводит к повышению эффективности работы программы.
MOVS: ПЕРЕСЫЛКА СТРОК
________________________________________________________________
На рис.7.5 была показана программа для пересылки девятибайтового поля. Программа включала три команды для инициализации и пять команд для цикла. Команда MOVS с префиксом REP и длиной в регистре CX может выполнять пересылку любого числа символов более эффективно.
Для области, принимающей строку, сегментным регистром, является pегистр ES, а регистр DI содержит относительный адрес области, передающей строку. Сегментным регистром является регистр DS, а регистр SI содержит относительный адрес. Таким образом, в начале программы перед выполнением команды MOVS необходимо инициализировать регистр ES вместе с регистром DS, а также загрузить требуемые относительные адреса полей в регистры DI и SI. В зависимости от состояния флага DF команда MOV S производит увеличение или уменьшение на 1 (для байта) или на 2 (для слова) содержимого регистров
DI и SI.
Приведем команды, эквивалентные цепочечной команде REP MOVSB: |
|||
LABEL1: |
JCXZ |
LABEL2 |
|
MOV |
AL,[SI] |
|
|
|
MOV |
[DI],AL |
;Инкремент или декремент |
|
INC/DEC |
DI |
|
|
UNC/DEC |
SI |
;Инкремент или декремент |
LABEL2: |
LOOP |
LABEL1 |
|
... |
|
|
В программе на рис.11.1 процедура C10MVSB |
использует |
команду |
MOVSB |
|||
для пересылки содержимого десятибайтового поля NAME1 в поле NAME2. |
Первая |
|||||
команда CLD сбрасывает флаг |
направления |
в 0 |
для |
обеспечения процесса |
||
пересылки слева направо. В |
нормальном |
состоянии |
флаг DF |
обычно |
имеет |
нулевое значение и команда CLD используется из предосторожности.
__________________________________________________________________________
page 60,132
TITLE STRING (EXE) Проверка строковых операций
; ---------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
STACKG |
DW |
32 DUP(?) |
|
ENDS |
|
|
|
; --------------------------------------------------- |
SEGMENT PARA 'Data' |
|
|
DATASG |
;Элементы данных |
||
NAME1 |
DB |
'Assemblers' |
|
NAME2 |
DB |
10 DUP(' ') |
|
NAME3 |
DB |
10 DUP(' ') |
|
DATASG |
ENDS |
|
|
; --------------------------------------------------- |
SEGMENT PARA 'Code' |
|
|
CODESG |
;Основная процедура |
||
BEGIN |
PROC |
FAR |
|
|
ASSUME |
CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG |
|
|
PUSH |
DS |
|
|
SUB |
AX,AX |
|
|
PUSH |
AX |
|
|
MOV |
AX,DATASG |
|
|
MOV |
DS,AX |
|
|
MOV |
ES,AX |
;Подпрограмма MVSB |
|
CALL |
C10MVSB |
|
|
CALL |
D10MVSW |
;Подпрограмма LODS |
|
CALL |
E10LODS |
;Подпрограмма LODS |
|
CALL |
F10STOS |
;Подпрограмма CMPS |
|
CALL |
H10SCAS |
;Подпрограмма SCAS |
BEGIN |
RET |
|
|
ENDP |
Использование MOVSB: |
||
; |
|
||
; |
|
NEAR------------------- |
|
C10MVSB PROC |
|
||
|
CLD |
SI,NAME1 |
|
|
LEA |
|
|
|
LEA |
D1,NAME2 |
;Переслать 10 байтов |
|
MOV |
CX,10 |
|
|
REP MOVSB |
; из NAME1 в NAME2 |
|
|
RET |
|
|
C10MVSB ENDP |
Использование MOVSW: |
||
; |
|
||
; |
|
NEAR------------------- |
|
D10MVSW PROC |
|
||
|
CLD |
SI,NAME2 |
|
|
LEA |
|
|
|
LEA |
DI,NAME3 |
;Переслать 5 слов |
|
MOV |
CX,05 |
|
|
REP MOVSW |
; из NAME2 в NAME3 |
|
|
RET |
|
|
D10MVSW ENDP |
Использование LODSW: |
||
; |
|
||
; |
|
NEAR------------------- |
|
E10LODS PROC |
|
||
|
CLD |
SI,NAME1 |
;Загрузить первое слово |
|
LEA |
||
|
LODSW |
|
; из NAME1 в AX |
|
RET |
|
|
E10LODS ENDP |
Использование STOSW: |
||
; |
|
||
; |
|
NEAR------------------- |
|
F10STOS PROC |
|
||
|
CLD |
D1,NAME3 |
|
|
LEA |
|
|
|
MOV |
CX,05 |
;Переслать пробелы |
|
MOV |
AX,2020H |
REP STOSW |
; в NAME3 |
RET |
|
F10STOS ENDP |
|
;Использование CMPSB:
; |
|
------------------- |
|
G10CMPS PROC |
NEAR |
|
|
|
CLD |
CX,10 |
|
|
MOV |
|
|
|
LEA |
SI,NAME1 |
|
|
LEA |
DI,NAME2 |
;Сравнить NAME1 и NAME2 |
|
REPE CMPSB |
||
|
JNE |
G20 |
;Не равны? |
|
MOV |
BH,01 |
|
G20: |
MOV |
CX,10 |
|
|
LEA |
SI,NAME2 |
|
|
LEA |
DI,NAME3 |
;Сравнить NAME2 и NAME3 |
|
REPE CMPSB |
||
|
JE |
G30 |
;Если равны, то выйти |
G30: |
MOV |
BL,02 |
|
RET |
|
|
|
G10CMPS |
ENDP |
|
|
;Использование SCASB:
; |
|
------------------- |
|
H10SCAS PROC |
NEAR |
|
|
|
CLD |
CX,10 |
|
|
MOV |
|
|
|
LEA |
DI,NAME1 |
;Поиск символа 'm' |
|
MOV |
AL,'m' |
|
|
REPNE SCASB |
; в NAME1 |
|
|
JNE |
H20 |
;Если не найден - выйти |
H20: |
MOV |
AH,03 |
|
RET |
|
|
|
H10SCAS |
ENDP |
|
|
CODES |
ENDS |
BEGIN |
|
|
END |
|
__________________________________________________________________________
Рис.11.1. Использование цепочечных |
команд. |
|
|
|
|||
Две команды LEA загружают регистры |
SI и |
DI относительными |
адресами |
||||
NAME1 и NAME2 соответственно. |
Так |
как |
регистры DS и |
ES были |
ранее |
||
инициализированы адресом DATASG, то полные |
адреса полей |
NAME1 |
и |
NAME2 |
|||
будут в регистрах ES:DI и DS:SI. |
(COM |
программа |
автоматически |
||||
инициализирует регистры ES и |
DS). |
Команда |
MOV заносит в регистр CX |
||||
значение 10 - длину полей NAME1 |
и |
NAME2. |
Команда REP |
MOVSB |
выполняет |
||
следующее: |
|
|
|
|
|
|
|
-Пересылает самый левый байт из поля NAME1 (адресованного pегистрами ES:DI) в самый левый байт поля NAME2 (адресованного регистрами DS:SI).
-Увеличивает на 1 адреса в регистрах DI и SI для следующего
байта.
-Уменьшает CX на 1.
-Повторяет перечисленные действия (в данном случае 10 раз), пока содержимое регистра CX не станет равным нулю.
Поскольку флаг DF имеет нулевое значение, команда MOVSB увеличивает адреса в регистрах DI и SI, и в каждой итерации процесс переходит на байт вправо, т.е. пересылает байт из NAME1+1 в NAME2+1 и т.д. Если бы флаг DF был равен 1, тогда команда MOVSB уменьшала бы адреса в регистрах DI и SI,