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 后缀结尾(如padddslld),它们的工作方式是否相同?

【问题讨论】:

【参考方案1】:

AT&T 语法基本上不会对助记符+后缀与其他助记符之间的冲突做任何事情。 注册操作数始终消除带有q 操作数大小后缀的mov 助记符与movq 助记符之间的歧义

movq %xmm0, %xmm0movq %rax, %xmm0movq %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,EAXMOV 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)进行运动预测?

如何处理 Freemarker 字符串模板?

如何处理 Property<T>、更改监听器和属性的初始化?

如何处理 ember.js 模型中的标签

如何处理SQL Server事务复制中的大事务操作

如何处理大数据库?