Синтаксис 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