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