[英]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.