JMP (инструкция x86)

Инструкция безусловного перехода на языке ассемблера x86

В языке ассемблера x86 инструкция выполняет безусловный переход. Такая инструкция переносит поток выполнения , изменяя счетчик программ . Существует ряд различных опкодов , которые выполняют переход; в зависимости от того, находится ли процессор в реальном режиме или защищенном режиме , и используется инструкция переопределения, инструкции могут принимать 16-битные , 32-битные или сегментные:смещенные указатели . [1]JMP

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

Следующие примеры иллюстрируют:

  1. относительный переход с 16-битным указателем;
  2. длинный переход (межсегментный), относительный переход с 32-битным указателем;
  3. и косвенный абсолютный переход с использованием регистра EAX .

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

Пример первый: загрузить IP с новым значением 0x89AB, затем загрузить CS с 0xACDCи IP с 0x5578.

JMP 0x89AB JMP 0xACDC : 0x5578  

Пример 2: Загрузка EIP со значением 0x56789AB1только в защищенном или нереальном режиме .

JMP -0x56789AB1 

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

JMP EAX 



Инструкция JMP(Jump) передает управление программой в указанное место в коде. В отличие от вызовов функций, она не сохраняет возвращаемую информацию. Вместо этого она направляет выполнение на целевой адрес , который может быть:

  • Непосредственная ценность ,
  • Регистр общего назначения или
  • Место памяти .

Виды прыжков

Инструкция JMPподдерживает четыре типа прыжков:

  1. Короткий прыжок
    • Переход в диапазоне от -128 до +127 байт относительно текущего указателя инструкций ( EIP).
  2. Рядом Прыжок
    • Переход в текущем сегменте кода (на который указывает CSрегистр).
    • Целью может быть абсолютное смещение (адрес внутри сегмента) или относительное смещение (расстояние от текущего EIP).
  3. Дальний прыжок
    • Переход к другому сегменту кода, но на том же уровне привилегий .
    • Обычно используется при межсегментных прыжках .
  4. Переключатель задач
    • Переход к другой задаче, используемый в защищенном режиме .
    • Инструкция JMPможет ссылаться на шлюз задачи или напрямую указывать сегмент состояния задачи (TSS) .

Короткие и ближние прыжки

Короткий прыжок

  • Относительное смещение — это 8-битное знаковое значение ( rel8), указывающее расстояние от текущего EIP.
  • Реестр CSостается неизменным.

Рядом Прыжок

  • Цель находится в текущем сегменте кода и может быть:
    • Абсолютное смещение (загружается непосредственно в EIP).
    • Относительное смещение ( rel16или rel32), рассчитанное относительно текущего EIP.

Размер операнда

  • Для абсолютных смещений:
    • 16-битный режим очищает два старших байта EIP.
    • 32-битный режим допускает полный диапазон смещения.
  • Для относительных смещений размер ( 8, 16, or 32 bits) зависит от кода операции инструкции и атрибута размера операнда.

Дальние прыжки

Режим реального адреса или виртуального адреса 8086

  • Целевой адрес включает в себя:
    • Селектор сегмента (загружен в CS), и
    • Смещение ( загружено в EIP).

Цель может быть указана:

  1. Непосредственно : кодируется как указатель ( ptr16:16или ptr16:32) в инструкции.
  2. Косвенно : хранится в памяти ( m16:16или m16:32) и извлекается инструкцией.

Защищенный режим

В защищенном режиме дальние прыжки можно использовать для:

  1. Переключение сегментов кода
    • Переход к соответствующему или несоответствующему сегменту кода .
    • Регистр CSобновляется селектором целевого сегмента и EIPсмещением.
  2. Использование шлюза вызова
    • Целевой операнд указывает дескриптор шлюза вызова , который определяет сегмент и смещение для перехода.
    • Такой подход допускает косвенные переходы и предпочтителен для переходов между 16-битными и 32-битными сегментами.
  3. Выполнение переключения задач
    • Цель указывает шлюз задачи или напрямую ссылается на TSS .
    • Селекторы сегментов задачи (код и стек) и EIPзагружаются из TSS.

Особые примечания по переключению задач

  • При использовании JMPдля переключения задач:
    • Флаг вложенной задачи (NT) в EFLAGSрегистре не установлен .
    • Ссылка на предыдущую задачу в новом TSS не обновляется .
    • В результате вы не сможете вернуться к предыдущей задаче, используя IRETинструкцию.
    • Это отличается от CALLинструкции, которая позволяет возвращать задачу путем установки NTфлага и сохранения информации о ссылке на задачу.

Ссылки

  1. ^ "Руководство разработчика программного обеспечения для архитектуры Intel, том 2: Справочное руководство по набору инструкций (6,5 МБ)" (PDF) . Архивировано из оригинала (PDF) 2009-02-19 . Получено 2009-11-03 .
  • Использование коротких (двухбайтовых) инструкций относительного перехода
Взято с "https://en.wikipedia.org/w/index.php?title=JMP_(x86_instruction)&oldid=1262149577"