在下面的代码中,我可以通过PSUBSW指令在mm0中获得mm0 - mm1的结果。当我在Mac上编译book air时,使用gcc。
但是,PSUBSW指令解释了我们可以在英特尔开发人员手册中得到mm1中的mm1 - mm0的结果:PSUBSW mm, mm/m64,从mm中的有符号包装词和饱和结果中减去mm/m64中的有符号包装词。
#include <stdio.h>
int
main()
{
short int a[4] = {1111,1112,1113,1114};
short int b[4] = {1111,2112,3113,4114};
short int c[4];
asm volatile (
"movq (%1),%%mm0nt"
"movq (%2),%%mm1nt"
"psubsw %%mm1,%%mm0nt"
"movq %%mm0,%0nt"
"emms"
: "=g"(c): "r"(&a),"r"(&b));
printf("%d %d %d %dn", c[0], c[1], c[2], c[3]);
return 0;
}
这有什么区别?哪个是src, mm0还是mm1?如果这种差异是英特尔语法和AT&T语法
在GNU手册中声明gcc不是基于Intel汇编语言,而是基于AT&T Unix汇编语言派生的语言。汇编语法有两个主要阵营:
- Intel:
opcode dest, src
- AT&T:
opcode src, dest
在您的示例中,您使用的是缺省的AT&T语法。但是,如果您更喜欢切换到Intel语法,您可以使用-masm=intel
编译或使用以下命令:
__asm__(".intel_syntax;" ...);
你可以在这个或这个Stackoverflow线程中找到更多关于这个主题的讨论,或者在这里阅读更多。