Почему вы не можете установить указатель инструкции напрямую? - PullRequest
18 голосов
/ 01 декабря 2011

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

Прямо означает с инструкциями, такими как mov и add.

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

Ответы [ 4 ]

23 голосов
/ 01 декабря 2011

Вы не можете получить к нему доступ напрямую, потому что нет законного варианта использования. Любое произвольное изменение инструкции 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
8 голосов
/ 14 декабря 2016

Это был бы возможный дизайн для x86.ARM выставляет свой программный счетчик для чтения / записи как R15 .Это необычно, однако.

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

Однако это делает реализацию ARM с высоким перфорированным / неупорядоченным заказом менее удобной и была отброшена для AArch64.


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

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

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


AMD64 добавил r8-r15 и режим относительной RIP-адресации.lea rsi, [rip+whatever] и режимы относительной RIP-адресации для прямого доступа к статическим данным и константам - все, что вам нужно для эффективного независимого от позиции кода.Косвенных инструкций JMP вполне достаточно для записи в RIP.

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

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

3 голосов
/ 25 августа 2015

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

этот код установит eip на 00401000:

mov eax, 00401000
jmp eax ;set Eip to 00401000

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

call GetEIP
.
.
GetEIP:
mov eax, [esp]
ret
3 голосов
/ 01 декабря 2011

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

...