как происходит добавление 8-битных или 16-битных смещений в инструкции перехода? - PullRequest
0 голосов
/ 18 января 2011

Я сомневаюсь, что в архитектуре IA-32 в случае переходов, которые используют 8-битные или 16-битные смещения, добавление этого смещения в регистр EIP может повлиять на биты EIP, которые не имеют совпадающих битов в смещении, какну или это как добавление только части регистра EIP, которая соответствует смещению в количестве битов смещению?

Ответы [ 2 ]

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

Если вы говорите о такой операции, как add eip,xxx, то это 32-битное сложение, и вам не нужно беспокоиться о том, что один операнд начинается уже.

Обновление - пропущено то, что речь шла об относительных инструкциях JMP. Ответ таков: нет, вам не нужно беспокоиться о размере операнда смещения относительного скачка, переход будет работать правильно.

Вот текущая документация Intel:

http://www.intel.com/products/processor/manuals/

0 голосов
/ 18 января 2011

Короткие переходы - это только сложение между EIP и 8-битным или 16-битным (или 32-битным) значением со знаком.Если новый EIP не запустится с правильного адреса кода, возникнет исключение.

От Intel: ИНСТРУКЦИЯ SET REFERENCE *

Ближний и короткий прыжки.При выполнении ближнего перехода процессор переходит на адрес (в пределах текущего сегмента кода), который указан с целевым операндом.Целевой операнд указывает либо абсолютное смещение (то есть смещение от основания сегмента кода), либо относительное смещение (смещение со знаком относительно текущего значения указателя команды в регистре EIP).Ближний переход к относительному смещению в 8 бит (rel8) называется коротким переходом.Регистр CS не изменяется при ближних и коротких прыжках.Абсолютное смещение указывается косвенно в регистре общего назначения или в ячейке памяти (r / m16 или r / m32).Атрибут размера операнда определяет размер целевого операнда (16 или 32 бита).Абсолютные смещения загружаются непосредственно в регистр EIP.Если атрибут размера операнда равен 16, верхние два байта регистра EIP очищаются, в результате чего максимальный размер указателя команды составляет 16 битов.Относительное смещение (rel8, rel16 или rel32) обычно указывается как метка в коде сборки, но на уровне машинного кода оно кодируется как 8-, 16- или 32-битное непосредственное значение со знаком.Это значение добавляется к значению в регистре EIP.(Здесь регистр EIP содержит адрес инструкции, следующей за инструкцией JMP).При использовании относительных смещений код операции (для коротких и ближних переходов) и атрибут размера операнда (для близких относительных переходов) определяют размер целевого операнда (8, 16 или 32 бита).

...