Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 写内联程序集而不使用clobber列表?_Gcc_Assembly_X86_Clang_Inline Assembly - Fatal编程技术网

Gcc 写内联程序集而不使用clobber列表?

Gcc 写内联程序集而不使用clobber列表?,gcc,assembly,x86,clang,inline-assembly,Gcc,Assembly,X86,Clang,Inline Assembly,是否可以使用GCC或Clang编写内联程序集(英特尔语法),而无需了解clobber列表“东西” 我猜是“否”,因为clobber列表“stuff”确保您不会过度写入编译器写入的寄存器(在内联程序集开始之前)?GNU C基本内联asm语句(无操作数/clobber列表)基本上不建议用于除\u属性体(裸)之外的任何对象功能。(globals也不能安全使用。) 表示查看不使用基本asm语句的原因。在基本asm中,您无法真正安全地执行任何操作;甚至asm(“cli”)可以通过任何非易失性的内存访问重新

是否可以使用GCC或Clang编写内联程序集(英特尔语法),而无需了解clobber列表“东西”


我猜是“否”,因为clobber列表“stuff”确保您不会过度写入编译器写入的寄存器(在内联程序集开始之前)?

GNU C基本内联asm语句(无操作数/clobber列表)基本上不建议用于除
\u属性体(裸)之外的任何对象
功能。(globals也不能安全使用。)

表示查看不使用基本asm语句的原因。在基本asm中,您无法真正安全地执行任何操作;甚至
asm(“cli”)可以通过任何非易失性的内存访问重新排序

如果您打算使用内联asm(而不是在asm中编写独立函数,或使用内部函数编写C),您需要向编译器详细描述asm指令字符串,以带有输入和/或输出操作数和/或clobber的黑盒形式。有关指南的链接,包括有关使用输入/输出约束的一些SO答案,请参见

在决定是否值得使用GNUC内联asm之前,请仔细考虑。如果您可以让编译器以另一种方式发出相同的指令,那几乎总是更好。内部或纯C允许恒定传播优化;内联asm不会(除非您执行类似于
if({builtin\u constant\u p(x)){pure C version}或者{inline asm version}
)的操作)


英特尔语法:在GCC中,使用
-masm=Intel
编译,使asm模板成为英特尔语法
.s
的一部分,编译器将以英特尔语法替换操作数。(如
dword ptr[rsp]
而不是
(%rsp)
表示
“m”(my_int)

在clang中,我不确定是否有任何方便的方法可以在正常的asm语句中使用Intel语法


不过,如果您不关心高效的代码(但为什么要使用asm?),还有另一种选择:clang支持
-fasm块
,允许使用类似MSVC低效的内联asm风格的语法。
是的,这使用了英特尔语法

显示结果代码的效率有多低:充满了编译器生成的指令,用于将输入变量存储到内存中,以便
asm{}
块读取它们。因为MSVC风格的asm块不能在寄存器中进行输入或输出。(Clang不支持leave-a-value-in-EAX方法获取单个值,因此也必须存储/重新加载输出。)

您不需要为此指定缓冲区,因此我假设asm块意味着一个
“内存”
缓冲区,以及您写入的所有寄存器上的缓冲区。(甚至可能只是提及。)


我不建议这样做;以这种方式,基本上不可能有效地包装一条或几条指令。只有在编写整个循环时,才能分摊将输入输入到
asm{}
块的开销。

GNU C基本内联asm语句(无操作数/缓冲列表)基本上不建议用于任何对象,除了
\uu属性(裸)函数体之外。(globals也不能安全使用。)

表示查看不使用基本asm语句的原因。在基本asm中,您无法真正安全地执行任何操作;甚至
asm(“cli”)可以通过任何非易失性的内存访问重新排序

如果您打算使用内联asm(而不是在asm中编写独立函数,或使用内部函数编写C),您需要向编译器详细描述asm指令字符串,以带有输入和/或输出操作数和/或clobber的黑盒形式。有关指南的链接,包括有关使用输入/输出约束的一些SO答案,请参见

在决定是否值得使用GNUC内联asm之前,请仔细考虑。如果您可以让编译器以另一种方式发出相同的指令,那几乎总是更好。内部或纯C允许恒定传播优化;内联asm不会(除非您执行类似于
if({builtin\u constant\u p(x)){pure C version}或者{inline asm version}
)的操作)


英特尔语法:在GCC中,使用
-masm=Intel
编译,使asm模板成为英特尔语法
.s
的一部分,编译器将以英特尔语法替换操作数。(如
dword ptr[rsp]
而不是
(%rsp)
表示
“m”(my_int)

在clang中,我不确定是否有任何方便的方法可以在正常的asm语句中使用Intel语法


不过,如果您不关心高效的代码(但为什么要使用asm?),还有另一种选择:clang支持
-fasm块
,允许使用类似MSVC低效的内联asm风格的语法。
是的,这使用了英特尔语法

显示结果代码的效率有多低:充满了编译器生成的指令,用于将输入变量存储到内存中,以便
asm{}
块读取它们。因为MSVC风格的asm块不能在寄存器中进行输入或输出。(Clang不支持leave-a-value-in-EAX方法获取单个值,因此也必须存储/重新加载输出。)

您不需要为此指定缓冲区,因此我假设asm块意味着一个
“内存”
缓冲区,以及您写入的所有寄存器上的缓冲区。(甚至可能只是提及。)


我不建议这样做;以这种方式,基本上不可能有效地包装一条或几条指令。只有在编写一个完整的循环时,才能分摊将输入输入到
asm{}
块中的开销。

是的,但这破坏了使用内联汇编的意义,内联汇编用于与编译器生成的代码无缝集成。你也可以访问v