- •Практическая работа № 7.
- •2) Lds и les (Load ds и Load es) — команды загрузки адреса, состоящего из двух слов, в пару регистров (сегментный регистр и, чаще всего, базовый).
- •2) Loope (loopz) — выполнять цикл пока нуль, выход по «не нулю».
- •3) Loopne (loopnz) — выполнять цикл пока не 0, выход по «нулю»
- •Пример программы Таблица 3.5
- •Контрольные вопросы
- •Практические задания
2) Loope (loopz) — выполнять цикл пока нуль, выход по «не нулю».
Работает аналогично LOOP, только выход из цикла происходит в двух случаях:
если CX = 0; или
флаг ZF = 0.
Задание
Найти в таблице номер первого ненулевого элемента.
; данные
TABL DB 0,0,3,0,5
. . . . . . . . .
; цикл
MOV CX,5
MOV SI,-1
MET:
INC SI
CMP TABL[SI],0
LOOPZ MET ; пока 0, цикл продолжается
После выхода из цикла в SI будет находиться номер первого ненулевого элемента.
3) Loopne (loopnz) — выполнять цикл пока не 0, выход по «нулю»
Эта команда, в некотором смысле, противоположна предыдущей.
Такая команда может использоваться, например, для поиска в таблице первого нулевого элемента.
Команды циклов Таблица 3.4
Название |
Мнемоника |
Альтернативная мнемоника |
КОП |
Проверяемое условие |
Зациклить |
LOOP |
|
11100010 |
(CX)=0 |
Зациклить пока ноль (равно) |
LOOPZ |
LOOPE |
11100001 |
(ZF=1)&((CX)=0) |
Зациклить пока не ноль (неравно) |
LOOPNZ |
LOOPNE |
11100000 |
(ZF=0)&((CX)=0) |
Перейти по (CX) |
JCXZ |
|
11100011 |
(CX)=0 |
Команды циклов идентичны по формату и очень близки по выполняемым действиям командам условных переходов. Однако по сравнению с последними они имеют ряд особенностей, позволяющих эффективно использовать их при программировании циклических участков алгоритмов.
Один из наиболее распространенных видов циклического участка программы представлен на рис.3.18.
СЧ=<число
повторений>
да
тело цикла
СЧ = 0
СЧ=СЧ-1
нет
Рис.3.18. Структура
счетного цикла с постпроверкой
Команды циклов предназначены для упрощения действий декремента (вычитания единицы), проверки условия и перехода.
Некоторые команды цикла реализуют выход из цикла не только по значению счетчика, но и при выполнении некоторых других условий.
Описание команд цикла сведено в табл. 3.4. За исключением команды JCXZ, которая не изменяет значения регистра CX, при выполнении команд циклов производятся следующие действия: CX=(CX)-1. Затем если проверяемое условие выполнено, то IP=(IP)+disp8 с расширением знаком до disp16, в противном случае IP не изменяется, и программа продолжает выполнение в естественном порядке.
Пример представления фрагмента
программы в машинной форме записи
Рассмотрим пример кодирования команд, представляющих собой некоторый законченный в смысловом отношении фрагмент программы.
Необходимо сложить k слов a[i], расположенных последовательно в оперативной памяти, начиная с адреса [31A6h], а результат записать по адресу [3000h].
Один из возможных вариантов программы, не использующий команду цикла, представлен в табл. 3.5. В программе предполагается, что конечный и промежуточные результаты не превышают длины слова. Количество слагаемых также занимает слово и записано перед исходным массивом, то есть по адресу 31A4h. Начальное значение IP взято произвольно.
Отметим некоторые особенности использования отдельных команд этой программы. Обнуление регистра AX осуществляется вычитанием его содержимого из самого себя. Переход к новому слагаемому достигается использованием регистровой относительной адресации с изменением на каждом шаге содержимого индексного регистра на длину слагаемого, то есть на 2.
Последняя команда, засылка результата, закодирована в специальном формате работы с аккумулятором.