GNU内联汇编程序 - 汇编指令的语法?

时间:2014-05-03 01:45:20

标签: c gcc assembly simd

在下面的代码中,我可以通过PSUBSW指令得到mm0 - mm1的结果,单位为mm0。当我在Mac上通过gcc编写的书籍。

但是,PSUBSW指令解释说我们可以在mm Intel developer's manual中得到mm1 - mm0的结果: PSUBSW mm,mm / m64,用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),%%mm0\n\t"
  "movq (%2),%%mm1\n\t"
  "psubsw %%mm1,%%mm0\n\t"
  "movq %%mm0,%0\n\t"
  "emms"
  : "=g"(c): "r"(&a),"r"(&b));

  printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);

  return 0;
}

这有什么区别?哪个是src,mm0或mm1?如果这种差异是英特尔语法和AT&amp; T语法。

1 个答案:

答案 0 :(得分:3)

GNU manual中,它指出 gcc不是基于英特尔汇编语言,而是基于AT&amp; T Unix汇编程序的语言。汇编语法有两个主要阵营:

  • 英特尔:opcode dest, src
  • AT&amp; T:opcode src, dest

在您的示例中,您使用的是AT&amp; T语法,默认设置。但是,如果您希望切换到Intel语法,可以使用-masm=intel进行编译或使用以下内容:

__asm__(".intel_syntax;" ...);

您可以在thisthis Stackoverflow主题中找到有关该主题的更多讨论,或者阅读更多here