Система команд
Команды условных переходов способны передавать управление на метку, расположенную в пределах ближайших плюс-минус 128 байт от самой команды. Если нужно передать управление на метку, расположенную дальше в том же сегменте, или на метку в другом сегменте, сразу за командой условной передачи располагают безусловную команду JMP или CAL, например:
стр ах,0 {Проверяем АХ} jne@NotZero {AX=0?} jmp IsZero {Да – переходим на дальнюю метку} ……. {Нет – продолжаем работу} …….
В таблице термин "выше/ниже" используется применительно к сравнению беззнаковых операндов, а "больше/меньше" – знаковых.
Поскольку условные переходы реализуют ветвление программы на основе проверки флагов, обычно непосредственно перед ними располагаются команды, изменяющие эти флаги, чаще всего – команда сравнения СМР. Ниже показаны комбинации СМР – условный_переход для различных соотношений приемника и источника (первого и второго операнда) команды СМР:
Условие | Для беззнаковых чисел | Для чисел со знаками |
---|---|---|
Приемник больше источника | JA | JG |
Приемник и источник равны | JE | JE |
Приемник меньше источника | JB | JL |
Приемник не меньше источника | JAE | JGE |
Приемник не больше источника | JBE | JLE |
Приемник и источник не равны | JNE | JNE |
Например:
сmр ах,5 {АХ>5?} ja @AboveS {Да, больше – переходим} стр bх, – 3 {ВХ<=-3?} jle @LessM3 {Да, меньше или равен}
Команды LOOP/LOOPE/LOOPNE служат для организации циклов. Все они используют содержимое регистра СХ как счетчик числа повторений. Команда LOOP уменьшает СХ на единицу и передает управление на метку начала цикла, если содержимое этого регистра отлично от нуля. Команды LOOPE/LOOPNE также уменьшают счетчик СХ, но передают управление в начало цикла при совместном условии установки (или сброса) флага ZF и неравенства нулю счетчика СХ.
Вот как, например, можно отыскать нулевой байт в массиве АОВ:
var АОВ: array [1..1000] of Byte; ……. asm mov ex, It)00 {Инициируем счетчик СХ} lea bx,AOB {Помещаем адрес АОВ в ВХ} dec bx {Готовим цикл} {Здесь начало цикла проверки} @@Test: inc bx {Адрес очередного байта} cmp BYTE PTR [bx],0 {Проверяем байт} loopne ©Test {Замыкаем цикл} jnz ©NotZero {Если не найден нулевой байт} ……. {Нашли нулевой байт} end;