AT&T 语法如何处理其他助记符和操作数大小后缀之间的歧义?

What does AT&T syntax do about ambiguity between other mnemonics and operand-size suffixes?

在 AT&T 语法指令中,通常必须以适当的操作数大小作为后缀,q 表示对 64 位操作数的操作。但是在 MMX 和 SSE 中也有 movq 指令,其中 q 是原始英特尔助记符而不是额外的后缀。

那么这在 AT&T 中将如何表示?是否需要另一个 q 后缀,如

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

要不要?

如果有任何其他指令以 AT&T 后缀结尾(如 padddslld),它们的工作方式是否相同?

movq 与 MMX 一起引入,以促进四字在 MMX 寄存器和非 MMX 寄存器之间移动。这是一个通用操作码;您可以在 mmx 寄存器和任何其他寄存器(mmx 或非 mmx)之间,甚至在非 mmx 寄存器之间移动四字。

换句话说,没有两个不同的操作码。因此,语法总是 movq.

AT&T 语法基本上不会处理助记符+后缀与其他助记符之间的冲突。 寄存器操作数总是在带有 q 操作数大小后缀的 mov 助记符与 movq 助记符

之间消除歧义

movq %xmm0, %xmm0movq %rax, %xmm0movq %xmm0, %rax 是 3 个不同的操作码,它们都使用相同的助记符(Intel 和 AT&T 语法中的 movq)。

movq 助记符不允许使用后缀:Error: invalid instruction suffix for 'movq'。这是正常的,因为关于 operand-size 不可能有歧义。 movq 总是移动 64 位,因此 q 后缀是多余的。


这是否会使解析 AT&T 语法比解析 Intel 语法更难?早在 MMX 存在之前(因此也在 x86-64 之前),movl 仍然是 6 different opcodes (Intel's insn set ref manual entry for mov lists them all, with their numeric opcode):

的助记符
  • MOV r/m32,r32
  • MOV r32,r/m32(如果两个操作数都是 regs,汇编程序可以选择其中一个操作码)
  • MOV r32, imm32(缩写)
  • MOV r/m32, imm32(带有一个modr/m,可用于内存操作数)。
  • 还有 MOV moffs32,EAXMOV EAX,moffs32,作为对具有 32 位绝对地址的 storing/loading 的优化(无 ModR/M)。

这还不包括 mov to/from 段、控制和调试寄存器。就像 movq %xmm0, %rax 一样,AT&T 语法总是必须处理 mov %ds, %ax.

添加更多具有不同寄存器的表单来消除歧义可能不会更难解析。


除此之外,当寄存器确定操作数大小时,操作数大小后缀是可选的。 mov %rax, %rcx 是合法的,仅在将立即数移动到内存时才需要后缀。 mov , (%rsi) 是非法的,因为这两个操作数都没有暗示操作数大小,并且没有后缀使其明确。