Команды jmp—перезаписывает указатель команд (регистр IP или CS), что заставляет процессор «переключиться» на выполнение команды по указанному адресу.
Формат команды:
Команда JMP — аналог конструкции GOTO, которая используется в высокоуровневых языках программирования. Команде нужно передать один обязательный операнд — адрес в памяти, с которого процессор должен продолжить выполнение программы. Операнд может быть указан явно (непосредственное значение адреса) или быть регистром общего назначения, в который загружен требуемый адрес.
В зависимости от «расстояния» переходы бывают трех типов: короткие (short), ближние (near) и дальние (far). Тип перехода задается необязательным параметром инструкции jmp. Если тип не задан, по умолчанию используется тип near.
Максимальная «длина» короткого перехода может быть в пределах от -128 до 127 байтов.
«Длина» ближнего перехода (near) зависит только от режима процессора. В реальном режиме меняется только значение IP, поэтому перехода может быть только в пределах одного сегмента (то есть в пределах 64 Кб); в защищенном режиме используется EIP, поэтому целевой адрес может быть где угодно в пределах 4 Гб адресного пространства.
Переход типа far модифицирует кроме IP еще и сегментный регистр CS, который используется при вычислении фактического адреса памяти. Поэтому команда перехода должна содержать новое значение CS.
Метка — это идентификатор, заканчивающийся двоеточием. Во время компиляции он будет заменен точным адресом согласно его позиции в программе.
Рассмотрим следующий фрагмент кода:
Чтобы перейти к метке new_loop из другого места программы, используется команда:
После выполнения этой команды выполнение программы продолжится с метки new_loop.
В языке ассемблера имеется множество команд условного перехода. Имена этих команд различаются в зависимости от условия перехода. Условие состоит из значений одного или нескольких флагов в регистре признаков. Работают эти команды одинаково: если условие истинно, выполняется переход на указанную метку, если нет, то процессор продолжит выполнять программу со следующей команды.
Общий формат команд условного перехода следующий:
Рассмотрим наиболее часто встречающиеся команды:
Рассмотрим сводную таблицу команд условного перехода в зависимости от условия, которое проверяет процессор (чтобы не писать «для перехода», будем использовать сокращение jump)
В первой строке таблицы указано условие перехода. Во второй строке показаны соответствующие команды условного перехода (в скобках — их дополнительные названия).
Пример. Перейти к метке if_three, если регистр АХ содержит значение 3.
Прежде всего мы должны проверить, есть ли в регистре АХ тройка. Для этого используем команду СМР:
Для проверки равенства применим команду JZ, как показано в таблице команд
условного перехода:
Следующий пример показывает беззнаковое сравнение CL и AL. Если оба значения равны, то в регистр BL помещается значение 1, если AL больше, чем CL, то BL=2, а если AL меньше CL, то BL=3.