【问题标题】:What does AT&T syntax do about ambiguity between other mnemonics and operand-size suffixes?AT&T 语法如何处理其他助记符和操作数大小后缀之间的歧义?
【发布时间】: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),它们的工作方式是否相同?

【问题讨论】:

    标签: syntax x86 sse att mmx


    【解决方案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;我怀疑它仍然可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2010-12-05
      • 2017-04-05
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多