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

RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8-R15 是否可以互换?

宋正真
2023-03-14

x64寄存器是可互换的吗?从某种意义上说,适用于其中一种组合的任何指令都可以适用于任何其他组合?除了名称之外,是否有性能差异或任何其他考虑因素使它们彼此不同?

共有2个答案

文德曜
2023-03-14

有一些限制,在编码上也有一些差异。

rsp(和esp等)不能用作索引寄存器。有许多指令在特定寄存器中接受参数或返回结果 - 例如,变量移位指令仅采用cl中的参数。

算术指令(和test)对rax加上32位立即数进行了短编码:

8:  48 05 ff ff 00 00       add    $0xffff,%rax
e:  48 81 c3 ff ff 00 00    add    $0xffff,%rbx

我敢肯定,还有其他一些我目前无法想到的零碎部分:查阅建筑手册,了解血腥的细节。

柴嘉石
2023-03-14

不。虽然大多数x86以及x86_64指令可以使用任何寄存器作为GPR,但某些指令仅适用于特定的寄存器或一组寄存器,例如movabs,mul,div...

有关隐式寄存器用法的更多详细信息,请阅读此处

另请参见EAX、EBX、ECX和EDX的数据寄存器是否可以互换

 类似资料:
  • 我想学习asm,来自C 一本书建议尝试实现这个算法,这是一个非常简单的排序算法 我的代码的开头是(如果需要,可以提供其余部分) 在第38行,我得到了错误:无效的有效地址 起初我认为这是一个对齐错误(因此排序函数开始时的推送四字) 然后我尝试使用movq指令(由于其他原因显然不起作用,我已经阅读了指令手册) 向内存地址移动似乎可行,即使被寄存器引用(至少mov[rax],qword[rbp-24-r

  • null 现在我是否感到困惑:如果我想访问中的第一个字符并将其存储在eax寄存器中,我希望汇编程序执行如下操作: 如果我需要访问存储在ARGV[1]中的第二个字符并将其存储在eax寄存器中,我希望汇编程序执行如下操作: 但相反,我看到编译器执行以下操作: null

  • 根据Intel在x64中的说法,以下寄存器被称为通用寄存器(RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP和R8-R15)https://software.Intel.com/en-us/articles/indroduction-to-x64-assembly。 在下面的文章中,RBP和RSP是特殊用途寄存器(RBP指向当前堆栈帧的底部,RSP指向当前堆栈帧的顶部)。https:

  • 在wikipedia x86调用约定中,它说对于Microsoft x64调用约定: 寄存器RBX、RBP、RDI、RSI、RSP、R12、R13、R14和R15被视为非易失性(被叫方保存)。 但对于System V AMD64 ABI: 如果被调用方希望使用寄存器RBX、RBP和R12-R15,则必须在将控制权返回给调用方之前恢复它们的原始值。 我的问题是,在不同的平台上调用约定是不是不同的?(

  • 问题内容: 在此系统中,我们存储产品,产品图像(产品可能有很多图像)和产品的默认图像。数据库: 如您所见,和,是循环参考。可以吗 问题答案: 不,那不行。表之间的循环引用是混乱的。请参阅这篇(已有十年的历史)文章:SQL By Design:循环参考 一些DBMS可以特别小心地处理这些问题,但是MySQL会遇到问题。 作为您的设计,第一选择是使两个FK之一为可空。这使您能够解决“鸡与蛋”问题(我应

  • 这个问题是关于x86程序集的,但是我提供了一个C语言的例子,因为我试图检查GCC在做什么。 我不确定的是,我所观察到的是因为我更好地意识到并遵守的一些架构约束,还是纯粹是这个特定实现的工件,以及我所读代码的人的习惯的表现,我不应该赋予他们任何意义,例如,这需要在一个方向或另一个方向上完成,只要它是一致的,无论哪个方向都无关紧要。 或者,我现在只是在读写一些琐碎的代码,这将是双向的,因为我会在一段时