Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
内联汇编块的寄存器是真的还是假的? 微软Visual Studio有一个名为“内联汇编”的功能,它可以让你在x+ASM块中的C++程序中编写x86代码。_C++_Visual Studio_Assembly_X86_Inline Assembly - Fatal编程技术网

内联汇编块的寄存器是真的还是假的? 微软Visual Studio有一个名为“内联汇编”的功能,它可以让你在x+ASM块中的C++程序中编写x86代码。

内联汇编块的寄存器是真的还是假的? 微软Visual Studio有一个名为“内联汇编”的功能,它可以让你在x+ASM块中的C++程序中编写x86代码。,c++,visual-studio,assembly,x86,inline-assembly,C++,Visual Studio,Assembly,X86,Inline Assembly,现在我有一个关于这个特性的问题 该块中的寄存器是真实的寄存器还是来自寄存器的虚拟化 使用此寄存器(如eax、ebx等)是否会提高性能?它们是真实的寄存器,与编译器生成的asm使用的寄存器相同。将编译器输出组装到机器代码后,来自内联asm的指令与编译器发出的指令之间没有区别 使用该寄存器(如eax、ebx等)是否会提高性能 和什么相比编译器生成的代码已经使用了寄存器,因此,不,除非您确切知道自己在做什么,否则通常无法击败使用内联asm的编译器。(例如,您已经阅读并理解了所有内容、英特尔优化手册等。

现在我有一个关于这个特性的问题

该块中的寄存器是真实的寄存器还是来自寄存器的虚拟化


使用此寄存器(如eax、ebx等)是否会提高性能?

它们是真实的寄存器,与编译器生成的asm使用的寄存器相同。将编译器输出组装到机器代码后,来自内联asm的指令与编译器发出的指令之间没有区别

使用该寄存器(如eax、ebx等)是否会提高性能

和什么相比编译器生成的代码已经使用了寄存器,因此,不,除非您确切知道自己在做什么,否则通常无法击败使用内联asm的编译器。(例如,您已经阅读并理解了所有内容、英特尔优化手册等。请参阅中的更多链接)

手工编写的asm比编译器生成的asm差,这是一个很好的例子

当变量频繁更改时,您(或编译器)在寄存器中保存的变量越多越好。您无法避免使用寄存器,因为x86除了一些特殊指令外,没有内存到内存的指令。但是你可以(也应该)避免使用内存


即使如此,MSVC糟糕的内联asm语法也无法在不通过内存跳转的情况下将数据传递到内联asm中,因此您需要在asm中编写一个完整的循环来减少开销。

有关这方面的更多信息,请参阅,以及使用MSVC内联asm的简单函数的最终编译器输出示例,该函数还显示了编译器生成的指令

(对于使用的任何代码,您都可以自己执行此操作。有关查看编译器输出的更多信息,请参阅。)


中的大多数原因适用于MSVC asm以及GNU C asm。

它们是实寄存器,与编译器生成的asm使用的寄存器相同。将编译器输出汇编到机器代码后,来自内联asm的指令与编译器发出的指令之间没有区别

使用该寄存器(如eax、ebx等)是否会提高性能

和什么相比编译器生成的代码已经使用了寄存器,因此,不,除非您确切知道自己在做什么,否则通常无法击败使用内联asm的编译器。(例如,您已经阅读并理解了所有内容、英特尔优化手册等。请参阅中的更多链接)

手工编写的asm比编译器生成的asm差,这是一个很好的例子

当变量频繁更改时,您(或编译器)在寄存器中保存的变量越多越好。您无法避免使用寄存器,因为x86除了一些特殊指令外,没有内存到内存的指令。但是你可以(也应该)避免使用内存


即使如此,MSVC糟糕的内联asm语法也无法在不通过内存跳转的情况下将数据传递到内联asm中,因此您需要在asm中编写一个完整的循环来减少开销。

有关这方面的更多信息,请参阅,以及使用MSVC内联asm的简单函数的最终编译器输出示例,该函数还显示了编译器生成的指令

(对于使用的任何代码,您都可以自己执行此操作。有关查看编译器输出的更多信息,请参阅。)


中的大多数原因适用于MSVC asm以及GNU C asm。

寄存器是真实的。是的,如果使用它们,性能通常会提高。请注意,C编译器有一个非常好的优化程序,它在挑选寄存器方面通常比您做得更好,因此除非您确切知道自己在做什么,否则您应该避免使用内联汇编。有些C编译器,如armcc,确实在内联汇编中使用虚拟寄存器。Microsoft或GCC内联程序集都没有。寄存器是真实的。是的,如果使用它们,性能通常会提高。请注意,C编译器有一个非常好的优化程序,它在挑选寄存器方面通常比您做得更好,因此除非您确切知道自己在做什么,否则您应该避免使用内联汇编。有些C编译器,如armcc,确实在内联汇编中使用虚拟寄存器。微软和GCC内联汇编都没有。所以还有一个问题,例如,我的处理器是一个核心i5处理器,它的体系结构肯定与x86不同。我的意思是它可能比x86有更多的寄存器。内联汇编只有几个x86寄存器。其他寄存器呢?@RamtinMousavi:你的i5是x86-64处理器。它可以在32位或64位模式下运行。为64位模式编译时,MSVC内联asm不可用。编译器生成的代码可以使用64位寄存器。在32位模式下运行时,“仅”得到8而不是16个整数寄存器,xmm/ymm/zmm 0..7而不是xmm/ymm0..15或zmm0..31,但您仍然拥有x87堆栈、MPX绑定寄存器、EFLAG以及段、调试和控制寄存器。@RamtinMousavi当然您的CPU是具有x86体系结构的x86 CPU。它确实有其他寄存器,但它们不是eax、ebx等通用寄存器,因此不能将它们直接用于相同的目的。@fuz谢谢。我不知道所有的核心ix CPU也是x86。8086之后发布的所有英特尔CPU是否都使用相同的汇编语言?@RamtinMousavi虽然英特尔也生产具有其他体系结构的处理器,但您通常会遇到的所有英特尔CPU都是x86处理器。同样适用于AMD处理器。如果架构不同,那么x86程序在没有先重新编译的情况下不会在这些芯片上运行。因此还有另一个问题,例如,我的处理器是一个核心i5处理器,它的架构肯定与x86不同。我的意思是它可能比x86有更多的寄存器。