Почему команда mov использует ax вместо двух сегментных регистров напрямую?

StackOverflow https://stackoverflow.com/questions/928082

Вопрос

Я вижу код, подобный:

mov ax, cs
mov ds, ax
mov es, ax

Почему я не могу просто сжать это до:

mov ds, cs
mov es, cs

Является ли первый способ более быстрым, поскольку он использует регистр накопителя?Но это не показалось бы интуитивно понятным, поскольку cs и ds являются сегментами регистры.Или есть какое-то ограничение, о котором я не знаю?

Кстати, я использую nasm.

Это было полезно?

Решение

Вы не можете переместить сегментный регистр в сегментный регистр - для этого нет инструкции.

Другие советы

В процессоре достаточно места для микрокода для всех его инструкций.Таким образом, одна общая инструкция часто предпочтительнее нескольких инструкций специального назначения для редко используемых операций по изменению сегментных регистров.Кроме того, для некоторых процессоров количество инструкций абсолютно ограничено архитектурой - например, оригинальный процессор 8080 был ограничен 256 инструкциями, поскольку все они должны были содержать операционный код, закодированный в одном байте.

На самом деле это не язык ассемблера, а базовый машинный язык, который предотвращает эти операции.

Хотя ассемблер состоит из легко читаемых слов или мнемоник, на самом деле они довольно непосредственно представляют единицы и 0 машинного кода.В процессорах x86 каждая команда обычно состоит из последовательности байтов с отдельными байтами или даже битами внутри байтов, имеющими значение.Некоторые биты представляют инструкцию, другие представляют режим адресации.В режимах адресации регистров, таких как ваши примеры, некоторые биты представляют, какие конкретные регистры должны использоваться в качестве источника и назначения mov инструкция.

Сейчас семейство процессоров x86 уходит корнями в 1970-е годы, когда архитектура процессоров была проще.В те дни концепция аккумулятор имело ключевое значение - ax является 16-разрядным накопителем x86.Все вычисления были созданы или "накоплены" в этом реестре, так что он был доступен всем инструкциям.Другие регистры общего назначения имели более ограниченный диапазон использования.

Поскольку инструкции были основаны на байтах, вы хотели, чтобы как можно меньше байтов представляло инструкцию, чтобы обеспечить быстрое декодирование команд.Чтобы сделать как можно больше инструкций как можно короче, использование аккумулятора осуществляется централизованно.

В более современных процессорах, таких как Motorola 680x0, регистры более общего назначения обладают большими возможностями, которые ранее были прерогативой накопителя.В процессорах RISC все регистры столь же гибки, как аккумуляторы.Я слышал, что в 64-разрядном режиме текущий набор команд x86 / amd64 теперь гораздо менее ограничен.

Посмотрите на Справочник по набору инструкций Intel Manual Volume 2 - 325383-056US Сентябрь 2015 Столбец "MOV Move" - "Инструкция".

Единственный 16-битный регистр mov to кодируется в:

mov r/m16, Sreg

И "Столбец инструкций 3.1.1.3 в сводной таблице кодов операций" объясняет:

  • r/m16 - регистр общего назначения word или операнд памяти, используемый для команд, размер атрибута операнда которых равен 16 битам.Слово "регистры общего назначения" означает:AX, CX, DX, BX, SP, BP, SI, DI.
  • Sreg - сегментный регистр.

Таким образом mov ds, cs не поддается кодировке, так как нет mov Sreg, Sreg версия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top