如何使用多寄存器处理大数?
假设您需要对32位寄存器中的大数进行一些计算,解决问题的唯一方法是使用寄存器,内存解决方案不可用
喜欢乘法和偏差:
我们有admin.initializeApp(functions.config().firebase);
const db = admin.database();
const provider = new HDWalletProvider(mnemonic, infura link);
const web3 = new Web3(provider);
是否有方法或算法或指令将您的价值直接存入edx:eax
?
就像你在内存中有reg1:reg2:reg3...regn
一样,如果可能的话,如何将它存储在一个32位的32位寄存器中
答案 0 :(得分:4)
对于旧的8080和Z80 CPU,直接支持多寄存器操作,但只有预选的寄存器对,例如Z80有8位寄存器a, b, c, d, e, h, l
和add hl,de
操作的指令有16b对它们(但是例如这个16b add
不会更新标志,与8位add d,e
相反,等等,它们比8位变体慢一些,因此使用时仍有一些损失16位值,但通常16b对比仅使用8位指令写入的相同任务更有效。
8080的这个特性是8086 ah:al = ax
8b寄存器的灵感(我猜,没有事实)形成16b寄存器,并且指令不仅可以使用8位寄存器而且可以使用pre - 选择对。虽然8086更像是原生的16b CPU,但是这个功能相当“让支持16b寄存器到8b的故障使8b SW的迁移更容易”,而不是“让支持将两个8b寄存器配对为16b数学”。
在80386之后,这种做法被放弃了,名为a
的{{1}}寄存器的32位扩展没有为16b部分添加新的别名,这使得单独访问它更加困难(低16b由原始eax
别名,这是与8086/186/286向后兼容所需的任何方式。)
因为ax
上部的那些额外的16b寄存器会大大增加寄存器的数量,使得旧的指令编码不再可行,并且实际上具有x86指令集的性质将是非常困难的保持基本指令大多为2个字节长,额外的组合可能会将该平均值提高到3个字节。
现在,您支持更多多寄存器组合的想法会更加快速地爆炸所需的操作码,因此这样的ISA平均每条指令大约需要4-6个字节。
虽然基本上花了相当长的时间才让人们开始感受到16b数学的严重限制(从0到65535的值确实让我看起来非常多,回到我在ZX Spectrum上用Z80 CPU做一些程序时),32b是真正的突破,甚至大多数现实生活中的人类数学任务,如店内价格等。可以很容易地用32b整数完成。经过另外十年+更频繁地达到这个限制(比在特殊情况下),就像整个电影开始在磁盘上编码一样,磁盘通常超过千兆字节。
所以你所要求的通常根本不需要(今天的64b选项进一步推动,这涵盖了疯狂的价值范围),当最终需要时,从单独的指令构建它是非常简单的。 ..例如80386+代码,用eax, ebx, ...
添加eax:ebx:ecx
:
esi:edi:edx
很简单,不能证明上面提到的操作码大小的爆炸性,以便将这样的东西直接放入CPU中。