вторник, 21 сентября 2010 г.

ASM: Команды jump.

Команда безусловного перехода - JMP:

Самый простой способ изменить последовательность выполнения команд
заключается в использовании команды jmp — так называемой команды безусловного
перехода. Она перезаписывает указатель команд (регистр IP или CS), что заставляет процессор «переключиться» на выполнение команды по
указанному адресу. Формат команды таков:



JMP [тип_перехода] операнд.

Команде нужно передать один обязательный операнд — адрес в памяти, с которого процессор должен продолжить выполнение программы.

В зависимости от «расстояния» переходы бывают трех типов: короткие
(short), ближние (near) и дальние (far). Тип перехода задается необязательным
параметром инструкции jmp. Если тип не задан, по умолчанию используется
тип near.

Метка — это идентификатор, заканчивающийся двоеточием. Во время компиляции он будет заменен точным адресом согласно его позиции в программе. Рассмотрим следующий
фрагмент кода:

mov ах,4 ;АХ = 4
new_loop : ;метка new_loop
mov bx, ах ;копируем АХ в ВХ

Чтобы перейти к метке new_loop из другого места программы, используйте
команду:

jmp new_loop ;переходим к new_loop

После выполнения этой команды выполнение программы продолжится с
метки new_loop.

Короткий переход полезен в
ситуации, где метка назначения находится в пределах 128 байтов. Поскольку
команда короткого перехода занимает 2 байта, команда ближнего перехода
занимает 3 байта, а дальнего — 5 байтов, мы можем сэкономить байт или три.

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

jz is_true : переходит к is_true, если флаг ZF = 1
jc is_true : переходит к is_true, если флаг CF = 1
js is_true : переходит к is_true, если флаг SF = 1
jo is_true : переходит к is_true, если флаг переполнения OF = 1

Любое условие может быть инвертировано, например:

jnz is_true : переходит к is_true, если флаг ZF = О

Так же образованы имена команд JNC, JNS и JNO.

Инструкции для беззнаковых чисел:


JE(JZ) - Jump,если равно (Jump,если 0);
JNE(JNZ) - Jump, если не равно (Jump,если не 0);
JA(JNBE) - Jump, если больше (Jump, если не меньше или равно);
JB(JNAE) - Jump, если меньше (Jump, если не больше или равно);
JNA(JBE) - Jump, если не больше (Jump, если меньше или равно);
JNB(JAE) - Jump, если не меньше (Jump, если больше или равно;


Инструкции для чисел со знаком:

JE(JZ) - Jump,если равно (Jump,если 0);
JNE(JNZ) - Jump, если не равно (Jump, если не 0);
JG(JNLE) - Jump, если больше (Jump, если не меньше или равно);
JL(JNGE) - Jump, если меньше (Jump, если не больше или равно);
JNG(JLE) - Jump, если не больше (Jump, если меньше или равно);
JNL(JGE) - Jump, если не меньше (Jump, если больше или равно);

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.