我想编写一个使用临时寄存器的小程序集程序。 当我说临时寄存器时,我的意思是它不是asm块约束意义上的输入或输出寄存器。 我可以选择任何寄存器,然后将其包含在clobber列表中,但我认为编译器能够选择更好。 处理这个问题的正确方法是什么? 我在网上找到的唯一建议是将其列为输出寄存器,然后 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
Microsoft Visual Studio具有一个名为“内联程序集”的功能,该功能使您能够在__asm块内的c ++程序中编写x86代码。
现在我对这个功能有疑问。
该寄存器中的寄存器是真正的寄存器还是只是寄存器的某些虚拟化?
使用此寄存器(例如eax,ebx等)是否会提高性能?
它们是真实的寄存器,与编译器生成的asm使用的寄存器相同。 将编译器输出组装成机器代码后,内联汇编中的哪些指令与编译器发出的指令之间没有区别。
使用此寄存器(例如eax,ebx等)是否会提高性能?
比起什么? 编译器生成的代码已经使用了寄存器,因此,不,除非您确切知道自己在做什么,否则通常无法使用内联asm击败编译器。 (例如,您已经阅读并理解了Agner Fog的所有优化指南 ,英特尔的优化手册等。请参阅https://stackoverflow.com/tags/x86/info中的更多链接)。
用于测试Collatz猜想的C ++代码比手写汇编要快-为什么? 这是手写汇编比汇编程序生成的汇编更糟糕的一个很好的例子。
您(或编译器)将变量保留在寄存器中的次数越多,则变量越频繁更改越好。 您无法避免使用寄存器,因为x86在一些特殊指令之外没有存储器到存储器的指令。 但是您可以(并且应该)避免使用内存。
即便如此,MSVC糟糕的inline-asm语法也使得无法将数据传递到inline asm而不通过内存反弹的情况下,因此您需要在asm中编写一个完整的循环以减轻开销。
请参见'asm','__ asm'和'__asm__'有什么区别? 有关更多信息,以及使用MSVC内联汇编的简单函数的最终编译器输出示例,该示例还显示了编译器生成的指令。
(您可以使用https://godbolt.org/对任何代码自己进行操作。有关查看编译器输出的更多信息,另请参见如何从GCC / clang程序集输出中消除“噪声”? )
https://gcc.gnu.org/wiki/DontUseInlineAsm中的大多数原因都适用于MSVC组件以及GNU C组件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.