Поддерживаются ли расширенные регистры общего и специального назначения в виртуальном 8086 x86_32 и реальном режиме?

Можно ли использовать EAX,EBX,... в x86_32 виртуальном 8086 или реальном режиме? Я знаю, что эти регистры имеют размер 32 бита (и, конечно, их нерасширенные части имеют ширину 16 бит), однако на занятии не объясняется, в каких режимах они могут использоваться, только то, что FS и GS разрешены только в защищенном режиме.


person Balázs Börcsök    schedule 04.03.2020    source источник


Ответы (1)


да. Префиксы машинного кода размера операнда и размера адреса работают во всех режимах, включая чисто реальный режим, на 386-совместимых процессорах. В 16-битном режиме по умолчанию размер операнда и размер адреса 16-битные. Эти префиксы переворачиваются на другой размер.

Конечно, 286 или более ранняя версия не будет знать, что делать с префиксами 66 или 67, поэтому их часто избегают в 16-битном коде, предназначенном для переноса на более старые процессоры. (Включая любой процессор, отличный от Intel, который поддерживает 186, но не 386).

Но если вы заботитесь только о работе на 386-совместимых процессорах, да, вы можете использовать 32-битный размер операнда и размер адреса с такими регистрами, как EAX. Включая режимы адресации, такие как [EAX + ECX*2]. Используйте это, когда он сохраняет инструкции и/или размер кода. (Обратите внимание, что ограничение размера сегмента по-прежнему установлено на уровне 64 КБ в реальном режиме, поэтому 32-разрядные режимы адресации не могут превышать это значение, если вы не переключитесь в защищенный режим и не измените его, а затем вернетесь в реальный режим. Это вызов "нереальный режим")

Кроме того, FS и GS можно свободно использовать в любом режиме (опять же только на 386-совместимых процессорах). В машинном коде у них есть свои собственные префиксы, такие как переопределения ss: или es:, а для перемещения в/из сегментных регистров у них также есть номера регистров.


Все это задокументировано в руководствах Intel; кодировки префиксов сегментов и операндов регистров для размера операнда 8, 16 и 32.

https://en.wikipedia.org/wiki/X86-64#Operating_modes имеет хорошую таблицу размеров операндов (и размеров адресов), поддерживаемых в каком режиме.

person Peter Cordes    schedule 04.03.2020
comment
Вы имеете в виду следующее руководство: software.intel.com/en-us/download/ ? - person Balázs Börcsök; 05.03.2020
comment
@BalázsBörcsök: Ага. По сути, он слишком велик, чтобы легко найти деталь, если вы еще не знаете, что искать. В части vol.2 руководства есть подробности кодирования инструкций, и вводные разделы должны прояснить это. - person Peter Cordes; 05.03.2020