6.2 Организация циклов. Контрольные вопросы
6. 2 Организация циклов Для организации циклов в программах на ассемблере могут использоваться команды условных и безусловных переходов, но чаще всего используются специальные команды процессора, предназначенные для организации циклов, а также команда условного перехода JCXZ. Команды организации циклов используют в качестве счетчика циклов регистр CX. Каждая такая команда уменьшает значение регистра CX на 1 и, если значение регистра CX стало равно 0, передает управление на указанную метку. К тому же команды организации циклов могут передавать управление на метку в зависимости от определенного условия – как команды условных переходов. Все команды организации циклов выполняют короткие переходы, поэтому они используют только непосредственно указанное смещение. Команда LOOP не имеет дополнительных условий для передачи управления и цикл с использованием команды LOOP выполняется ровно CX раз. Цикл с использованием этой команды является циклом с постусловием и выполняется хотя бы 1 раз. Пример использования команды LOOP: MOV CX, 10 M1: < тело_цикла> LOOP M1 В этом примере тело цикла будет выполняться 10 раз. Команды LOOPE и LOOPZ представляют одну и ту же команду процессора и аналогичны команде LOOP за исключением того, что цикл с использованием этих команд выполняется, пока значение CX не равно 0 и пока значение флага ZF равно 1 – цикл «пока CX и ZF не равны 0». Команды LOOPNE и LOOPNZ представляют одну и ту же команду процессора и аналогичны команде LOOP за исключением того, что цикл с использованием этих команд выполняется, пока значение CX не равно 0 и пока значение флага ZF равно 0 – цикл «пока CX не равен 0 и ZF равен 0». Цикл с предусловием в программе на ассемблере можно организовать несколькими способами:
1. Использование команд условного перехода. В этом случае цикл выполняется пока неверно условие. Само условие определяется используемой командой условного перехода. Например: MOV DX, 10 M1: CMP DX, 0 JE M2 < тело_цикла> DEC DX JMP M1 M2: В этом примере тело цикла выполняется 10 раз. В качестве счетчика циклов используется регистр DX. Метка M2 определяет конец цикла. 2. Использование команды JCXZ. В этом случае условием выполнения цикла является ненулевое значение регистра CX. Например: MOV CX, 100 M1: JCXZ M2 < тело_цикла> DEC CX JMP M1 M2: В этом примере тело цикла выполняется 100 раз. В качестве счетчика циклов используется регистр CX. Метка M2 определяет конец цикла. 3. Использование команды LOOP. Хотя команда LOOP используется, в основном, в циклах с постусловием, ее можно использовать и для цикла с предусловием. Условием выполнения цикла также является ненулевое значение регистра CX. При этом цикл будет выполняться CX – 1 раз, так как команда LOOP автоматически декрементирует значение регистра CX. Например: MOV CX, 21 M1: LOOP M2 < тело_цикла> JMP M1 M2: В этом примере тело цикла выполняется не 21, а 20 раз. В качестве счетчика циклов используется регистр CX. Метка M2 определяет конец цикла. Цикл с постусловием в программе на ассемблере можно организовать следующими способами: 1. Использование команд LOOP, LOOPZ и LOOPNZ. Тело цикла выполняется CX раз. Достоинством этого способа является наличие только одной команды для организации цикла. Например: MOV CX, 1000 M1: < тело_цикла> LOOP M1 2. Использование команды JCXZ. В этом случае для организации цикла требуется еще две дополнительные команды, но в отличие от всех рассмотренных выше примеров циклов, тело такого цикла может занимать более 127 байт (в предыдущих примерах использовались команды коротких переходов). Например: MOV CX, 500 M1: < тело_цикла>
DEC CX JCXZ M2 JMP M1 M2: 3. Использование команд условного перехода. В этом случае условие цикла зависит от используемых команд условного перехода. Цикл выполняется до тех пор, пока условие станет неверным. Например: MOV CX, 2000 M1: < тело_цикла> DEC CX CMP CX, 0 JNE M1 В большинстве рассмотренных примеров циклов размер тела цикла не может превышать 127 байт. Для снятия этого ограничения необходимо использовать дополнительные команды безусловного перехода, которые могут быть не короткими, а ближними. В следующем примере показан цикл с использованием команды условного перехода и дополнительными командами безусловного перехода: MOV DX, 10 M1: CMP DX, 0 JE M2 JMP SHORT M3 M2: JMP M2 M3: < тело_цикла> DEC DX JMP M1 M2: Сократить число команд безусловного перехода можно путем использования противоположного условия: MOV DX, 10 M1: CMP DX, 0 JNE M3 JMP M2 M3: < тело_цикла> DEC DX JMP M1 M2:
Контрольные вопросы 1. Сколько операндов имеют команды условного и безусловного переходов? 2. Опишите результат выполнения команды CMP? 3. Что такое дальний переход? 4. Влияют ли команды перехода на значения регистра флагов? 5. Для чего используется оператор SHORT? 6. Какие команды используются для организации цикла? 7. Какой регистр используется в качестве счетчика цикла? 8. Какое условие выхода из цикла предусматривает использование команды JCXZ? 9. Какой максимальный размер цикла? 10. Возможен ли случай, когда тело цикла не исполнится ни разу, если применяется команда LOOP?
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|