будет ли такой случай прыжка, если да, то как? - PullRequest
0 голосов
/ 17 января 2011

У меня есть проблема в уме, и это потому, что инструкция перехода изменяет регистр EIP, добавляя в него подписанные смещения (если я не ошибаюсь здесь), на архитектуре IA-32, как бы вверх в памятиВозможно ли расположение от 0x7FFFFFFF (наибольшее положительное число в знаковой логике) до 0x80000000 (наименее отрицательное число в знаковой логике)?или, может быть, такого скачка не должно быть из-за природы подписанной логики?

Ответы [ 3 ]

5 голосов
/ 17 января 2011

Signed и unsigned - это всего лишь два способа интерпретации одной и той же битовой комбинации. Эта интерпретация не меняет способ сложения. 7FFFFFFF + 1 всегда равно 80000000, но это может быть интерпретировано как подписанное (отрицательное число) или беззнаковое (положительное число).

Указатель инструкции всегда интерпретируется как беззнаковый (очевидно, отрицательные адреса не имеют значения), поэтому он отвечает на ваш вопрос.

2 голосов
/ 17 января 2011

Относительные скачки фактически не подписаны. Номер из инструкции перехода просто добавляется в EIP. Таким образом, вы можете перейти в любое место в 32-битном адресном пространстве.

Пример: если EIP равен 20 и вы хотите перейти к 4, вы используете jmp 0FFFFFFF0h. Это большое число добавляется в EIP, что практически равно вычитанию 16.

Чтобы перейти с 7FFFFFFFh на 80000000h, вы должны использовать переход 1. :-) Но ваши адреса пересекаются, поэтому в практике это бесполезно.

Также обратите внимание, что вся логика сложения и вычитания работает независимо от знаков. Операции всегда одинаковы, включая относительные переходы.

1 голос
/ 17 января 2011

Адреса не подписаны в x86 из-за «плоского» режима адресации. Разделы режима адресации в руководствах для разработчиков Intels должны охватывать это, и в разделах о всех / условных относительных переходах тоже может быть упомянуто что-то, но они будут работать независимо от целочисленного переполнения.

...