Как определяется неявный сегментный регистр ближнего указателя? - PullRequest
3 голосов
/ 21 мая 2010

В разделе 4.3 Руководства разработчика программного обеспечения для архитектур Intel 64® и IA-32, раздел * 1002. Том 1: Базовая архитектура , там написано:

Ближний указатель - это 32-битное смещение ... внутри сегмента. Ближайшие указатели используются для всех ссылок на память в плоской модели памяти или для ссылок в сегментированной модели, где подразумевается идентичность сегмента, к которому осуществляется доступ.

Это заставляет меня задуматься: как определяется подразумеваемый сегментный регистр?

Я знаю, что (%eip) и смещенные (%eip) (например, -4(%eip)) адреса по умолчанию используют %cs, и что (%esp) и смещенные (%esp) адреса используют %ss, но как насчет (%eax) , (%edx), (%edi), (%ebp) и т. Д., И может ли неявный регистр сегмента зависеть также от инструкции, в которой появляется операнд адреса памяти?

1 Ответ

3 голосов
/ 21 мая 2010

За исключением упомянутых вами обращений к регистрам CS и SS, большинство других обращений будет использовать сегментный регистр DS. Несколько исключений, которые я могу вспомнить:

  • строковые инструкции будут использовать ES для регистра сегмента 'destination' (неявно адресуемого регистром EDI)
  • доступ к памяти с использованием регистра EBP в качестве регистра «базового адреса» будет использовать регистр сегмента SS. Однако, если регистр EBP используется как регистр масштабированного индекса, используемый сегмент будет DS (если регистр базового адреса не равен ESP)
...