与英特尔语法相比,AT&T语法中源操作数的顺序是什么?

bis*_*its 4 x86 assembly gcc att

该指令的Intel ISA参考文档很清楚:

VPBLENDVB xmm1, xmm2, xmm3/m128, xmm4
Run Code Online (Sandbox Code Playgroud)

从指定的掩码寄存器中选择字节值xmm2xmm3/m128使用掩码位xmm4,并将值存储到xmm1.

xmm1是目的地,xmm2/3/4是源操作数

那么使用AT&T语法会变成什么呢?我们知道目标寄存器必须是最后一个,但源操作数的顺序是什么?

vpblendvb $xmm2, $xmm3, $xmm4, $xmm1
Run Code Online (Sandbox Code Playgroud)

要么

vpblendvb $xmm4, $xmm3, $xmm2, $xmm1
Run Code Online (Sandbox Code Playgroud)

或者是其他东西?

use*_*653 5

汇编(注意GAS使用%而不是$表示寄存器)以下内容:

vpblendvb %xmm4, %xmm3, %xmm2, %xmm1
Run Code Online (Sandbox Code Playgroud)

使用GNU汇编程序(x86_64 2.6.38 linux上的版本2.21.0.20110327),然后反汇编:

$ objdump -d a.out
    0:    c4 e3 69 4c cb 40     vpblendvb %xmm4,%xmm3,%xmm2,%xmm1
Run Code Online (Sandbox Code Playgroud)

在intel语法中(如手册所示):

$ objdump -d -M intel a.out
    0:    c4 e3 69 4c cb 40     vpblendvb xmm1,xmm2,xmm3,xmm4
Run Code Online (Sandbox Code Playgroud)

所以看起来所有参数的顺序都是相反的.

  • 是的,始终只需将列表与 CPU 手册中的 Intel 语法顺序颠倒即可。 (2认同)