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

Syntax AT&;T语法如何处理其他助记符和操作数大小后缀之间的歧义?,syntax,x86,sse,att,mmx,Syntax,X86,Sse,Att,Mmx,在AT&T语法中,指令通常必须以适当的操作数大小作为后缀,对于64位操作数上的操作,指令的后缀为q。但是,在MMX和SSE中也有movq指令,其中q为原始英特尔助记符,而不是附加后缀 那么AT&T将如何体现这一点呢?需要另一个q后缀吗 movqq %mm1, %mm0 movqq %xmm1, %xmm0 还是不 如果有任何其他指令的结尾类似于AT&T后缀(如padd,slld),它们的工作方式是否相同?movq是在MMX中引入的,以便于在MMX寄存器和非MMX寄存器之间移动四字。它是一个通用

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

那么AT&T将如何体现这一点呢?需要另一个
q
后缀吗

movqq %mm1, %mm0
movqq %xmm1, %xmm0
还是不


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

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


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

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

movq%xmm0、%xmm0
movq%rax、%xmm0
movq%xmm0、%rax
是三种不同的操作码,它们都使用相同的助记符(
movq
在英特尔和AT&T语法中)

movq
助记符上不允许有后缀:
错误:“movq”的指令后缀无效。
。这是正常的,因为操作数大小不可能有歧义
movq
总是移动64位,因此
q
后缀是多余的


这是否使解析AT&T比解析Intel语法更困难?早在MMX存在之前(因此在x86-64之前),
movl
仍然是以下各项的助记符:

  • MOV r/m32、r32
  • MOV r32,r/m32
    (如果两个操作数都是regs,则汇编程序可以选择任一操作码)
  • MOV r32,imm32
    (缩写)
  • MOV r/m32,imm32
    (具有modr/m,可用于内存操作数)
  • 另外,
    MOV-moffs32,EAX
    MOV-EAX,moffs32
    ,作为使用32位绝对地址存储/加载的优化(无ModR/M)
这还不包括段、控制和调试寄存器之间的mov。与
movq%xmm0,%rax
一样,AT&T语法始终必须处理
mov%ds,%ax

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



此外,当寄存器决定操作数大小时,操作数大小后缀是可选的
mov%rax,%rcx
是合法的,只有将立即数移动到内存时才需要后缀
mov$1,(%rsi)
是非法的,因为两个操作数都不表示操作数大小,而且没有后缀使其显式。

但在英特尔语法中有两种不同的记忆法:
movq
/
movd
用于MMX,而
mov
用于普通寄存器,甚至是四字?对两个普通寄存器尝试
movq
;如果这不起作用,那么在这里报告,我会看看我能做些什么。是的。您可以使用
mov-rax,rbx
,而不是
movq-rax,rbx
,即使它们是四字。因此,将
movq
的使用限制为仅涉及mmx寄存器的四字移动
movq
是操作码的名称;除了操作码中的一个字母之外,我不期望(至少在我这方面)q
q
有任何特殊含义。在两个非mmx寄存器上尝试
movq
;我怀疑它仍然有效。