该指令的英特尔ISA引用文档很清楚:

VPBLENDVB xmm1, xmm2, xmm3/m128, xmm4



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

或者
vpblendvb $xmm4, $xmm3, $xmm2, $xmm1

或者是其他东西?

最佳答案

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

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

使用GNU汇编器(x86_64 2.6.38 linux上的版本2.21.0.20110327),然后反汇编 yield :
$ 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

因此,看起来所有参数的顺序都颠倒了。

关于gcc - 与英特尔语法相比,AT&T语法中的源操作数的顺序是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7548509/

10-11 07:08