Иллюстрированный самоучитель по Turbo Pascal

Система команд

Команды условных переходов способны передавать управление на метку, расположенную в пределах ближайших плюс-минус 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;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.