C GNU内联汇编程序&x2014;汇编指令的语法?

C GNU内联汇编程序&x2014;汇编指令的语法?,c,gcc,assembly,simd,C,Gcc,Assembly,Simd,在下面的代码中,我可以通过PSUBSW指令在mm0中获得mm0-mm1的结果。当我通过gcc在Mac book air上编译时 但是,PSUBSW指令解释说,我们可以在mm1 in中得到mm1-mm0的结果:PSUBSW mm,mm/m64,从mm中的有符号压缩字减去mm/m64中的有符号压缩字,并对结果进行饱和 #包括 int main() { 短int a[4]={1111111 21131114}; 短int b[4]={1111211231134114}; 短int c[4]; 挥发性物

在下面的代码中,我可以通过PSUBSW指令在mm0中获得mm0-mm1的结果。当我通过gcc在Mac book air上编译时

但是,PSUBSW指令解释说,我们可以在mm1 in中得到mm1-mm0的结果:PSUBSW mm,mm/m64,从mm中的有符号压缩字减去mm/m64中的有符号压缩字,并对结果进行饱和

#包括
int
main()
{
短int a[4]={1111111 21131114};
短int b[4]={1111211231134114};
短int c[4];
挥发性物质(
movq(%1),%%mm0\n\t
movq(%2),%%mm1\n\t
psubsw%%mm1,%%mm0\n\t
“movq%%mm0,%0\n\t”
“艾姆斯”
:“=g”(c):“r”(&a),“r”(&b));
printf(“%d%d%d%d\n”,c[0],c[1],c[2],c[3]);
返回0;
}
这有什么区别?哪个是src,mm0还是mm1?如果此差异是英特尔语法和AT&T语法。

中指出,gcc不是基于英特尔汇编语言,而是基于从AT&T Unix汇编程序派生的语言。关于程序集语法,有两大阵营:

  • 英特尔:
    操作码dest,src
  • AT&T:
    操作码src,dest
在您的示例中,您使用的是AT&T语法,即默认语法。但是,如果您希望切换到“英特尔语法”,则可以使用
-masm=Intel
进行编译,或使用以下命令:

__asm__(".intel_syntax;" ...);
您可以在或Stackoverflow thread中找到关于该主题的更多讨论,或阅读更多内容。

中的it声明gcc不是基于Intel汇编语言,而是基于从AT&T Unix汇编程序派生的语言。关于程序集语法,有两大阵营:

  • 英特尔:
    操作码dest,src
  • AT&T:
    操作码src,dest
在您的示例中,您使用的是AT&T语法,即默认语法。但是,如果您希望切换到“英特尔语法”,则可以使用
-masm=Intel
进行编译,或使用以下命令:

__asm__(".intel_syntax;" ...);
您可以在或Stackoverflow thread中找到关于该主题的更多讨论,或阅读更多内容。

中的it声明gcc不是基于Intel汇编语言,而是基于从AT&T Unix汇编程序派生的语言。关于程序集语法,有两大阵营:

  • 英特尔:
    操作码dest,src
  • AT&T:
    操作码src,dest
在您的示例中,您使用的是AT&T语法,即默认语法。但是,如果您希望切换到“英特尔语法”,则可以使用
-masm=Intel
进行编译,或使用以下命令:

__asm__(".intel_syntax;" ...);
您可以在或Stackoverflow thread中找到关于该主题的更多讨论,或阅读更多内容。

中的it声明gcc不是基于Intel汇编语言,而是基于从AT&T Unix汇编程序派生的语言。关于程序集语法,有两大阵营:

  • 英特尔:
    操作码dest,src
  • AT&T:
    操作码src,dest
在您的示例中,您使用的是AT&T语法,即默认语法。但是,如果您希望切换到“英特尔语法”,则可以使用
-masm=Intel
进行编译,或使用以下命令:

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

您可以在或Stackoverflow thread中找到关于该主题的更多讨论,或阅读更多内容。

谢谢您的回答。我知道AT&T语法和Intel语法之间的操作数顺序是颠倒的,这两种语法在有两个操作数的指令中是有区别的。有时可能会让人困惑:)为了找出哪种语法是有效的,我尝试将一个立即数存储到寄存器中:
\u asm\u(“mov$0,%eax”),这将抱怨立即数或寄存器命名的位置。有关更多详细信息,请参阅。感谢您的回答。我知道AT&T语法和Intel语法之间的操作数顺序是颠倒的,这两种语法在有两个操作数的指令中是有区别的。有时可能会让人困惑:)为了找出哪种语法是有效的,我尝试将一个立即数存储到寄存器中:
\u asm\u(“mov$0,%eax”),这将抱怨立即数或寄存器命名的位置。有关更多详细信息,请参阅。感谢您的回答。我知道AT&T语法和Intel语法之间的操作数顺序是颠倒的,这两种语法在有两个操作数的指令中是有区别的。有时可能会让人困惑:)为了找出哪种语法是有效的,我尝试将一个立即数存储到寄存器中:
\u asm\u(“mov$0,%eax”),这将抱怨立即数或寄存器命名的位置。有关更多详细信息,请参阅。感谢您的回答。我知道AT&T语法和Intel语法之间的操作数顺序是颠倒的,这两种语法在有两个操作数的指令中是有区别的。有时可能会让人困惑:)为了找出哪种语法是有效的,我尝试将一个立即数存储到寄存器中:
\u asm\u(“mov$0,%eax”),这将抱怨立即数或寄存器命名的位置。有关更多详细信息,请参阅。请注意,无需编写SIMD程序集来对代码进行矢量化。如果为(int i=0;iNote)编写循环
,则无需编写SIMD汇编来对代码进行矢量化。如果为(int i=0;iNote)编写循环
,则无需编写SIMD汇编来对代码进行矢量化。如果为(int i=0;iNote)编写循环
(int i=0;i说明无需编写SIMD汇编来对代码进行矢量化。如果为(int i=0;i)编写循环