Почему инструкция mov использует ax вместо двух регистров сегмента напрямую? - PullRequest
6 голосов
/ 30 мая 2009

Я вижу код вроде:

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

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

mov ds, cs
mov es, cs

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

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

Ответы [ 4 ]

10 голосов
/ 30 мая 2009

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

1 голос

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

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

mov r/m16, Sreg

И «3.1.1.3 Колонка команд в сводной таблице кода операции» объясняет:

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

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

1 голос
/ 09 мая 2011

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

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

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

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

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

1 голос
/ 30 мая 2009

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

...