内联汇编块的寄存器是真的还是假的?
registers of inline assembly block are real or fake?
Microsoft visual studio 有一个名为 "Inline assembly" 的功能,它使您能够在 __asm 块内的 c++ 程序中编写 x86 代码。
现在我有一个关于此功能的问题。
这个块中的寄存器是真实寄存器还是寄存器的一些虚拟化?
使用这个寄存器(如 eax 、 ebx 等)是否会提高性能?
它们是真正的寄存器,与编译器生成的 asm 使用的寄存器相同。将编译器输出组装成机器代码后,来自内联 asm 和来自内联 asm 的指令之间没有区别.哪些是由编译器发出的。
Does using this registers (like eax , ebx and etc.) improve the performance ?
与什么相比? 编译器生成的代码已经使用了寄存器,所以不,除非您确切地知道自己在做什么,否则您通常无法使用内联 asm 击败编译器。(例如,您已经阅读并理解所有 Agner Fog's optimization guides, Intel's optimization manual, and so on. See more links in https://whosebug.com/tags/x86/info).
是手写 asm 比编译器生成的 asm 更糟糕的一个很好的例子。
当变量经常变化时,你(或编译器)在寄存器中保存的变量越多越好。您无法避免 使用寄存器,因为除了一些特殊指令外,x86 没有内存到内存指令。但是你可以(并且应该)避免使用内存。
即便如此,MSVC 糟糕的内联 asm 语法使得无法将数据传递到内联 asm 而不通过内存将其弹回,因此您需要在 asm 中编写一个完整的循环来缓解这种情况开销。
请参阅 What is the difference between 'asm', '__asm' and '__asm__'? 了解更多信息,以及使用 MSVC 内联汇编的简单函数的最终编译器输出示例,该示例还显示了编译器生成的指令。
(您可以自己对使用 https://godbolt.org/. See also 的任何代码执行此操作,以了解有关查看编译器输出的更多信息。)
https://gcc.gnu.org/wiki/DontUseInlineAsm 中的大部分原因适用于 MSVC asm 以及 GNU C asm。
Microsoft visual studio 有一个名为 "Inline assembly" 的功能,它使您能够在 __asm 块内的 c++ 程序中编写 x86 代码。
现在我有一个关于此功能的问题。
这个块中的寄存器是真实寄存器还是寄存器的一些虚拟化?
使用这个寄存器(如 eax 、 ebx 等)是否会提高性能?
它们是真正的寄存器,与编译器生成的 asm 使用的寄存器相同。将编译器输出组装成机器代码后,来自内联 asm 和来自内联 asm 的指令之间没有区别.哪些是由编译器发出的。
Does using this registers (like eax , ebx and etc.) improve the performance ?
与什么相比? 编译器生成的代码已经使用了寄存器,所以不,除非您确切地知道自己在做什么,否则您通常无法使用内联 asm 击败编译器。(例如,您已经阅读并理解所有 Agner Fog's optimization guides, Intel's optimization manual, and so on. See more links in https://whosebug.com/tags/x86/info).
当变量经常变化时,你(或编译器)在寄存器中保存的变量越多越好。您无法避免 使用寄存器,因为除了一些特殊指令外,x86 没有内存到内存指令。但是你可以(并且应该)避免使用内存。
即便如此,MSVC 糟糕的内联 asm 语法使得无法将数据传递到内联 asm 而不通过内存将其弹回,因此您需要在 asm 中编写一个完整的循环来缓解这种情况开销。
请参阅 What is the difference between 'asm', '__asm' and '__asm__'? 了解更多信息,以及使用 MSVC 内联汇编的简单函数的最终编译器输出示例,该示例还显示了编译器生成的指令。
(您可以自己对使用 https://godbolt.org/. See also
https://gcc.gnu.org/wiki/DontUseInlineAsm 中的大部分原因适用于 MSVC asm 以及 GNU C asm。