Какой сегментный регистр используется по умолчанию?

Я изучаю компьютерную архитектуру из Руководства Intel. Я понимаю, что инструкции, которые мы даем, являются логическими адресами, которые состоят из селектора сегмента и смещения. Это в основном CS register<<4 + offset, Segment Selector сопоставляется с GDT или LDT, как указано в TI бит селектора сегмента. GDT состоит из Segment Descriptors который имеет BASE, LIMIT а также RPL и вывод является базовым адресом. это base address + offset обеспечивает logical address,

Какие правила определяют, какой сегмент регистрировать (SS, DSи т.д.) относится к разным операциям с памятью? например, что определяет, какой сегмент используется для mov eax, [edi]?

1 ответ

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

Выборка кода всегда использует CS,

По умолчанию большую часть времени DS (например, для mov eax, [edi]). Некоторые дизассемблеры делают сегмент явным, даже если он используется по умолчанию, поэтому вы видите много DS: загромождая вывод разборки.

movs инструкция читает от [DS:ESI] и пишет [ES:EDI], облегчая копирование между сегментами без префиксов переопределения сегментов. Некоторые другие строковые инструкции также используют ES,

Использование операндов памяти esp или же ebp в качестве базового регистра по умолчанию SSи неявный доступ для таких инструкций, как стек push/pop/call/ret,

FSа такжеGSникогда не используются по умолчанию, поэтому их можно использовать для специальных целей (например, локальное хранилище потоков) в системе с плоской моделью памяти, такой как современные 32- и 64-разрядные ОС.

Википедия объясняет то же самое здесь.


Это также официально зарегистрировано в руководствах Intel по ISA. например, в томе 2 (ссылка на набор инструкций), таблица 2-1.16-битные формы адресации с байтом ModR/M имеют сноску:

Регистром сегмента по умолчанию является SS для действующих адресов, содержащих индекс BP, DS для других действующих адресов.

(обратите внимание, что SP не является допустимым базовым адресом для 16-битных режимов адресации.)

Для 32- или 64-разрядных режимов адресации нет эквивалентной сноски, поэтому подробности должны быть в другом томе руководства.

Смотрите также вики-тег x86 для получения дополнительных ссылок.

Другие вопросы по тегам