что делает JMP для наложения указателей и создания фреймов? - PullRequest
5 голосов
/ 17 марта 2010

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

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

РЕДАКТИРОВАТЬ: я говорю о сборке Intel x86 да:)

Ответы [ 5 ]

6 голосов
/ 18 марта 2010

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

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

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

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

3 голосов
/ 18 марта 2010

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

jmp label
...

label:

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

Привет

3 голосов
/ 18 марта 2010

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

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

3 голосов
/ 18 марта 2010

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

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

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

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

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

2 голосов
/ 18 марта 2010

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

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

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