8

该指令的英特尔 ISA 参考文档很清楚:

VPBLENDVB xmm1, xmm2, xmm3/m128, xmm4

从指定掩码寄存器中选择字节值xmm2并使用掩码位,并将值存储到.xmm3/m128xmm4xmm1

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

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

vpblendvb $xmm2, $xmm3, $xmm4, $xmm1

或者

vpblendvb $xmm4, $xmm3, $xmm2, $xmm1

或者是其他东西?

4

1 回答 1

9

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

vpblendvb %xmm4, %xmm3, %xmm2, %xmm1

使用 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

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

$ objdump -d -M intel a.out
    0:    c4 e3 69 4c cb 40     vpblendvb xmm1,xmm2,xmm3,xmm4

所以看起来所有参数的顺序都颠倒了。

于 2011-09-25T21:03:33.017 回答