Какой сегментный регистр используется по умолчанию?
Я изучаю компьютерную архитектуру из Руководства 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 для получения дополнительных ссылок.