GNU内联汇编器-汇编指令的语法



在下面的代码中,我可以通过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线程中找到更多关于这个主题的讨论,或者在这里阅读更多。

最新更新