2009-05-29 5 views
6

Я вижу код, как:Почему команда mov использует топор вместо двух сегментных регистров?

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

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

mov ds, cs 
mov es, cs 

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

Я использую nasm между прочим.

ответ

9

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

+0

Когда я. сначала прочитал ваш ответ, я не вел да, но в документации NASM, конечно, нет команды mov reg_dseg, reg_cseg. – samoz

+0

Это не причина, это результат. – 2009-05-29 20:58:25

+1

Что? Я не понимаю, что вы имеете в виду с Нилом. – samoz

1

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

+0

+1 для объяснения причины повода – dss539

1

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

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

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

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

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

+0

Пока только x86_64, которые могут быть использованы как регистры. Поскольку 32-разрядные x86 большинство регистров могут действовать более или менее как регистр общего назначения –

+0

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

+0

Я тоже не хожу, хотя сборка x86 тоже. Но на x86 есть еще инструкции по сегментам. Адресное пространство x86 не является плоским –

1

Посмотрите на Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015 Столбец «MOV Move» «Инструкция».

только 16-бит мов в регистры кодируется в:

mov r/m16, Sreg 

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

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

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

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

  • Нет связанных вопросов^_^