Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

Справочная система по языку Assembler

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

Таким образом, команды передачи управления изменяют содержимое регистров cs и eip/ip , в результате чего микропроцессор выбирает для выполнения не следующую по порядку команду программы, а команду в некотором другом участке программы. Конвейер внутри микропроцессора при этом сбрасывается.


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

  1. Команды безусловной передачи управления:
    • команда безусловного перехода;
    • вызова процедуры и возврата из процедуры;
    • вызова программных прерываний и возврата из программных прерываний.
  2. Команды условной передачи управления:
    • команды перехода по результату команды сравнения cmp ;
    • команды перехода по состоянию определенного флага;
    • команды перехода по содержимому регистра ecx/cx.
  3. Команды управления циклом:
    • команда организации цикла со счетчиком ecx/cx;
    • команда организации цикла со счетчиком ecx/cx с возможностью досрочного выхода из цикла по дополнительному условию.

Безусловные переходы

Модификатор может принимать следующие значения:

  • near ptr — прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр eip/ip (в зависимости от заданного типа сегмента кода use16 или use32) на основе указанного в команде адреса (метки) или выражения, использующего символ извлечения значения СчА — $;
  • far ptr — прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16-битного селектора и 16/32-битного смещения, которые загружаются, соответственно, в регистры cs и ip/eip;
  • word ptr — косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти по указанному в команде адресу, или из регистра) только eip/ip. Размер смещения 16 или 32 бит;
  • dword ptr — косвенный переход на метку в другом сегменте кода. Модифицируются (значением из памяти — и только из памяти, из регистра нельзя) оба регистра, cs и eip/ip. Первое слово/двойное слово этого адреса представляет смещение и загружается в ip/eip; второе/третье слово загружается в cs.

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

Адрес_перехода представляет собой адрес в виде метки либо адрес области памяти, в которой находится указатель перехода.

Всего в системе команд микропроцессора есть несколько кодов машинных команд безусловного перехода jmp .
Их различия определяются дальностью перехода и способом задания целевого адреса.
Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором — межсегментным, или дальним.
Внутрисегментный переход предполагает, что изменяется только содержимое регистра eip/ip .
Можно выделить три варианта внутрисегментного использования команды jmp:

  • прямой короткий;
  • прямой;
  • косвенный.

Процедуры

Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP .

Синтаксис описания процедуры таков (рис. 1).

Рис. 1. Синтаксис описания процедуры в программе

Из рис. 1 видно, что в заголовке процедуры (директиве PROC) обязательным является только задание имени процедуры. Среди большого количества операндов директивы PROC следует особо выделить [расстояние] .
Этот атрибут может принимать значения near или far и характеризует возможность обращения к процедуре из другого сегмента кода. По умолчанию атрибут [расстояние] принимает значение near .

Процедура может размещаться в любом месте программы, но так, чтобы на нее случайным образом не попало управление. Если процедуру просто вставить в общий поток команд, то микропроцессор будет воспринимать команды процедуры как часть этого потока и соответственно будет осуществлять выполнение команд процедуры.
Более подробно вопросы, связанные с описанием и использованием процедур в программах ассемблера, рассматриваются на уроках 10 и 14. Примеры использования процедур вы можете посмотреть в приложении 7.

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

Микропроцессор имеет 18 команд условного перехода (см. “Описание команд”). Эти команды позволяют проверить:

  • отношение между операндами со знаком (“больше — меньше”);
  • отношение между операндами без знака (“выше — ниже”)2;
  • состояния арифметических флагов zf, sf, cf, of, pf (но не af).

Команды условного перехода имеют одинаковый синтаксис:
jcc метка_перехода

Как видно, мнемокод всех команд начинается с “ j ” — от слова jump (прыжок), cc — определяет конкретное условие, анализируемое командой.
Что касается операнда метка_перехода, то эта метка может находится только в пределах текущего сегмента кода, межсегментная передача управления в условных переходах не допускается . В связи с этим отпадает вопрос о модификаторе, который присутствовал в синтаксисе команд безусловного перехода. В ранних моделях микропроцессора (i8086, i80186 и i80286) команды условного перехода могли осуществлять только короткие переходы — на расстояние от –128 до +127 байт от команды, следующей за командой условного перехода. Начиная с модели микропроцессора 80386 это ограничение снято, но, как видите, только в пределах текущего сегмента кода.

Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления.
Источниками такого условия могут быть:

  • любая команда, изменяющая состояние арифметических флагов;
  • команда сравнения cmp , сравнивающая значения двух операндов;
  • состояние регистра ecx/cx.

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

