ХАНДЫФАР

Инструкция JMP


Переход к инструкции, указанной в операнде.


JMP rel8 - Короткий переход на относительный адрес rel8.

JMP rel16 - Короткий переход на относительный адрес rel16.

JMP reg/mem16 - Короткий переход по значению в регистре или ячейке памяти.

JMP ptr16:16 - Дальний переход по указателю ptr16:16.

JMP mem16:16 - Дальний переход по адресу в памяти mem16:16.


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


Эта инструкция может быть использована для выполнения четырёх различных типов переходов:


  • Ближний переход - переход к инструкции внутри текущего сегмента кода (сегмент, на который в данный момент указывает регистр CS), иногда называемый внутрисегментным переходом.

  • Короткий переход - ближний прыжок, при котором диапазон перехода ограничен от -128 до +127 от текущего значения IP.

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

  • Переключение задачи - переход к инструкции, расположенной в другой задаче.

Ближние и короткие переходы. При выполнении ближайшего перехода процессор переходит к адресу (в пределах текущего сегмента кода), который указан в целевом операнде. Целевой операнд задаёт либо абсолютное смещение (то есть смещение от основания сегмента кода), либо относительное смещение (смещение со знаком относительно текущего значения указателя команды в регистре IP). Близкий переход к относительному смещению в 8 бит (rel8) называется коротким переходом. Регистр CS не изменяется при ближних и коротких переходах.


Абсолютное смещение задаётся косвенно в регистре общего назначения или ячейке памяти (reg/mem16). Абсолютные смещения загружаются непосредственно в регистр IP.


Относительное смещение (rel8 или rel16) обычно указывается как метка в ассемблерном коде, но на уровне машинного кода оно кодируется как 8- или 16-разрядное непосредственное значение со знаком. Это значение добавляется к значению в регистре IP. (Здесь регистр IP содержит адрес инструкции, следующей за инструкцией jmp). При использовании относительных смещений код операции (для коротких и близких переходов) и атрибут размера операнда (для близких относительных переходов) определяют размер целевого операнда (8 или 16 бита).


Дальние переходы в режиме реального адреса или виртуального 8086. При выполнении дальнего перехода в режиме реального адреса или виртуального 8086 процессор переходит к сегменту кода и смещению, указанным целевым операндом. Здесь целевой операнд указывает абсолютный дальний адрес либо непосредственно с помощью указателя (ptr16:16 или ptr16:32), либо косвенно с помощью ячейки памяти (mem16:16 или mem16:32).


При использовании метода указателя сегмент и адрес вызываемой процедуры кодируются в инструкции с использованием 4-байтового (16-разрядный размер операнда) или 6-байтового (32-разрядный размер операнда) непосредственного дальнего адреса. При косвенном методе целевой операнд указывает ячейку памяти, которая содержит 4-байтовый (16-разрядный размер операнда) или 6-байтовый (32-разрядный размер операнда) дальний адрес. Дальний адрес загружается непосредственно в регистры CS и IP. Если атрибут равен 16, то два верхних байта регистра IP очищаются.


Дальние переходы в защищённом режиме. Когда процессор работает в защищённом режиме, инструкция jmp может использоваться для выполнения следующих трёх типов дальних переходов:


  • Дальний переход к соответствующему или несоответствующему сегменту кода.
  • Дальний переход через шлюз вызова.
  • Переключатель задач.

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


В защищённом режиме процессор всегда использует часть селектора сегментов в дальнем адресе для доступа к соответствующему дескриптору в GDT или LDT. Тип дескриптора (сегмент кода, шлюз вызова, шлюз задачи или TSS) и права доступа определяют тип выполняемого перехода.


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

Целевой операнд определяет абсолютный дальний адрес либо непосредственно с помощью указателя (ptr16:16), либо косвенно с помощью ячейки памяти (mem16:16). Атрибут определяет размер смещения (16 бита) в дальнем адресе.

Новый селектор сегмента кода и его дескриптор загружаются в регистр CS, а смещение от инструкции загружается в регистр IP. Обратите внимание, что шлюз вызова (описанный в следующем абзаце) также может использоваться для выполнения дальнего вызова сегмента кода с тем же уровнем привилегий. Использование этого механизма обеспечивает дополнительный уровень косвенности и является предпочтительным методом выполнения переходов между 16-битными сегментами кода.

Выполнение переключения задач с помощью инструкции jmp в чем-то похоже на выполнение перехода через шлюз вызова. Здесь целевой операнд определяет селектор сегмента элемента управления задачей для переключаемой задачи (и смещённая часть целевого операнда игнорируется). Шлюз задач, в свою очередь, указывает на TSS для задачи, которая содержит селекторы сегментов для кода задачи и сегментов стека. TSS также содержит значение IP для следующей инструкции, которая должна была быть выполнена до того, как задача была приостановлена. Это значение указателя инструкции загружается в регистр IP, так что задача начинает выполняться снова при следующей инструкции.

В качестве примера рассмотрим случай, когда регистр ax содержит (123416). Затем инструкция jmp выполняет безусловный переход на метку Skip. Инструкции находящиеся между инструкцией jmp и меткой Skip выполнятся не будут.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public
  5. ____assume cs:code
  6. ____main proc
  7. ________mov_____ax, 1234h
  8. ________jmp_____Skip
  9. ________mov_____ax, 4321h
  10. ________mov_____bx, 5678h
  11. ____Skip:
  12. ________mov_____ax, 4C00h
  13. ________int_____21h
  14. ____main endp
  15. code ends
  16. end main

Инструкция JMP


Переход к инструкции, указанной в операнде.


