
lect_10.ppt
- Количество слайдов: 19
ЛЕКЦИЯ № 10 УСЛОВНЫЕ ПЕРЕХОДЫ Микропроцессор имеет 18 команд условного перехода, позволяющие проверить: • отношение между операндами со знаком ( «больше-меньше» ); • отношение между операндами без знака ( «выше-ниже» ); • состояние арифметических флагов zf, sf, cf, of, pf. Синтаксис команд условного перехода: jcc метка_перехода операнд метка_перехода может определять адрес в пределах текущего сегмента кода. Межсегментная передача управления в командах условного перехода не допускается.
Решение о том, куда будет передано управление принимается на основе предварительно сформулированного условия. Источником такого условия могут быть: • любая команда, изменяющая состояние арифметических флагов; • команда сравнения cmp, сравнивающая значения двух операндов; • состояние регистра ecx/cx. Команда сравнения cmp опреанд_1, операнд_2 Команда сравнивает два операнда путем вычитания второго из первого и по результатам сравнения устанавливает флаги. Флаги, устанавливаемые командой cmp, можно анализировать специальными командами перехода.
Значение аббревиатур в названии команд условного перехода jcc Мнемоническое обозначение Английский Русский Тип операндов Ee Nn Gg Ll Aa Bb equal not greater less above below Равно Не Больше Меньше Выше ( «больше» ) Ниже ( «меньше» ) Любые Числа со знаком Числа без знака
Перечень команд условного перехода для команды cmp Типы операндов Любые Со знаком Без знака Мнемокод команды je jne jl/jnge jle/jng jg/jnle jge/jnl jb/jnae jbe/jna ja/jnbe jae/jnb Критерий условного перехода операнд_1 = операнд_2 операнд_1 <> операнд_2 операнд_1 <= операнд_2 операнд_1 > операнд_2 операнд_1 => операнд_2 Значения флагов для осуществления перехода zf = 1 zf = 0 sf <> of or zf = 1 sf = of and zf = 0 sf = of cf = 1 or zf = 0 cf = 0 and zf = 0 cf = 0
Так команды условного перехода не изменяют флаги, то после одной команды cmp могут следовать несколько команд условного перехода. Пример: …. data mas db 10 dup (? ). code … cmp mas[si], 5 ; сравнить очередной элемент mas с 5 je eql ; переход, если элемент mas равен 5 jl low ; переход, если элемент mas меньше 5 jg grt ; переход, если элемент mas больше 5 eql: … low: … grt: …
Группа команд условного перехода предназначена для работы с отдельными флагами. Команды условного перехода и флаги Название флага Флаг переноса cf Флаг четности pf Флаг нуля zf Флаг знака sf Флаг переполнения of Номер бита в eflags/flags 1 2 6 7 11 Команда jc jp jz js jo jnc jnp jnz jns jno Значение флага для осуществления перехода cf = 1 pf = 1 zf = 1 sf = 1 of = 1 cf = 0 pf = 0 zf = 0 sf = 0 of = 0
Пример: Преобразование регистра символов model small. stack 100 h. data n equ 10 ; количество символов в строке stroka db “acvfgrndup”. code start: mov ax, @data mov ds, ax xor ax, ax mov cx, n lea bx, stroka m 1: mov al, [bx] ; очередной символ из stroka в al cmp al, 61 h ; проверить, что код символа не меньше 61 h jb next ; если меньше, то не обрабатывать и перейти ; к следующему символу cmp al, 7 ah ; проверить, что код символа не больше 7 ah ja next ; если больше, то не обрабатывать и перейти ; к следующему символу
and al, 11011111 b mov [bx], al ; инвертировать 5 -й бит ; символ на его место в stroka inc dec jnz ; адресовать следующий символ ; уменьшить значение счетчика ; если cx не 0, переход на m 1 next: bx cx m 1 exit: mov ax, 4 c 00 h int 21 h end start Для анализа регистра cx в системе команд микропроцессора есть отдельная команда jcxz метка_перехода переход, если cx ноль; jecxz метка_перехода переход, если ecx ноль. Эта команда выполняет только короткие внутрисегментные переходы.
Организация циклов Цикл представляет собой важную алгоритмическую структуру, без которой не возможно эффективное программирование. Организовать циклическое выполнение некоторого участка программы можно как с использованием команд условной либо безусловной передачи управления, так и при помощи специальной группы команд, предназначенных только для организации циклов. Пример: Подсчет числа нулевых элементов ( Организация цикла при помощи команд условного и безусловного выполнения) model small. stack 100 h. data len equ mas db. code start: 10 ; количество элементов в mas 1, 0, 9, 8, 0, 7, 8, 0, 2, 0
mov mov xor ax, @data ds, ax cx, len ax, ax si, si ; длину поля mas в cx cycl: jcxz cmp jne inc exit mas[si], 0 m 1 al ; проверка cx на 0, если 0, то выход inc dec jmp si cx cycl ; перейти к следующему элементу ; уменьшить cx на 1 ; если не равно 0, то на m 1 ; в al счетчик нулевых элементов m 1: exit: end mov int start ax, 4 c 00 h 21 h
Команды управления циклом loop метка_перехода Выполняемые действия: • декремент регистра ecx/cx; • сравнение регистра ecx/cx с нулем; если (ecx/cx)>0, то управление передается на метку перехода; если (ecx/cx)=0, то управление передается на следующую после loop команду. loope/loopz метка_перехода Выполняемые действия: • декремент регистра ecx/cx; • сравнение регистра ecx/cx с нулем; • анализ состояния флага нуля zf; если (ecx/cx)>0 и zf=1, то управление передается на метку перехода; если (ecx/cx)=0 или zf=0, то управление передается на следующую после loop команду.
loopne/loopnz метка_перехода Выполняемые действия: • декремент регистра ecx/cx; • сравнение регистра ecx/cx с нулем; • анализ состояния флага нуля zf; если (ecx/cx)>0 и zf=0, то управление передается на метку перехода; если (ecx/cx)=0 или zf=1, то управление передается на следующую после loop команду. model small. stack 100 h. data len equ mas db. code start: 10 ; количество элементов в mas 1, 0, 9, 8, 0, 7, 8, 0, 2, 0
mov mov xor jcxz ax, @data ds, ax cx, len ; длину поля mas в cx ax, ax si, si exit ; проверка cx на 0 cycl: cmp jne inc mas[si], 0 m 1 al ; сравнить очередной элемент mas с 0 ; если не равно 0, то на m 1 ; в al – счетчик нулевых элементов inc loop si cycl ; перейти к следующему элементу mov int start ax, 4 c 00 h 21 h m 1: exit: end
Пример: Поиск первого нулевого элемента ( использование команды loopnz) model small. stack 100 h. data len equ 10 ; количество элементов в mas db 1, 0, 9, 8, 0, 7, 8, 0, 2, 0 message db “В поле mas нет элементов, равных нулю. $” , code start mov ax, @data mov ds, ax mov cx, len xor ax, ax xor si, si jcxz exit
mov si, -1 ; готовим si к адресации элементов mas cycl: inc si cmp mas[si], 0 ; сравнить очередной элемент mas с нулем loopnz cycl jz exit ; выяснение причины выхода из цикла ; вывод сообщения, если нет нулевых элементов mov ah, 9 mov dx, offset message int 21 h exit: end mov int start ax, 4 c 00 h 21 h
Организация вложенных циклов Шаблон построения программ с вложенными циклами … mov cx, 100 ; количество повторений цикла cycl 1: push cx ; счетчик цикла cycl 1 в стек … ; команды цикла cycl 1 mov cx, 50 ; количество повторений цикла cycl 2: push cx ; счетчик цикла cycl 2 в стек … ; команды цикла cycl 2 mov cx, 25 ; количество повторений цикла cycl 3 cycl 1: … ; команды цикла cycl 3 loop cycl 3 … ; команды цикла cycl 2 pop cx ; восстановить счетчик цикла cycl 2 loop cycl 2 … ; команды цикла cycl 1
pop cx loop ; восстановить счетчик цикла cycl 1 … Пример: Замена нулевых значений в массиве на значение 0 ffh с использованием вложенных циклов model small. stack 100 h. data mas db 1, 0, 9, 8, 0, 78, 0, 2, 0 db 1, 0, 9, 8, 0, 78, 0, 2, 0. code start: mov ax, @data mov ds, ax
xor lea mov ax, ax bx, mas cx, 5 push xor mov cx si, si cx, 10 cmp jne mov byte ptr [bx+si], 0 nozero byte ptr[bx+si], 0 ffh inc loop pop add loop si cycl 2 cx bx, 10 cycl 1: cycl 2: nozero: exit:
mov int end ax, 4 c 00 h 21 h start