2.1.6 Инструкции передачи управления
2.1.7 Инструкции ввода-вывода
2.1.8 Строковые операции
2.1.9 Инструкции управления флагами
2.1.10 Условные операции
2.1.11 Разные инструкции
2.1.12 Системные инструкции
2.1.6 Инструкции передачи управления
"jmp"
безоговорочно передает управление а заданное место. Адрес назначения
может быть определен непосредственно в инструкции или косвенно через
регистр или память, допустимый размер адреса зависит от того, какой
переход, близкий или дальний, а также от того, какая инструкция,
16-битная или 32-битная. Операнд для близкого перехода должен быть
размером "word" для 16-битной инструкции и размером "dword" для
32-битной инструкции. Операнд для дальнего перехода должен быть
размером "dword" для 16-битной инструкции и размером "pword" для
32-битной инструкции. Прямая инструкция "jmp" содержит адрес назначения
как часть инструкции, операндом, определяющим этот адрес, должно быть
числовое выражение для близкого перехода и два числа, разделенные
двоеточием, для дальнего перехода, первое определяет номер сегмента,
второе - смещение внутри сегмента. Непрямая инструция "jmp" получает
адрес назначения через регистр или переменную-указатель, операндом
должен быть регистр общего назначения или память. Для более подробной
информации смотрите также 1.2.5.
jmp 100h ; прямой близкий переход
jmp 0FFFFh:0 ; прямой дальний переход
jmp ax ; непрямой близкий переход
jmp pword [ebx] ; непрямой дальний переход
"call"
передает управление процедуре, сохраняя в стеке адрес инструкции,
следующей за "call", для дальнейшего возвращения к ней инструкцией
"ret". Правила для операндов такие же, что с инструкцией "jmp", но
"call" не имеет короткого варианта в виде прямой инструкции, и поэтому
не оптимизирована.
"ret",
"retn" и "retf" прекращают выполнение процедуры передают управление
назад программе, которая изначально вызвала эту процедуру, используя
адрес, который был сохранен в стеке инструкцией "call". "ret" это
эквивалент "retn", которая возвращает из процедуры, которая была
вызвана с использованием близкого перехода, тогда как "retf" возвращает
из процедуры, которая была вызвана с использованием дальнего перехода.
Эти инструкции подразумевают размер адреса, соответствующий текущей
установке кода, но этот размер может быть изменен на 16-битный с
помощью мнемоников "retw", "retnw" и "retfw" и на 32-битный с помощью
"retd", "retnd" и "retfd". Все эти инструкции могут опционально
предписывать непосредственный операнд, если добавить константу к
указателю стека, они эффективно удаляют любые аргументы, которые
вызвающая программа положила в стек перед выполнением инструкции "call".
"iret"
возвращает управление прерванной процедуре. Эта инструкция отличается
от "ret" в том, что она также выводит из стека флаги в регистр флагов.
Флаги сохраняются в стек механизмом прерывания. Инструкция
подразумевает размер адреса, соответствующий текущей установке кода, но
этот размер может быть изменен на 16-битный или на 32-битный с помощью
мнемоников "iretw" или "iretd".