что JMP делает, чтобы сложить и структурировать указатели?

Когда блок имеет инструкцию как jmp f, что происходит с указателями кадра и стеком?

Я имею в виду - f, маркировка в праве памяти? Как мы можем перейти к другому адресу в памяти и не обновить наш кадр и указатели вершины стека...

Править: Я говорю о блоке Intel x86 да :)

5
задан Paul R 17 March 2010 в 21:25
поделиться

5 ответов

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

  • Переключение задач - из-за дальнего перехода с использованием ворот задачи
  • ошибок - из-за перехода на новую страницу, которая недействительна, или выпрыгивания из текущий сегмент или jmp , который пытается незаконно изменить привилегию.
  • ловушки - например, из-за точки останова кода. На самом деле, в данный момент никакая другая ловушка не приходит в голову.

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

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

6
ответ дан 18 December 2019 в 09:48
поделиться

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

Поскольку указатель инструкции (eip) хранится в другом регистре, чем указатели фрейма и стека (esp, ebp) . Изменение одного не повлияет на другие (обычно).

3
ответ дан 18 December 2019 в 09:48
поделиться

Полагаю, вы говорите об инструкции Intel? В этом случае ничего не происходит ни с одним указателем стека / кадра, код просто продолжает выполнение в том же контексте, но по новому адресу.

Думаю, в этом ответе есть некоторые оговорки - возможно вызвать переключение задачи с помощью инструкции jmp, и в этом случае могут произойти всевозможные сумасшедшие вещи. Вы, вероятно, захотите прочитать документацию для получения всех подробностей. В Руководстве разработчика программного обеспечения Intel есть все подробности:

  • jmp документация в томе 2A
  • 7.3 Переключение задач в томе 3A

Правка: относится к вашему вопросу о прыжках без обновления.

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

3
ответ дан 18 December 2019 в 09:48
поделиться

Просто примечание: в x86 есть много видов инструкций "jmp". Наиболее распространенным из них является «локальный» jmp, который просто изменяет значение регистра EIP, поэтому кадр стека вообще не трогается, как указал Карл. Я предполагаю, что вы говорите об этом типе jmp, так как это тот, который ассемблеры генерируют с синтаксисом вроде:

jmp label
...

label:

Но есть также «дальний» скачок, который влияет также на регистр сегмента CS. Если процессор находится в реальном режиме, это все равно не что иное, как изменение регистров CS:IP (просто «больший» скачок), но в защищенном режиме сегменты CS имеют совсем другую и гораздо более сложную функцию: он интерпретируется как дескриптор для Вентилей CALL/TASK/INTERRUPT, т.е. индекс в таблице дескрипторов, который определяет многие вещи, такие как уровень привилегий, задача... В зависимости от конкретного дескриптора,может произойти повышение уровня привилегий или также переключатель «аппаратной задачи». Это может привести к изменению контекста. Обычно вы не найдете дальних скачков в защищенном режиме, если вы не программируете ядро операционной системы. Создание дескрипторов сегментов почти всегда является задачей ядра.

С уважением

3
ответ дан 18 December 2019 в 09:48
поделиться

JMP - это goto сборки, со всеми вытекающими.

Иногда вам просто нужно начать выполнение с другого адреса.

2
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: