AT&T 语法如何处理其他助记符和操作数大小后缀之间的歧义?
Posted
技术标签:
【中文标题】AT&T 语法如何处理其他助记符和操作数大小后缀之间的歧义?【英文标题】:What does AT&T syntax do about ambiguity between other mnemonics and operand-size suffixes? 【发布时间】:2015-01-16 18:11:40 【问题描述】:在 AT&T 语法指令中,通常必须以适当的操作数大小为后缀,q
用于对 64 位操作数的操作。但是在 MMX 和 SSE 中也有 movq
指令,其中 q
位于原始 Intel 助记符中,而不是附加后缀。
那么这将如何在 AT&T 中体现?是否需要另一个q
后缀,例如
movqq %mm1, %mm0
movqq %xmm1, %xmm0
还是不行?
如果有任何其他指令以 AT&T 后缀结尾(如paddd
、slld
),它们的工作方式是否相同?
【问题讨论】:
【参考方案1】:AT&T 语法基本上不会对助记符+后缀与其他助记符之间的冲突做任何事情。 注册操作数始终消除带有q
操作数大小后缀的mov
助记符与movq
助记符之间的歧义
movq %xmm0, %xmm0
、movq %rax, %xmm0
和 movq %xmm0, %rax
是 3 个不同的操作码,它们都使用相同的助记符(movq
在 Intel 和 AT&T 语法中)。
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
(如果两个操作数都是 reg,汇编程序可以选择任一操作码)
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)
是非法的,因为这两个操作数都没有暗示操作数大小,并且没有后缀可以使其明确。
【讨论】:
【参考方案2】:movq
是与 MMX 一起引入的,以促进四字在 MMX 寄存器和非 MMX 寄存器之间移动。这是一个通用操作码;您可以在 mmx 寄存器和任何其他寄存器(mmx 或非 mmx)之间移动四字,甚至可以在非 mmx 寄存器之间移动。
换句话说,没有两个不同的操作码。因此,语法始终为movq
。
【讨论】:
但在 Intel 语法中有 2 种不同的助记符:movq
/movd
用于 MMX,mov
用于普通寄存器
即使是四字?两个普通寄存器试试movq
;如果这不起作用,请在这里报告,我会看看我能做些什么。
是的。你使用mov rax, rbx
,而不是movq rax, rbx
,即使它们是四字形
然后将movq
的使用限制为仅涉及 mmx 寄存器的四字移动。 movq
是操作码的名称;除了操作码中的一个字母之外,没有任何期望(至少在我看来)q
有任何特殊含义。
在两个非 mmx 寄存器上尝试movq
;我怀疑它仍然可以工作。以上是关于AT&T 语法如何处理其他助记符和操作数大小后缀之间的歧义?的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 的卡尔曼滤波器过渡矩阵如何处理时间(例如 t 和 t^2)进行运动预测?