Syntax AT&;T语法如何处理其他助记符和操作数大小后缀之间的歧义?
在AT&T语法中,指令通常必须以适当的操作数大小作为后缀,对于64位操作数上的操作,指令的后缀为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寄存器之间移动四字。它是一个通用
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
(如果两个操作数都是regs,则汇编程序可以选择任一操作码)MOV r32,r/m32
(缩写)MOV r32,imm32
(具有modr/m,可用于内存操作数)MOV r/m32,imm32
- 另外,
和MOV-moffs32,EAX
,作为使用32位绝对地址存储/加载的优化(无ModR/M)MOV-EAX,moffs32
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
是操作码的名称;除了操作码中的一个字母之外,我不期望(至少在我这方面)qq
有任何特殊含义。在两个非mmx寄存器上尝试movq
;我怀疑它仍然有效。