Почему вы не можете установить указатель инструкции напрямую?

StackOverflow https://stackoverflow.com/questions/8333413

Вопрос

Статья Википедии о собрании x86 говорит, что «IP -реестр не может быть доступен программистом напрямую».

Непосредственно означает с такими инструкциями, как MOV и добавить.

Почему бы и нет? В чем причина этого? Каковы технические ограничения?

Это было полезно?

Решение

Вы не можете получить доступ к нему напрямую, потому что нет законного использования. Имея какое -либо произвольное изменение инструкции eip сделает предсказание филиала очень сложным и, вероятно, откроет целый ряд вопросов безопасности.

Вы можете редактировать eip с использованием jmp, call или же ret. Анкет Вы просто не можете напрямую читать или написать eip используя нормальные операции

Параметр eip в регистр так же просто, как jmp eax. Анкет Вы также можете сделать push eax; ret, что повышает значение eax в стек, а затем возвращается (т.е. появляется и прыгает). Третий вариант call eax который делает звонок по адресу в EAX.

Чтение можно сделать так:

call get_eip
  get_eip:
pop eax ; eax now contains the address of this instruction

Другие советы

Это было бы возможным дизайном для X86. Рука делает разоблачить счетчик программы для чтения/записи как R15. Анкет Это необычно, хотя.

Он позволяет очень компактной функции Пролог/Эпилог, а также способность толкать или заставлять несколько регистров с одной инструкцией: push {r5, lr} При входе и pop {r5, pc} вернуться. (Заплыв сохраненное значение регистра ссылок в счетчик программы).

Тем не менее, это делает высокопрофессиональную / вне порядка реализации рук менее удобной и было отброшено для Aarch64.


Так это возможно, но использует один из регистров. Анкет 32-разрядная рука имеет 16 целочисленных регистров (включая ПК), поэтому номер регистра требует 4 бита, чтобы кодировать код машины ARM. Другой регистр почти всегда связан с указателем стека, поэтому ARM имеет 14 целочисленных регистров общего назначения. (LR может быть сохранен в стеке, поэтому он может использоваться и используется в качестве реестра общего назначения внутри функций).

Большая часть современного X86 унаследована от 8086. Он был разработан с помощью довольно компактной кодирования инструкций переменной длины, и только 8 регистров, требующих всего 3 бита для каждого регистра SRC и DST в машинном коде.

В первоначальном 8086 они не были очень общими, а релагирование SP невозможна в 16-битном режиме, поэтому по существу 2 регистра (SP и BP) связаны для стека. Это оставляет только 6-то генеральные зарегистрированные регистры, и одно из них будет ПК вместо общего назначения, будет огромным сокращением доступных регистров, что значительно увеличило количество разлива/перезагрузки в типичном коде.


AMD64 добавил R8-R15 и режим адресации RIP-режима. lea rsi, [rip+whatever], и режимы режима обращения в отношении прямого обращения для прямого доступа к статическим данным и константам-это все, что вам нужно для эффективного кода, независимого от положения. Косвенные инструкции JMP абсолютно достаточны для написания разрыва.

На самом деле нет ничего, что можно получить, позволяя использовать произвольные инструкции для чтения или написания ПК, поскольку вы всегда можете сделать то же самое с целочисленным регистром и косвенным прыжком. Для X86-64 R15 было бы почти чистым недостатком, особенно для выступления архитектуры в качестве цели компилятора. (Ручной написанный ASM Weird Stuff был уже очень необычной нишей к 2000 году, когда AMD64 был разработан.)

Таким образом, AMD64 действительно первый раз, когда x86, вероятно, мог бы получить полностью экспонатный счетчик программы, такой как ARM, но было много веских причин, чтобы не делать этого.

Я думаю, что они имели в виду, что к IP -региону не может быть доступна обращена непосредственно так же, как и другие регистры. Программисты определенно могут написать в IP, например, путем выпуска инструкции по прыжкам.

jmp установит EIP регистр.

Этот код установит EIP на 00401000:

mov eax, 00401000
jmp eax ;set Eip to 00401000

и для получения EIP

call GetEIP
.
.
GetEIP:
mov eax, [esp]
ret
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top