Как синтаксис AT&T устраняет неоднозначность между другими мнемониками и суффиксами размера операнда?

В синтаксисе AT&T инструкции часто должны иметь суффикс с соответствующим размером операнда, с q для операций с 64-битными операндами. Однако в MMX и SSE также есть инструкция movq, где q является исходной мнемоникой Intel, а не дополнительным суффиксом.

Так как же это будет представлено в AT&T? Нужен ли еще один суффикс q, например

movqq %mm1, %mm0
movqq %xmm1, %xmm0

или нет?

И если есть другие инструкции, которые заканчиваются суффиксами AT&T (например, paddd, slld), работают ли они таким же образом?


person phuclv    schedule 16.01.2015    source источник


Ответы (2)


Синтаксис AT&T в основном ничего не делает с конфликтами между мнемоническим + суффиксом и другими мнемониками. Регистровые операнды всегда различаются между мнемоникой mov с суффиксом размера операнда q и мнемоникой movq

movq %xmm0, %xmm0, movq %rax, %xmm0 и movq %xmm0, %rax - это 3 разных кода операций, которые используют одну и ту же мнемонику (movq в синтаксисе Intel и AT&T).

В мнемонике movq: Error: invalid instruction suffix for 'movq' нельзя использовать суффикс. Это нормально, потому что нет возможной двусмысленности в отношении размера операнда. movq всегда перемещает 64 бита, поэтому суффикс q будет избыточным.


Не усложняет ли это синтаксический анализ AT&T по сравнению с синтаксисом Intel? Задолго до того, как появился MMX (то есть до x86-64), movl все еще был мнемоником для 6 различных кодов операций ( В ручном вводе Intel insn set ref для mov их все перечисляются с их числовым кодом операции):

  • MOV r/m32,r32
  • MOV r32,r/m32 (ассемблер может выбрать любой код операции, если оба операнда являются регистрами)
  • MOV r32, imm32 (краткая форма)
  • MOV r/m32, imm32 (с параметром modr / m, используемым для операндов памяти).
  • также MOV moffs32,EAX и MOV EAX,moffs32, как оптимизация (без ModR / M) для хранения / загрузки с 32-битным абсолютным адресом.

И это не считая перемещения в / из регистров сегмента, управления и отладки. Как и в случае с movq %xmm0, %rax, синтаксис AT&T всегда имел дело с mov %ds, %ax.

Добавление еще нескольких форм с разными регистрами для устранения неоднозначности, вероятно, не намного сложнее для синтаксического анализа.


Кроме того, суффиксы размера операнда необязательны, если регистры в любом случае определяют размер операнда. mov %rax, %rcx является допустимым, а суффикс необходим только для немедленного перемещения в память. mov $1, (%rsi) является недопустимым, потому что ни один из операндов не подразумевает размер операнда, и нет суффикса, чтобы сделать его явным.

person Peter Cordes    schedule 15.07.2018

movq был введен с MMX для облегчения перемещения четверных слов между регистрами MMX и регистрами, отличными от MMX. Это код операции общего назначения; вы можете перемещать четверное слово между регистром mmx и любым другим регистром (mmx или не-mmx) или даже между регистрами, отличными от mmx.

Другими словами, нет двух разных кодов операций. Следовательно, синтаксис всегда movq.

person Robert Harvey    schedule 16.01.2015
comment
но в синтаксисе Intel есть две разные мнемики: _1 _ / _ 2_ для MMX и mov для обычных регистров - person phuclv; 16.01.2015
comment
Даже для четверных слов? Попробуйте movq для двух обычных регистров; если это не сработает, сообщите об этом здесь, и я посмотрю, что я могу сделать. - person Robert Harvey; 16.01.2015
comment
да. Вы используете mov rax, rbx, а не movq rax, rbx, даже если они являются четверными словами - person phuclv; 16.01.2015
comment
Затем ограничьте использование movq четырёхсловными ходами, в которых задействованы только регистры mmx. movq - имя кода операции; нет никаких ожиданий (по крайней мере, с моей стороны), что q имеет какое-либо особое значение, кроме буквы в коде операции. - person Robert Harvey; 16.01.2015
comment
Попробуйте movq на двух регистрах, отличных от mmx; Я подозреваю, что он все равно будет работать. - person Robert Harvey; 16.01.2015
comment
Он не работает в синтаксисе Intel, но будет работать в AT&T, если регистры 64-битные. Для меня это просто нелогично в этом случае, когда AT&T использует только 1 мнемонику для многих случаев, когда она обычно сложнее, чем Intel, и использует отдельные мнемоники для разных инструкций - person phuclv; 16.01.2015
comment
Почему вы ожидаете, что два совершенно разных ассемблера будут вести себя одинаково? Возможно, это нелогично, но похоже, что это то, что есть. - person Robert Harvey; 16.01.2015