Gcc 写内联程序集而不使用clobber列表?
是否可以使用GCC或Clang编写内联程序集(英特尔语法),而无需了解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”)可以通过任何非易失性的内存访问重新
我猜是“否”,因为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