с какими операциями используется команда jump
Заметки охотника
вторник, 21 сентября 2010 г.
ASM: Команды jump.
Самый простой способ изменить последовательность выполнения команд
заключается в использовании команды 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 байтов, мы можем сэкономить байт или три.
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.
Инструкции для беззнаковых чисел:
Инструкции для чисел со знаком:
Переходы (прыжки)
Для корректной обработки данных в ассемблере нужна разветвленность программы. Это достигается использованием условных переходов. Условный переход это такая команда процессору, при которой в зависимости от состояния регистра флагов производится передача управления по некоторому адресу иначе говоря прыжок. Этот адрес может быть ближним или дальним. Прыжок считается ближним, если адрес, на который делается прыжок, находится не дальше чем 128 байт назад и 127 байт вперёд от следующей команды. Дальний прыжок это прыжок дальше, чем на [-128,127] байт. Прыгать просто так в любом месте программы бессмысленно. Каждая команда изменяет регистр флагов в зависимости от результата своей операции. Обычно перед командой прыжка идёт команда сравнения, которая изменяет регистр флагов в зависимости от результата. Команд сравнения две: cmp и test. Наиболее универсальная cmp. О команде test я вам расскажу позже. Команда Cmp производит сравнение двух операндов. Она сравнивает два значения (регистр, память, непосредственное значение) и устанавливает флаг нуля Z (zeroflag) если они равны.
Регистр флагов.
Регистр флагов имеет набор флагов, которые устанавливаются или сбрасываются в зависимости от вычислений или других событий. Я не буду расказывать о всех, а только о некоторых важных:
Прыжки.
Приведу пример самой распространённой команды условного перехода jz:
Если регистр eax равен 42, то управление передастся первой команде после метки metka2.
Все команды перехода имеют один операнд: смещение для перехода.
Организация циклов.
Иногда надо организовать цикл, т.е. совершить повторение количество раз, которое указано в регистре ECX. Следовательно, надо у теле цикла уменьшать значение ECX. Именно для этого предназначена команда loop. Он проверяет, равен ли регистр ECX нулю, если он не равен нулю, то значение регистра ECX уменьшается на 1 и совершается ближний прыжок на смещение указанное в операнде.
Тело цикла выполнится 23h раза.
Команда loope делает то же самое, но перед прыжком проверяет, установлен ли флаг ZF, если он установлен, то прыжок совершается. Точно тоже самое делает команда loopz. Команды loopne и loopnz делают то же сомое что и loope, но прыгают, если флаг ZF сброшен.
С переходами разобрались. Разобрались не только с переходами, но и с циклами. Продолжаем изучение ассемблера, читаем следующий урок.
Ассемблер. Условия
Обновл. 19 Сен 2021 |
К условиям в ассемблере относятся инструкции циклов и ветвления. Эти инструкции могут изменять поток выполнения кода в программе.
Типы прыжков
Есть 2 типа выполнения условий в ассемблере:
Прыжок без условия (или «безусловный прыжок») — выполняется инструкцией JMP. Выполнение данной инструкции часто включает в себя передачу управления в адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Результатом передачи управления может быть выполнение нового набора инструкций или повторное выполнение текущих инструкций.
Прыжок с условием (или «условный прыжок») — выполняется с помощью инструкций типа J и зависит от самого условия. Условные инструкции, изменяя значение смещения в регистре IP, передают управление, прерывая последовательный поток выполнения кода.
Прежде чем разбираться с этими двумя типами инструкций детально, давайте рассмотрим инструкцию CMP.
Инструкция CMP
Инструкция CMP (от англ. «COMPARE») сравнивает два операнда. Фактически, она выполняет операцию вычитания между двумя операндами для проверки того, равны ли эти операнды или нет. Используется вместе с инструкцией условного прыжка.
Синтаксис инструкции CMP:
CMP назначение, источник
Инструкция CMP сравнивает два числовых поля. Операнд назначения может находиться либо в регистре, либо в памяти. Исходным операндом ( источник ) могут быть константы, регистры или память. Например:
Инструкция CMP часто используется для проверки того, достигла ли переменная-счетчик максимального количества раз выполнения цикла или нет. Например:
Прыжок без условия
Как мы уже говорили, безусловный прыжок выполняется инструкцией JMP, которая включает в себя имя метки, куда следует перебросить точку выполнения программы:
В следующем примере мы рассмотрим использование инструкции JMP:
Прыжок с условием
Если при выполнении операции условного прыжка выполняется обозначенное условие, то точка выполнения программы переносится в указанную инструкцию. Существует множество инструкций условного прыжка, в зависимости от условия и данных.
Ниже приведены инструкции условного прыжка, используемые для данных со знаком в арифметических операциях:
Инструкция | Описание | Тестируемые флаги |
JE / JZ | J ump E qual (равно) или J ump Z ero (ноль) | ZF |
JNE / JNZ | J ump N ot E qual (не равно) или J ump N ot Z ero (не ноль) | ZF |
JG / JNLE | J ump G reater (больше) или J ump N ot L ess/ E qual (не меньше/равно) | OF, SF, ZF |
JGE / JNL | J ump G reater/ E qual (больше/равно) или J ump N ot L ess (не меньше) | OF, SF |
JL / JNGE | J ump L ess (меньше) или J ump N ot G reater/ E qual (не больше/равно) | OF, SF |
JLE / JNG | J ump L ess/ E qual (меньше/равно) или J ump N ot G reater (не больше) | OF, SF, ZF |
В следующей таблице приведены инструкции условного прыжка, используемые для данных без знака в логических операциях:
Инструкция | Описание | Тестируемые флаги |
JE / JZ | J ump E qual (равно) или J ump Z ero (ноль) | ZF |
JNE / JNZ | J 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 / JNB | J ump A bove/ E qual (больше/равно) или J ump N ot B elow (не меньше) | CF |
JB / JNAE | J 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 |
Следующие инструкции условного прыжка имеют специальное использование и проверяют значение флагов:
Инструкция | Описание | Тестируемые флаги |
JCXZ | J ump если CX равно Z ero | none |
JC | J ump если C arry (перенос) | CF |
JNC | J ump если N o C arry (нет переноса) | CF |
JO | J 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 |
JS | J ump S ign (отрицательное значение) | SF |
JNS | J ump N o S ign (положительное значение) | SF |
Пример синтаксиса набора инструкций типа J :
С какими операциями используется команда jump
6.4.3. Группы команд МП
Систему команд, реализуемую МП, принято разделять на группы команд в соответствии с их функциональным назначением. По этому признаку выделяют пять групп команд: 1) пересылки информации, 2) арифметических операций; 3) логических операций; 4) ветвления; 5) управления.
Группу команд пересылки информации образуют команды организации двустороннего обмена между внешней памятью и блоком РОН или между различными регистрами блока РОН.
Группа команд арифметических операций выполняет такие операции, как суммирование — ADD, вычитание — SUBTRACT, добавление единицы — INCREMENT или вычитание единицы —DECREMENT. эта группа команд адресует только один из операндов, иторой операнд хранится в аккумуляторе. Результат выполнения операции фиксируется в аккумуляторе.
Группа команд логических операций содержит команды, реализующие операции И (AND), ИЛИ (OR), исключающее ИЛИ (EXCLUSIVE OR), и также сравнение (COMPARE) над данными. Так же кик команды арифметических операций, эти команды адресуют только один из операндов, второй операнд всегда находится в аккумуляторе. Результат операции образуется в аккумуляторе.
Группа команд ветвления образуется набором условных и безусловных команд перехода JUMP и JUMP IF, команд вызова подпрограмм CALL и команд возврата RETURN. Группа команд JUMP IF используется тогда, когда по результату выполнения некоторой операции выбирается направление дальнейших вычислений.
Команды CALL и RETURN служат для организации связи основной программы с подпрограммами, т. е. для входа в подпрограмму и последующего возврата к основной программе. В МП-системах и микро-ЭВМ команды «той группы получили широкое применение, так как по Подпрограммам выполняются как арифметические операции типа умножения, деления, вычисления некоторых функций, так и операции ввода-вывода.
Группу команд управления образуют команды, управляющие процедурами ввода-вывода информации, операциями со стеком, и команды проверки текущего состояния процессора. В этой группе команд наибольшую сложность представляют вопросы использования команд ввода-вывода информации. Организация системных пересылок является наиболее трудной частью работы разработчика и программиста МП-системы. Она требует детального знания как методов программирования, так и внутренней логической организации МП, интерфейса системы и достаточно сложных алгоритмов управления адаптерами периферийных устройств.
С какими операциями используется команда jump
Средства и методы программирования
Назначение: используется в программе для организации безусловного перехода как внутри текущего сегмента команд, так и за его пределы. При определенных условиях в защищенном режиме работы команда jmp может использоваться для переключения задач.
Для понимания различий механизмов перехода в реальном и защищенном режимах нужно помнить следующее. В реальном режиме микропроцессор просто изменяет cs и eip/ip в соответствии с содержимым указателя в памяти. В защищенном режиме микропроцессор предварительно анализирует байт прав доступа AR в дескрипторе, номер которого определяется по содержимому сегментной части указателя. В зависимости от состояния байта AR микропроцессор выполняет либо переход, либо переключение задач.
Состояние флагов после выполнения команды (за исключением случая переключения задач):
выполнение команды не влияет на флаги
Применение: Команду jmp применяют для осуществления ближних и дальних безусловных переходов без сохранения контекста точки перехода.
(Load Effective Address)
Загрузка эффективного адреса
lea приемник,источник
Назначение: получение эффективного адреса (смещения) источника.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги
Применение: Данная команда является альтернативой оператору ассемблера offset. В отличие от offset команда lea допускает индексацию операнда, что позволяет более гибко организовать адресацию операндов.
Умножение целочисленное без учета знака
Назначение: операция умножения двух целых чисел без учета знака.
Состояние флагов после выполнения команды (если старшая половина результата нулевая):