繁体   English   中英

内联汇编块的寄存器是真实的还是假的?

registers of inline assembly block are real or fake?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

Microsoft Visual Studio具有一个名为“内联程序集”的功能,该功能使您能够在__asm块内的c ++程序中编写x86代码。

现在我对这个功能有疑问。

该寄存器中的寄存器是真正的寄存器还是只是寄存器的某些虚拟化?

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

1 个回复

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

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

比起什么? 编译器生成的代码已经使用了寄存器,因此,不,除非您确切知道自己在做什么,否则通常无法使用内联asm击败编译器。 (例如,您已经阅读并理解了Agner Fog的所有优化指南 ,英特尔的优化手册等。请参阅https://stackoverflow.com/tags/x86/info中的更多链接)。

用于测试Collat​​z猜想的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组件。

1 内联汇编块中的临时寄存器

我想编写一个使用临时寄存器的小程序集程序。 当我说临时寄存器时,我的意思是它不是asm块约束意义上的输入或输出寄存器。 我可以选择任何寄存器,然后将其包含在clobber列表中,但我认为编译器能够选择更好。 处理这个问题的正确方法是什么? 我在网上找到的唯一建议是将其列为输出寄存器,然后 ...

2 使用寄存器和内联汇编(ARM)

我有一个小程序,试图通过编程来识别CPU频率。 我的程序结构如下: 设置闹钟 while(1)循环中的增量寄存器 根据SIGALRM计算速度 最初,我在使用 使用objdump时,我注意到它实际上转换为以下内容: 由于我不确定为什么将其转换 ...

3 内联汇编输出寄存器声明

我只是要学习内联汇编。GCC内联汇编食谱http://www.ethernut.de/en/documents/arm-inline-asm.html说: 有人可以告诉我这个规则是否正确? 假设我通过某个寄存器获取输入操作数的值。 如果我不打算将其声明为输出操作数,是否不允许在同 ...

5 如何使用内联汇编器保存寄存器值

(嗯,这是我第一次在这里问问题,英语不是我的母语,所以请您原谅我的一些错误。而且我是一个绿色的练习生。) 我在做操作系统作业时遇到了这个问题,我们被要求模拟SwitchToFiber函数,而我目前的问题是我不知道如何保存寄存器值以在下次调用该函数时恢复它。 我不知道我的问题是否很清楚 ...

6 使用内联汇编的寄存器输出清零

我已经经历了几个线程,并且似乎所有措辞都正确无误……但是我的output_01返回的是false。 似乎内联程序集正在向我的变量写入零...而我只是不知道为什么。 下面是来自主c文件的代码,该文件调用了程序集以及它所调用的程序集(并且还引发了头文件,尽管我认为它没有任何关系……但细节在于细节 ...

7 从内联汇编修改RIP寄存器

我正在尝试修改rip寄存器(只是为了好玩)。 buffer应该是一个内存地址,所以我不知道为什么我得到Error: operand type mismatch for 'movq' ...

8 GCC内联汇编可以操纵所有寄存器吗?

我试图在C(GCC 4.6.3,x86(64位CPU),Ubuntu 12.04 64位)中进行一些程序集调用,以将寄存器值清零并设置堆栈指针,并最终调用跳转指令。 这就是我得到的: 它说Error: operand type mismatch for 'xor'当我尝试编译时,除 ...

10 GNU内联汇编:哪些寄存器被__stdcall破坏?

如果我通过C ++代码中的GNU内联汇编程序使用call指令来调用我知道的使用__stdcall约定的函数,我是否必须将任何寄存器列为已破坏? 我在互联网上找不到很好的指导,但是看起来%eax , %edx和%ecx是调用方保存的,前两个保留用于返回值。 这是我的代码。 我想知道在 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM