Ассемблер для Windows

       

Команды передачи управления



Команды передачи управления

JMP target Имеет пять форм, различающихся расстоянием назначения от текущего адреса, и способом задания целевого адреса. При работе в Windows используется в основном внутрисегментный переход (NEAR) в пределах 32-битного сегмента. Адрес перехода может задаваться непосредственно (в программе это метка) или косвенно, т.е. содержаться в ячейке памяти или регистре (JMP [EAX]).

Другой тип перехода - короткий переход (SHORT), занимает всего 2 байта. Диапазон смещения, в пределах которого происходит переход: -128 ... 127. Использование такого перехода весьма ограниченно.

Межсегментный переход может иметь следующий вид: JMP FWORD PTR L, L - указатель на структуру, содержащую 48-битный адрес, в начале которого 32-й адрес смещения, затем 16-й селектор (сегмента, шлюза вызова, сегмента состояния задачи). Возможен также и такой вид межсегментного перехода:

JMP FWORD ES:[EDI].

Условные переходы

JA/JNBE - перейти, если выше.

JAE/JNB - перейти, если выше или равно.



JB/JNAE - перейти, если ниже.

JBE/JNA - перейти, если ниже.

JC - перейти, если перенос.

JE/JZ - перейти, если нуль.

JG/JNLE - перейти, если больше.

JGE/JNL - перейти, если больше или равно.

JL/JNGE - перейти, если меньше.

JLE/JNG - перейти, если меньше или равно.

JNC - перейтИ, если нет переноса.

JNE/JNZ - перейти, если меньше или равно.

JNO - перейти, если нет переполнения.

JNP/JPO - перейти, если нет паритета.

JNS - перейти, если нет знака.

JO - перейти, если есть переполнения.

JP/JPE - перейти, если есть паритет.

JS - перейти, если есть знак.

JCXZ - переход, если СХ=0.

JECXZ - переход, если ECX=0.

В плоской модели команды условного перехода осуществляют переход в пределах 32-битного регистра.

Команды управления циклом. Все команды этой группы уменьшают содержимое регистра ECX.

LOOP - переход, если содержимое ECX не равно нулю.

LOOPE (LOOPZ) - переход, если содержимое ECX не равно нулю и флаг ZF=1.

LOOPNE (LOOPNZ) - переход, если содержимое ECX не равно нулю и флаг ZF=0.

CALL target

Передает управление процедуре (метке) с сохранением в стеке адреса, следующей за CALL командой. В плоской модели адрес возврата представляет собой 32-битное смещение. Межсегментный вызов предполагает сохранение в стеке селектора и смещения, т.е. 48-битной величины (16 бит - селектор и 32 бита - смещение). RET [N] Возврат из процедуры. Необязательный параметр N предполагает, что команда также автоматически чистит стек (освобождает N байт). Команда имеет разновидности, которые выбираются ассемблером автоматически, в зависимости от того, является процедура ближней или дальней. Можно, однако, и явно указать тип возврата (RETN или RETF). В случае плоской модели по умолчанию берется RETN с четырехбайтным адресом возврата.

Содержание раздела