繁体   English   中英

这段代码试图做什么?

[英]What is this code trying to do?

我试图了解以下代码的工作方式:

#define M32toX128(x128,m32) __asm__               \
  ("movddup %1, %0\n\t"                           \
   "movsldup    %0, %0"                           \
   : "=&x"(x128) : "m"(m32) )

我只有基本的组装知识。 在使用它的程序的上下文中进行搜索,我了解到它正在复制32位变量并将结果存储在128位变量中。
我的问题是:

  • %0%1指的是什么?
  • 什么是冒号( : )在做什么?
  • 实际执行的汇编代码是什么? 我的意思是替换%n s之后, "=&x"(x128) ...

gcc内联汇编是一个复杂的野兽,过于复杂,无法在此处详细描述。 快速概述一下,asm块的一般形式为: "template" : outputs : inputs : clobbers 您可以在模板中使用%以及从零开始的索引来引用输出和输入(统称为操作数)。 因此%0表示x128%1表示m32 对于每个操作数,可以指定一个约束,该约束告诉编译器如何分配所述操作数。 =&x表示将x128分配为任何可用的xmm寄存器中的早期消息输出,而m表示将内存地址用作操作数。 详见手册

生成的实际程序集将取决于编译器使用的操作数选择。 您可以看到是否要求使用-S选项列出程序集。 假设m32是局部变量,则代码可能类似于:

movddup x(%esp), %xmmN
movsldup %xmmN, %xmmN

请注意,gcc内联汇编程序当然是gcc和体系结构特定的,这意味着使用等效的编译器内在函数更为简单。

该代码将从GCC传递到汇编器阶段。 宏的某些部分将在此过程中被替换。 这里是文档: http : //www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

%0%1将替换为您传递给C宏的值。

:用于分隔宏的各个部分。 第一个必需部分是模板。 第二个用于输出操作数。 有关完整信息,请参见http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5

在这种情况下,您的输出=为128位( x ),并且该宏被宏( & )清除。 m表示这是一个内存操作数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM