Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc AT&;中源操作数的顺序是什么;T语法与Intel语法相比?_Gcc_Assembly_X86_Att - Fatal编程技术网

Gcc AT&;中源操作数的顺序是什么;T语法与Intel语法相比?

Gcc AT&;中源操作数的顺序是什么;T语法与Intel语法相比?,gcc,assembly,x86,att,Gcc,Assembly,X86,Att,此指令的英特尔ISA参考文档非常清晰: VPBLENDVB xmm1, xmm2, xmm3/m128, xmm4 使用指定掩码寄存器中的掩码位从xmm2和xmm3/m128中选择字节值,xmm4,并将值存储到xmm1中 xmm1是目标,xmm2/3/4是源操作数 那么使用AT&T语法会变成什么呢?我们知道目标寄存器必须是最后一个,但源操作数的顺序是什么 vpblendvb $xmm2, $xmm3, $xmm4, $xmm1 或 或者其他什么?组装(注GAS使用%而不是$来表示寄存器)如下

此指令的英特尔ISA参考文档非常清晰:

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

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

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

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

或者其他什么?

组装(注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
在英特尔语法中(如手册所示):


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

最快的方法是检查-将英特尔语法汇编程序与AT&T语法反汇编程序结合使用。是的,始终只需颠倒列表与CPU手册中的英特尔语法顺序即可。
$ objdump -d a.out
    0:    c4 e3 69 4c cb 40     vpblendvb %xmm4,%xmm3,%xmm2,%xmm1
$ objdump -d -M intel a.out
    0:    c4 e3 69 4c cb 40     vpblendvb xmm1,xmm2,xmm3,xmm4