Команда сравнения cmp

Синтаксис команды cmp:
cmp операнд_1,операнд_2 (compare) — сравнивает два операнда и по результатам сравнения устанавливает флаги.

Флаги, устанавливаемые командой cmp , можно анализировать специальными командами условного перехода. Прежде чем мы их рассмотрим, уделим немного внимания мнемонике этих команд условного перехода (табл. 1). Понимание обозначений при формировании названия команд условного перехода (элемент в названии команды jcc , обозначенный нами cc ) облегчит их запоминание и дальнейшее практическое использование.

Таблица 1. Значение аббревиатур в названии команды jcc

Мнемоническое обозначениеАнглийскийРусскийТип операндов
E eequalРавноЛюбые
N nnotНеЛюбые
G ggreaterБольшеЧисла со знаком
L llessМеньшеЧисла со знаком
A aaboveВыше, в смысле “больше”Числа без знака
B bbelowНиже, в смысле “меньше”Числа без знака
Таблица 2. Перечень команд условного перехода для команды cmp операнд_1,операнд_2
Типы операндовМнемокод команды условного переходаКритерий условного переходаЗначения флагов для осществления перехода
Любыеjeоперанд_1 = операнд_2zf = 1
Любыеjneоперанд_1<>операнд_2zf = 0
Со знакомjl/jngeоперанд_1 of
Со знакомjle/jngоперанд_1 of or zf = 1
Со знакомjg/jnleоперанд_1 > операнд_2sf = of and zf = 0
Со знакомjge/jnlоперанд_1 => операнд_2sf = of
Без знакаjb/jnaeоперанд_1 операнд_2cf = 0 and zf = 0
Без знакаjae/jnbоперанд_1 => операнд_2cf = 0
Не удивляйтесь тому обстоятельству, что одинаковым значениям флагов соответствует несколько разных мнемокодов команд условного перехода (они отделены друг от друга косой чертой в табл. 2).
Разница в названии обусловлена желанием разработчиков микропроцессора облегчить использование команд условного перехода в сочетании с определенными группами команд. Поэтому разные названия отражают скорее различную функциональную направленность. Тем не менее, то, что эти команды реагируют на одни и те же флаги делает их абсолютно эквивалентными и равноправными в программе. Поэтому в табл. 2 они сгруппированы не по названиям, а по значениям флагов (условиям), на которые они реагируют.

Команды условного перехода и флаги

Таблица 3. Команды условного перехода и флаги

Название флагаНомер бита в eflags/flagКоманда условного переходаЗначение флага для осуществления перехода
Флаг переноса cf1jccf = 1
Флаг четности pf2jppf = 1
Флаг нуля zf6jzzf = 1
Флаг знака sf7jssf = 1
Флаг переполнения of11joof = 1
Флаг переноса cf1jnccf = 0
Флаг четности pf2jnppf = 0
Флаг нуля zf6jnzzf = 0
Флаг знака sf7jnssf = 0
Флаг переполнения of11jnoof = 0
Если внимательно посмотреть на табл. 2 и 3, видно, что многие команды условного перехода в них являются эквивалентными, так как в основе и тех, и других лежит анализ одинаковых флагов.

Команды условного перехода и регистр ecx/cx

Эти команды очень удобно использовать при организации цикла и при работе с цепочками символов.
Нужно отметить ограничение, свойственное команде jcxz/jecxz . В отличие от других команд условной передачи управления, команда jcxz/jecxz может адресовать только короткие переходы — на –128 байт или на +127 байт от следующей за ней команды.

Организация циклов

loop метка_перехода (Loop) — повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Работа команды заключается в выполнении следующих действий:

  • декремента регистра ecx/cx;
  • сравнения регистра ecx/cx с нулем:
    • если (ecx/cx) > 0, то управление передается на метку перехода;
    • если (ecx/cx) = 0, то управление передается на следующую после loop команду.


loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0.
Команды loope и loopz — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравиться. Работа команд заключается в выполнении следующих действий:

  • декремента регистра ecx/cx;
  • сравнения регистра ecx/cx с нулем;
  • анализа состояния флага нуля zf:
    • если (ecx/cx) > 0 и zf = 1, управление передается на метку перехода;
    • если (ecx/cx) = 0 или zf = 0, управление передается на следующую после loop команду.

loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1.
Команды loopne и loopnz также абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

  • декремента регистра ecx/cx;
  • сравнения регистра ecx/cx с нулем;
  • анализа состояния флага нуля zf:
    • если (ecx/cx) > 0 и zf = 0, управление передается на метку перехода;
    • если (ecx/cx)=0 или zf=1, управление передается на следующую после loop команду.

Команды loope/loopz и loopne/loopnz по принципу своей работы являются взаимообратными. Они расширяют действие команды loop тем, что дополнительно анализируют флаг zf, что дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора.

Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду jmp, поэтому постарайтесь освоить оба способа организации циклов.

Переходы (прыжки)

Для корректной обработки данных в ассемблере нужна разветвленность программы. Это достигается использованием условных переходов. Условный переход это такая команда процессору, при которой в зависимости от состояния регистра флагов производится передача управления по некоторому адресу иначе говоря прыжок. Этот адрес может быть ближним или дальним. Прыжок считается ближним, если адрес, на который делается прыжок, находится не дальше чем 128 байт назад и 127 байт вперёд от следующей команды. Дальний прыжок это прыжок дальше, чем на [-128,127] байт. Прыгать просто так в любом месте программы бессмысленно. Каждая команда изменяет регистр флагов в зависимости от результата своей операции. Обычно перед командой прыжка идёт команда сравнения, которая изменяет регистр флагов в зависимости от результата. Команд сравнения две: cmp и test. Наиболее универсальная cmp. О команде test я вам расскажу позже. Команда Cmp производит сравнение двух операндов. Она сравнивает два значения (регистр, память, непосредственное значение) и устанавливает флаг нуля Z (zeroflag) если они равны.

Регистр флагов.

Регистр флагов имеет набор флагов, которые устанавливаются или сбрасываются в зависимости от вычислений или других событий. Я не буду расказывать о всех, а только о некоторых важных:

ZF (Zero flag, Флаг нуля) — Этот флаг устанавливается, когда результат вычисления нулевой (чтобы сравнить — фактически substraction без того, чтобы сохранить(экономить) результаты, но устанавливать флажки только). This flag is set when the result of a calculation is zero (сравнение это фактически вычитание без сохранения результата, и установка соответствующих флагов).

SF (Sign flag, Флаг знака) — Если установлен, значит результат вычисления — отрицательное число.

