Вопрос или проблема
Есть причина, по которой некоторые устаревшие инструкции x86 (BOUND, PUSHA, AAA и т. д.) не могут использоваться в 64-битном режиме? Да, я знаю, что такие инструкции доступны только для обеспечения совместимости и не должны использоваться в современном коде.
Но сам аппаратный уровень понимает такие инструкции. Откуда эта искусственная ограниченность?
Я посмотрел в справочник по инструкциям, есть ли указаны причины. К сожалению, там только информация о том, какие инструкции недоступны в 64-битном режиме – но не почему.
Для некоторых устаревших инструкций я выяснил, что опкод был повторно использован в 64-битном режиме. Но, похоже, это не касается каждой “запрещенной” инструкции.
Ответ или решение
Вопрос о том, почему некоторые устаревшие инструкции x86, такие как BOUND или PUSHA, недоступны в 64-битном режиме, является интересным и многослойным. Давайте подробно разберемся с этой темой.
Причины отсутствия устаревших инструкций в 64-битном режиме:
-
Совместимость и упрощение архитектуры: 64-битный режим (также известный как x86-64 или AMD64) был разработан с целью расширения возможностей адресации и улучшения производительности, одновременно обеспечивая поддержку широкой базы программного обеспечения, работавшего в 32-битном режиме. Устаревшие инструкции, как правило, избыточны и не соответствуют современным требованиям к архитектуре. Их исключение помогает упростить реализацию процессоров и уменьшить сложность компиляции и отладки.
-
Оптимизация производительности: Инструкции, которые не поддерживаются в 64-битном режиме, часто ассоциируются с низкой производительностью или ненадежными реализациями. Удаление таких инструкций позволяет архитектуре сосредоточиться на более эффективных и современных способах выполнения задач, что в итоге приводит к более высокой производительности CPU.
-
Перекрытие кодов операций (опкодов): В 64-битном режиме некоторые опкоды действительно перекрыты с другими инструкциями, что может вызывать конфликты и неоднозначности. Это также объясняет, почему некоторые устаревшие инструкции не могут быть просто «переработаны» для 64-битного режима. Устранение старых инструкций позволяет избежать путаницы и обеспечивает четкость в определении операций.
-
Отсутствие необходимости в устаревших инструкциях: Инструкции типа BOUND и PUSHA были созданы для решения специфических задач, которые в современных реалиях не имеют практического применения. Например, BOUND проверяет границы массива, что сегодня обычно реализуется с помощью других средств программирования (например, с помощью механик языков на высоком уровне). Аналогично, PUSHA сохраняет регистры общего назначения, что в большинстве случаев заменяется современными методами работы со стеком и управлением состоянием.
-
Упрощение формата инструкций: Устаревшие инструкции могут иметь множество семантических и синтаксических особенностей, которые усложняют дизайн процессора и его компиляторов. Исключение устаревших инструкций упрощает интерпретацию инструкций процессором.
Заключение
В конечном итоге, отсутствие устаревших инструкций, таких как BOUND или PUSHA, в 64-битном режиме x86 связано с желанием упростить архитектуру, улучшить производительность, исключить ненужную сложность и адаптироваться к новым стандартам программирования. Это решение было принято с учетом баланса между совместимостью со старыми приложениями и эффективностью современных вычислений.