当前位置: 首页 > 知识库问答 >
问题:

编写程序集时使用哪个寄存器重要吗?

边浩漫
2023-03-14

换句话说,你是可以平等地将它们视为存储空间,还是应该坚持将它们用于特定目的?

共有3个答案

丁阳羽
2023-03-14

如果您正在编写程序集,将值分配给哪个寄存器重要吗?

用于80x86;您使用的寄存器可能很重要的情况包括:

>

使用具有隐含寄存器的指令(MUL、DIV、MOVSQ/D/W/B、STOSQ/D/W/B、XLATB、AAA、CWD等-有很多)

当段不完全相同时,尝试避免段寄存器前缀的成本(例如,mov[ds:bp],…mov[bx],…)。

避免由于“MOD/RM”字段的限制而无法编码的地址计算(例如mov[di si],...)对于32/64位代码来说大多无关紧要,任何reg都可以是基或(ESP/RSP除外)索引。

避免64位代码中的REX前缀(例如,mov ebx,1与mov r8d,1)

一般来说;没关系(这不是不好的做法,也不会影响性能);但是,这可能取决于周围的代码(稍后如何使用该值),并且可能会提高性能或降低性能。

更具体地说,即使所有寄存器都相同,也很难实现最佳寄存器分配(NP完全问题);80x86(在某些情况下,所有寄存器都不相同)使实现最佳寄存器分配变得更加困难。(并且将寄存器分配与指令调度联系起来,例如以不同的顺序进行操作,以最大限度地减少数据进出寄存器的移动,因为某个指令需要它们。)

王棋
2023-03-14

在任何只有代码在运行的地方,您可以出于任何目的使用任何寄存器。然而,前提有两个主要的错误:

>

您的系统有一个调用约定。无论何时调用其他人的库函数(或为此而进行的系统调用),都需要将参数放在他们想要的位置,并且无论您想要它放在哪里,它们都会将返回值放在标准位置。

您的调用约定还允许函数在不保存的情况下销毁一些寄存器:易失性寄存器与非易失性寄存器。e、 g.通常,标志、EAX、ECX和EDX在32位x86调用约定中是不稳定的,而其余整数寄存器在对ABI兼容函数的调用中保留。查看UNIX的调用约定

陈翰林
2023-03-14

首先,您必须使用支持您想要使用的指令的寄存器。

以某些双寄存器乘除指令为例,它们特别涉及eax和edx的特定用途。

接下来,您要使用高效的寄存器,即寄存器:

>

这是不受阻碍的,即由于调用约定,也就是说它们不会为其使用产生额外的(软件/调用约定定义的)开销——除非该开销已经支付!

这是生成的值的最终目的地:例如,如果是第二个参数,则是对应于要传递的第二个值的寄存器(同样根据调用约定)。

 类似资料:
  • 我正在努力学习组装,这在一定程度上是有意义的,但我有一个问题。我有以下源文件: 很好用。我只是不明白为什么在不同的情况下需要使用特定的整数寄存器。 例如,通过反复试验,我发现当说我想要哪个系统调用时,例如。 我将值放入整数寄存器,但也可以使用整数寄存器、、或。 编辑:我的问题不是这个问题的重复,因为这个问题问的是在哪里使用更小的整数寄存器,我问的是一种决定使用哪个整数寄存器的方法。

  • 我在某个存储库类上有一个方法,它返回。完成这些期货的代码使用一个第三方库来阻止。我打算有一个单独的有界,这个存储库类将使用它来进行这些阻塞调用。 这里有一个例子: 我的应用程序的其余部分将组成这些期货,并用结果做一些其他的事情。当提供给、、等的其他函数时,我不希望它们在存储库的上运行。 另一个例子: JavaDoc声明: 为非异步方法的从属完成提供的操作可以由完成当前CompletableFutu

  • 对于这种特定的情况,目标平台是一个ARM7系统,代码正在用GCC5.3.0进行编译。正在执行的系统调用具有与C函数调用相同的调用约定。经过一些尝试和错误,我得到了上面的“工作”,但我还不相信它是正确的,并且会一直工作,服从于优化编译器的奇思妙想。 我希望能够删除“内存”clobber,并确切地告诉GCC哪些内存将被修改,但是GCC扩展的Asm文档讨论了如何为特定寄存器赋值,然后是内存约束,但如果它

  • 为spring boot应用程序集成EhCache3缓存提供程序。我需要决定使用哪个缓存管理器。理想情况下,我希望在我的缓存方法上使用Springs缓存注释,例如@Cacheable,而不是jsr(@CacheResult),但对于cachemanager/cache库,我无法决定以下内容 我决定使用ehcache3提供程序进行缓存库注释: 对哪种实施方式有何建议?也许我不清楚上面的实现有什么不同

  • 我正试图用PhpUnit和Composer。为此,我做了: 1添加phpUnit到req作曲家部分: 2.根据需要安装: php编写器。phar安装--dev 手术成功结束。 安装phpunit/phpunit(3.7.6)下载:100% 不幸的是,当我想做测试时,我得到了 ./vendor/bin/phpunit PHP致命错误:对/home/serek/PHP/project/tests/bo

  • 我已经尝试了大约一个小时,现在注册一个编解码器,我为我的一个课程在一个游戏中,我正在工作。该类名为。我尝试了这3个地方的代码和建议: null 下面是我用的代码: 所以我构建了一个名为的编解码器和编解码器提供程序,那么我做错了什么,怎么会这么复杂呢?我是不是漏掉了什么?它似乎比它需要的要复杂得多。如果你需要更多的代码,请询问。谢了。 Edit:我得到的确切错误是另外,我正试图解析一个项数组,我是否