CF (Carry flag, Флаг переноса — Флаг переноса, содержит крайний левый (старший) бит после вычислений.

OF (Overflow flag, Флаг переполнения — Указывает переполнение результата вычисления, т.е. результат больше, приемник.

Есть еще большое количество флагов (флаг паритета (pf), вспомогательный флаг переноса (af), флаг трассировки (tf), флаг прерывания (if), флаг управления (df), флаг уровня привилегий ввода/вывода (iopl) , флаг вложенности задачи (nt), флаг возобновления (rf), флаг виртуального режима (vm)) но так как мы не будем их использовать, я не буду о них рассказывать.

Прыжки.

Приведу пример самой распространённой команды условного перехода jz:

Если регистр eax равен 42, то управление передастся первой команде после метки metka2.

Также есть команда безусловного перехода — jmp. Она передаёт управление в любом случае. Вы скажете: «Для этого нужна команда call». Я отвечу: «Команда call пихает в стек адрес возврата, а jmp не трогает стек». Условные переходы могут делать только ближний прыжок, а команда jmp может делать и короткий и дальний прыжки. Вот таблица всех условных переходов.

ОпкодЗначение(переход,если. )Условие
JAJump if above (X > Y)CF=0 & ZF=0
JAEJump if above or equal (X >= Y)CF=0
JBJump if below (XCF=1
JBEJump if below or equal (XCF=1 or ZF=1
JCJump if carry (cf=1)CF=1
JCXZJump if CX=0регистр CX=0
JE (то же, что и JZ)Jump if equal (X = Y)ZF=1
JGJump if greater (signed) (X > Y)ZF=0 & SF=OF
JGEJump if greater or equal (signed) (X >= Y)SF=OF
JLJump if less (signed) (XSF != OF
JLEJump if less or equal (signed) (XZF=1 or SF!=OF
JMPБезусловный переход
JNAJump if not above (XCF=1 or ZF=1
JNAEJump if not above or equal (XCF=1
JNBJump if not below (X >= Y)CF=0
JNBEJump if not below or equal (X > Y)CF=1 & ZF=0
JNCJump if not carry (cf=0)CF=0
JNEJump if not equal (X != Y)ZF=0
JNGJump if not greater (signed) (XZF=1 or SF!=OF
JNGEJump if not greater or equal (signed) (XSF!=OF
JNLJump if not less (signed) (X >= Y)SF=OF
JNLEJump if not less or equal (signed) (X > Y)ZF=0 & SF=OF
JNOJump if not overflow (signed) (of=0)OF=0
JNPJump if no parity (pf=0)PF=0
JNSJump if not signed (signed) (sf=0)SF=0
JNZJump if not zero (X != Y)ZF=0
JOJump if overflow (signed) (of=1)OF=1
JPJump if parity (pf=1)PF=1
JPEJump if parity even (PF=1
JPOJump if parity oddPF=0
JSJump if signed (signed)SF=1
JZJump if zero (X = Y)ZF=1

Все команды перехода имеют один операнд: смещение для перехода.

Организация циклов.

Иногда надо организовать цикл, т.е. совершить повторение количество раз, которое указано в регистре ECX. Следовательно, надо у теле цикла уменьшать значение ECX. Именно для этого предназначена команда loop. Он проверяет, равен ли регистр ECX нулю, если он не равен нулю, то значение регистра ECX уменьшается на 1 и совершается ближний прыжок на смещение указанное в операнде.

Тело цикла выполнится 23h раза.

Команда loope делает то же самое, но перед прыжком проверяет, установлен ли флаг ZF, если он установлен, то прыжок совершается. Точно тоже самое делает команда loopz. Команды loopne и loopnz делают то же сомое что и loope, но прыгают, если флаг ZF сброшен.

С переходами разобрались. Разобрались не только с переходами, но и с циклами. Продолжаем изучение ассемблера, читаем следующий урок.

Ассемблер. Условия

Обновл. 16 Ноя 2019 |

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

Типы прыжков

Есть 2 типа выполнения условий в ассемблере:

Прыжок без условия (или ещё «безусловный прыжок») — выполняется инструкцией JMP . Выполнение данной инструкции часто включает передачу управления в адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Результатом передачи управления может быть выполнение нового набора инструкций или повторное выполнение текущих инструкций.

Прыжок с условием (или ещё «условный прыжок») — выполняется с помощью инструкций типа J и зависит от самого условия. Условные инструкции, изменяя значение смещения в регистре IP , передают управление, прерывая последовательный поток выполнения кода.

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

Инструкция CMP

Инструкция CMP (от англ. «COMPARE») сравнивает два операнда. Фактически, она выполняет операцию вычитания между двумя операндами для проверки того, равны ли эти операнды или нет. Используется вместе с инструкцией условного прыжка.

Синтаксис инструкции CMP :

CMP назначение, источник

Инструкция CMP сравнивает два числовых поля. Операнд назначения может находиться либо в регистре, либо в памяти. Исходным операндом ( источник ) могут быть константы, регистры или память.

Инструкция CMP часто используется для проверки того, достигла ли переменная-счётчик максимального количества раз выполнения цикла или нет.

Прыжок без условия

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

В следующем примере мы рассмотрим использование инструкции JMP :

Прыжок с условием

Если в условном прыжке выполняется указанное условие, то точка выполнения программы переносится в указанную инструкцию. Существует множество инструкций условного прыжка в зависимости от условия и данных.

Ниже приведены инструкции условного прыжка, используемые для данных со знаком в арифметических операциях:

Инструкция Описание Тестируемые флаги
JE / JZJ ump E qual (равно) или J ump Z ero (ноль)ZF
JNE / JNZJ ump N ot E qual (не равно) или J ump N ot Z ero (не ноль)ZF
JG / JNLEJ ump G reater (больше) или J ump N ot L ess/ E qual (не меньше/равно)OF, SF, ZF
JGE / JNLJ ump G reater/ E qual (больше/равно) или J ump N ot L ess (не меньше)OF, SF
JL / JNGEJ ump L ess (меньше) или J ump N ot G reater/ E qual (не больше/равно)OF, SF
JLE / JNGJ ump L ess/ E qual (меньше/равно) или J ump N ot G reater (не больше)OF, SF, ZF

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

Инструкция Описание Тестируемые флаги
JE / JZJ ump E qual (равно) или J ump Z ero (ноль)ZF
JNE / JNZJ ump N ot E qual (не равно) или J ump N ot Z ero (не ноль)ZF
JA / JNBE J ump A bove (больше) или J ump N ot B elow/ E qual (не меньше/равно)CF, ZF
JAE / JNBJ ump A bove/ E qual (больше/равно) или J ump N ot B elow (не меньше)CF
JB / JNAEJ ump B elow (меньше) или J ump N ot A bove/ E qual (не больше/равно)CF
JBE / JNA J ump B elow/ E qual (меньше/равно) или J ump N ot A bove (не больше)AF, CF

Следующие инструкции условного прыжка имеют специальное использование и проверяют значение флагов:

Инструкция Описание Тестируемые флаги
JCXZJ ump если CX равно Z eronone
JC J ump если C arry (перенос)CF
JNCJ ump если N o C arry (нет переноса)CF
JOJ ump если O verflow (переполнение)OF
JNO J ump если N o O verflow (нет переполнения)OF
JP / JPE J ump P arity или J ump P arity E ven (если чётность)PF
JNP / JPO J ump N o P arity или J ump P arity O dd (если нечётность)PF
JSJ ump S ign (отрицательное значение)SF
JNS J ump N o S ign (положительное значение)SF

Пример синтаксиса набора инструкций типа J :

Система команд x86

Влияние команды на флаги и форматы команды:

Короткий переход, если выше (CF=0 и ZF=0)

Короткий переход, если выше или равно (CF=0)

Короткий переход, если ниже (CF=1)

Короткий переход, если ниже или равно (CF=1 или ZF=1)

Короткий переход, если перенос (CF=1)

Короткий переход, если CX=0

Короткий переход, если ECX=0

Короткий переход, если равно (ZF=1)

Короткий переход, если нуль (ZF=1)

Короткий переход, если больше (ZF=0 и SF=OF)

Короткий переход, если больше или равно (SF=OF)

Короткий переход, если меньше (SF<>OF)

Короткий переход, если меньше или равно (ZF=1 или SF<>OF)

Короткий переход, если не выше (CF=1 или ZF=1)

Короткий переход, если не выше или равно (CF=1)

Короткий переход, если не ниже (CF=0)

Короткий переход, если не ниже или равно (CF=0 и ZF=0)

Короткий переход, если не перенос (CF=0)

Короткий переход, если не равно (ZF=0)

Короткий переход, если не больше (ZF=1 или SF<>OF)

Короткий переход, если не больше или равно (SF<>OF)

Короткий переход, если не меньше (SF=OF)

Короткий переход, если не меньше или равно (ZF=0 и SF=OF)

Короткий переход, если не переполнение (OF=0)

Короткий переход, если нечетно (PF=0)

Короткий переход, если положительно (SF=0)

Короткий переход, если не нуль (ZF=0)

Короткий переход, если переполнение (OF=1)

Короткий переход, если паритет (PF=1)

Короткий переход, если четно (PF=1)

Короткий переход, если нечетно (PF=0)

Короткий переход, если отрицательно (SF=1)

Ближний переход, если выше (CF=0 и ZF=0)

Ближний переход, если выше или равно (CF=0)

Ближний переход, если ниже (CF=1)

Ближний переход, если ниже или равно (CF=1 или ZF=1)

Ближний переход, если перенос (CF=1)

Ближний переход, если равно (ZF=1)

Ближний переход, если нуль (ZF=1)

Ближний переход, если больше (ZF=0 и SF=OF)

Ближний переход, если больше или равно (SF=OF)

Ближний переход, если меньше (SF<>OF)

Ближний переход, если меньше или равно (ZF=1 или SF<>OF)

Ближний переход, если не выше (CF=1 или ZF=1)

Ближний переход, если не выше или равно (CF=1)

Ближний переход, если не ниже (CF=0)

Ближний переход, если не ниже или равно (CF=0 и ZF=0)

Ближний переход, если не перенос (CF=0)

Ближний переход, если не равно (ZF=0)

Ближний переход, если не больше (ZF=1 или SF<>OF)

Ближний переход, если не больше или равно (SF<>OF)

Ближний переход, если не меньше (SF=OF)

Ближний переход, если не меньше или равно (ZF=0 и SF=OF)

Ближний переход, если не переполнение (OF=0)

Ближний переход, если нечетно (PF=0)

Ближний переход, если положительно (SF=0)

Ближний переход, если не нуль (ZF=0)

Ближний переход, если переполнение (OF=1)

Ближний переход, если паритет (PF=1)

Ближний переход, если четно (PF=1)

Ближний переход, если нечетно (PF=0)

Ближний переход, если отрицательно (SF=1)

Описание:

Команды условного перехода (исключая команду JCXZ) проверяют флаги, которые были установлены предыдущей командой. Условия для каждой мнемоники указаны выше. Термины «меньше» и «больше» используются для сравнения знаковых целых, «выше» и «ниже» используются для беззнаковых целых.

Если заданное условие исполняется, то происходит переход на местоположение, указанное операндом, если условие не исполняется то перехода не происходит и процессор продолжает работу со следующей команды.

Команды условного перехода используют непосредственные операнды rel8, rel16 или rel32, которые добавляются к текущему значению указателя команд (EIP) для определения точного адреса перехода. Наиболее эффективны команды с операндом rel8, цель которых может находиться в текущем кодовом сегменте в диапазоне от -128 до +127 байт относительно первого байта следующей команды. Относительный адрес также может задаваться операндом rel16 со значениями от -32768 до +32767 (при атрибуте размера адреса равном 16 бит) или rel32 — от -2 31 до +2 31 (при атрибуте размера адреса равном 32 бита).

Когда цель условного перехода находится в другом сегменте, прямое программирование условных дальних переходов не возможно — необходимо использовать противоположную форму команды перехода (например, вместо команды JE — команду JNE) и далее команду безусловного дальнего перехода в другой сегмент. Например, если нельзя запрограммировать:

то вместо этого программируется:

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

Команда JCXZ отличается от других команд условного перехода тем, что она проверяет содержимое регистра CX или ECX на нуль, а не состояние флагов. Команда JCXZ полезна вначале условного цикла, который завершается командой условного цикла (например, такой как LOOPNE). Команда JCXZ предотвращает вхождение в цикл с регистром CX или ECX равным нулю.

Операция:

tempEIP = EIP + SignExtend(DEST);

IF OperandSize = 16

THEN tempEIP = tempEIP AND 0x0000FFFFh;

IF (tempEIP выходит за пределы кодового сегмента)

ELSE EIP = tempEIP;

Особые ситуации защищенного режима:

#GP(0), если при переходе смещение выходит за пределы кодового сегмента.

Intel386 … :
#UD при использовании префикса LOCK.

Особые ситуации режима реальной адресации:

#GP, если при переходе смещение выходит за пределы кодового сегмента, что возможно только при применении префикса 32-битного адреса.

Intel386 … :
#UD при использовании префикса LOCK.

Особые ситуации режима V86:

#GP, если при переходе смещение выходит за пределы кодового сегмента, что возможно только при применении префикса 32-битного адреса.

Читать еще:  Ассемблер арифметические операции
Ссылка на основную публикацию
Adblock
detector