Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Jazik_Assemblera_dlja_IBM_PC_i_programmir

.pdf
Скачиваний:
60
Добавлен:
27.03.2015
Размер:
2 Mб
Скачать

9.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,

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]