Найти в Дзене
Junior Coder

Ассемблер. Условные и безусловные переходы.

Условных переходов в ассемблере много: JE, JNE, JAE,JC и др., поэтому, чтобы с ними разобраться лучше запомнить переводы символьных обозначений: Jump - прыжок (в смысле - переход) E - Equal   - равно A - Above  - больше B - Below  - ниже (меньше) Z - Zero    - зеро, 0 G - Greated - больше L - Less     - меньше N - Not     - нет O - Overflow - переполнение P - Parity    - паритет, четность S - Sign      - признак (нуля) C - Carry    - перенос Теперь все становится понятным: JE - переход если равно JNE - если не равно JAE, JNB - если больше или равно JNAE, JB - если меньше JA, JNBE - если больше JNP, JPO - если нечетное JP, JPE - если четное (PF) JZ - если ноль JNZ - если не ноль JNS - если больше нуля JS - если меньше нуля (SF) JC - если установлен флаговый регистр CF JNO - если нет переполнения JO - битовое переполнение регистра, происходит, например, когда при операции умножения результат не помещается в регистр преднозначенный для его сохранения JCXZ - если регистр CX равен нулю Сле

Условных переходов в ассемблере много: JE, JNE, JAE,JC и др., поэтому, чтобы с ними разобраться лучше запомнить переводы символьных обозначений:

Jump - прыжок (в смысле - переход)

E - Equal   - равно

A - Above  - больше

B - Below  - ниже (меньше)

Z - Zero    - зеро, 0

G - Greated - больше

L - Less     - меньше

N - Not     - нет

O - Overflow - переполнение

P - Parity    - паритет, четность

S - Sign      - признак (нуля)

C - Carry    - перенос

Теперь все становится понятным:

JE - переход если равно

JNE - если не равно

JAE, JNB - если больше или равно

JNAE, JB - если меньше

JA, JNBE - если больше

JNP, JPO - если нечетное

JP, JPE - если четное (PF)

JZ - если ноль

JNZ - если не ноль

JNS - если больше нуля

JS - если меньше нуля (SF)

JC - если установлен флаговый регистр CF

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

JO - битовое переполнение регистра, происходит, например, когда при операции умножения результат не помещается в регистр преднозначенный для его сохранения

JCXZ - если регистр CX равен нулю

Следует знать, что все инструкции условных переходов зависят от состояния флагового регистра. Не буду все описывать, подробнее можно посмотреть в мануале по опкодам. В поисковике забейте: download opcode x86.

Команды для знаковых чисел: JG, JNLE, JGE, JNL, JL, JNGE, JLE, JNG, JNS, JS.

Для беззнаковых: JA, JNBE, JAE, JNB, JNC, JB, JNAE, JC, JBE, JNA.

Общие для знаковых и беззнаковых: JZ, JE, JNE, JNZ, JNO, JO.

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

Многие функции меняют значие флагов флагового регистра и возвращают код ошибки, если она произошла. Ниже код программы, который позволяет лучше понять как это происходит. Написана чисто для примера.

-2

-3

Программа откомпилировалась, должна работать, но она ничего не делает, только открывает файл, которого, кстати, у меня нет на компьютере, поэтому я ее не проверял.

JMP - безусловный переход, то есть выполняется в любом случае.

Переходы бывают дальними, ближними и короткими. Ближний переход - это когда метка находится в том же сегменте откуда происходит вызов - JMP. Обозначают это так:

JMP NEAR MARK

команда near подразумевается по умолчанию, поэтому обычно ее не пишут:

JMP MARK

Короткий переход - short, обычно тоже не обозначают. Используется иногда если метка находится в пределах - 128 ..+127 байт (0 - это тоже число).

Дальний переход - это когда метка находится в другом сегменте исполняемого кода, вот его лучше обозначать всегда:

JMP FAR MARK 

Часто JMP используют для того, чтобы пропустить неисполняемый код, например, данные. Для примера рассмотрим загрузочный сектор FAT-диска (см. скриншот ниже). EB - это машинный код команды short jmp, далее идет смещение в байтах (58), затем команда NOP - нет операции, ее машинный код - 90h. Смещение (байты) нужно отсчитывать после обозначения, то есть с команды NOP в шестнадцатиричном исчислении. Этот пример поможет понять, как компилируются переходы.

-4

На этом все. Надеюсь, что вы узнали из статьи что-то полезное для себя.

Поставьте лайк, пожалуйста, если узнали что-то новое для себя.

#ассемблер #условные переходы #jmp