2015-06-19 2 views
5

Мой вопрос возникает из простого любопытства:Сборка: почему некоторые коды операций x86 недействительны в x64?

Почему в x64 некоторые из кодов операций недействительны (например, 06, 07), тогда как в x86 используются довольно простые инструкции (06 и 07 - push и pop)? Я бы сказал, что эти простые инструкции прекрасно подойдут для обеих архитектур.

Почему они отключили некоторые из этих простых инструкций в x64? Почему бы им не работать? Почему они отключили некоторые коды операций, создавая отверстия в списке опкодов, когда они могли вместо этого назначить их для x64 версий инструкций?

Ссылка:

http://ref.x86asm.net/coder32.html

http://ref.x86asm.net/coder64.html

+1

Регистр сегментов с нажатием/записью просто не имеет смысла в режиме x64. –

ответ

8

В 06 и 07 опкоды в 32-битном режиме приведены инструкции PUSH ES и POP ES. В 64-битном режиме сегментные регистры CS, DS, ES и SS больше не используются для определения адресов памяти: процессор принимает базовый адрес 0 и без ограничений по размеру. Поскольку в настоящее время обычно нет причин для приложений (кроме самой операционной системы) для доступа к этим регистрам, коды операций для их изменения и доступа были удалены.

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

+0

CS все еще используется на самом деле. – harold

+0

@harold. Вы правы, он по-прежнему используется для установки атрибутов для сегмента кода (например, для включения 64-разрядного режима), но больше не используется для определения адресов памяти. – interjay

3

Для всех процессоров есть нечто вроде «пространства опкодов». Например, если ЦП использовал 8-битные коды операций, тогда был бы макс. из 256 инструкций, которые он мог бы иметь. Чем больше кодов операций, тем больше опкодов вы можете иметь, но тем сложнее их быстро и быстро их декодировать.

80x86 - относительно старая архитектура. Он начинался со скромного пространства опкодов, состоящего в основном из 1-байтового и 2-байтового кодов операций. Каждый раз, когда производители процессоров добавляют новую функцию, она занимает больше опкодов из пространства опкодов. У них кончились опкоды. Они быстро выбежали.

Чтобы обойти это, они начали делать такие вещи, как добавление эвакуационных кодов и префиксов для искусственного расширения пространства опкодов. Например, для недавних инструкций по AVX вы просматриваете префикс VEX, за которым следует старый/рециркулированный код (например, 0xF0), за которым следует префикс размера старого/переработанного адреса/операнда (например, 0x66), за которым следуют еще 4 байта , Это некрасиво.

В то же время существуют старые инструкции, которые редко используются сейчас (AAD, AAM и т. Д.) И инструкции с несколькими/резервными кодами операций (INC/DEC), которые потребляют ценные «1-байтные» коды операций. Они не могут/не могут быть полностью удалены из-за обратной совместимости.

Однако; когда разрабатывался 64-разрядный бит, просто не было 64-битного кода, который бы совместим - обратная совместимость не имела значения. 1-байтовые коды операций, потребляемые «не очень важными» инструкциями, могут быть переработаны; делая эти инструкции недействительными в 64-битном коде (но освобождая некоторые из ценных 1-байтных кодов операций).

Большинство этих 1-байтовых кодов операций (вся 1-байтная группа INC/DEC, если я правильно помню) были немедленно переработаны для префикса REX, необходимого для поддержки 64-битных операндов. Некоторые из них не были и стали «бесплатными для будущих расширений» (с ограничением на то, что расширение может работать только в 64-битном коде, поскольку эти инструкции все еще действительны в 16-битном и 32-битном коде).

+0

Существуют другие инструкции, которые могли быть удалены для режима AMD64. Они даже могли бы полностью переделать двоичную кодировку. Я предполагаю, что причина * не * внесения многих изменений заключалась в том, что один и тот же кремний мог декодировать 32 и 64-битный режим, без особых условных логик, зависящих от того, в каком режиме находился процессор. –

Смежные вопросы