_____________JMP rel8 - Короткий переход на относительный адрес rel8.

_____________JMP rel16 - Короткий переход на относительный адрес rel16.

_____________JMP reg/mem16 - Короткий переход по значению в регистре или ячейке памяти.

_____________JMP ptr16:16 - Дальний переход по указателю ptr16:16.

_____________JMP mem16:16 - Дальний переход по адресу в памяти mem16:16.


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


Эта инструкция может быть использована для выполнения четырёх различных типов переходов:


  • Ближний переход - переход к инструкции внутри текущего сегмента кода (сегмент, на который в данный момент указывает регистр CS), иногда называемый внутрисегментным переходом.

  • Короткий переход - ближний прыжок, при котором диапазон перехода ограничен от -128 до +127 от текущего значения IP.

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

  • Переключение задачи - переход к инструкции, расположенной в другой задаче.

Ближние и короткие переходы. При выполнении ближайшего перехода процессор переходит к адресу (в пределах текущего сегмента кода), который указан в целевом операнде. Целевой операнд задаёт либо абсолютное смещение (то есть смещение от основания сегмента кода), либо относительное смещение (смещение со знаком относительно текущего значения указателя команды в регистре IP). Близкий переход к относительному смещению в 8 бит (rel8) называется коротким переходом. Регистр CS не изменяется при ближних и коротких переходах.


Абсолютное смещение задаётся косвенно в регистре общего назначения или ячейке памяти (reg/mem16). Абсолютные смещения загружаются непосредственно в регистр IP.


Относительное смещение (rel8 или rel16) обычно указывается как метка в ассемблерном коде, но на уровне машинного кода оно кодируется как 8- или 16-разрядное непосредственное значение со знаком. Это значение добавляется к значению в регистре IP. (Здесь регистр IP содержит адрес инструкции, следующей за инструкцией jmp). При использовании относительных смещений код операции (для коротких и близких переходов) и атрибут размера операнда (для близких относительных переходов) определяют размер целевого операнда (8 или 16 бита).


Дальние переходы в режиме реального адреса или виртуального 8086. При выполнении дальнего перехода в режиме реального адреса или виртуального 8086 процессор переходит к сегменту кода и смещению, указанным целевым операндом. Здесь целевой операнд указывает абсолютный дальний адрес либо непосредственно с помощью указателя (ptr16:16 или ptr16:32), либо косвенно с помощью ячейки памяти (mem16:16 или mem16:32).


При использовании метода указателя сегмент и адрес вызываемой процедуры кодируются в инструкции с использованием 4-байтового (16-разрядный размер операнда) или 6-байтового (32-разрядный размер операнда) непосредственного дальнего адреса. При косвенном методе целевой операнд указывает ячейку памяти, которая содержит 4-байтовый (16-разрядный размер операнда) или 6-байтовый (32-разрядный размер операнда) дальний адрес. Дальний адрес загружается непосредственно в регистры CS и IP. Если атрибут равен 16, то два верхних байта регистра IP очищаются.


Дальние переходы в защищённом режиме. Когда процессор работает в защищённом режиме, инструкция jmp может использоваться для выполнения следующих трёх типов дальних переходов:


  • Дальний переход к соответствующему или несоответствующему сегменту кода.
  • Дальний переход через шлюз вызова.
  • Переключатель задач.

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


В защищённом режиме процессор всегда использует часть селектора сегментов в дальнем адресе для доступа к соответствующему дескриптору в GDT или LDT. Тип дескриптора (сегмент кода, шлюз вызова, шлюз задачи или TSS) и права доступа определяют тип выполняемого перехода.


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

Целевой операнд определяет абсолютный дальний адрес либо непосредственно с помощью указателя (ptr16:16), либо косвенно с помощью ячейки памяти (mem16:16). Атрибут определяет размер смещения (16 бита) в дальнем адресе.

Новый селектор сегмента кода и его дескриптор загружаются в регистр CS, а смещение от инструкции загружается в регистр IP. Обратите внимание, что шлюз вызова (описанный в следующем абзаце) также может использоваться для выполнения дальнего вызова сегмента кода с тем же уровнем привилегий. Использование этого механизма обеспечивает дополнительный уровень косвенности и является предпочтительным методом выполнения переходов между 16-битными сегментами кода.

Выполнение переключения задач с помощью инструкции jmp в чем-то похоже на выполнение перехода через шлюз вызова. Здесь целевой операнд определяет селектор сегмента элемента управления задачей для переключаемой задачи (и смещённая часть целевого операнда игнорируется). Шлюз задач, в свою очередь, указывает на TSS для задачи, которая содержит селекторы сегментов для кода задачи и сегментов стека. TSS также содержит значение IP для следующей инструкции, которая должна была быть выполнена до того, как задача была приостановлена. Это значение указателя инструкции загружается в регистр IP, так что задача начинает выполняться снова при следующей инструкции.

В качестве примера рассмотрим случай, когда регистр ax содержит (123416). Затем инструкция jmp выполняет безусловный переход на метку Skip. Инструкции находящиеся между инструкцией jmp и меткой Skip выполнятся не будут.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public _______; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _____________; Начало процедуры main
  7. ________mov_____ax, 1234h__; Копируем значение 466010 в регистр ax
  8. ________jmp_____Skip_______; Выполняем безусловный переход на метку Skip
  9. ________mov_____ax, 4321h
  10. ________mov_____bx, 5678h
  11. ____Skip:
  12. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  13. ________int_____21h _______; Вызываем прерывание DOS
  14. ____main endp _____________; Конец процедуры main
  15. code ends _________________; Конец сегмента кода
  16. end main __________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda