使用多寄存器处理大量数据

use of multi register to work with large numbers

如何使用多寄存器处理大数?


假设您需要对 32 位寄存器无法容纳的大数进行一些计算,并且解决问题的唯一方法是使用寄存器,内存解决方案不可用


喜欢乘法和求差:

我们有 edx:eax

是否有一种方法或算法或指令可以将您的值直接放入 reg1:reg2:reg3...regn

如果你的内存中有 dq 如何将它存储在两个 32 位寄存器中,如果可能的话

旧的 8080 和 Z80 CPUs 直接支持 multi-register 操作,尽管只有 pre-selected 对寄存器,就像 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-selected 对。虽然 8086 更像原生 16b CPU,所以这个特性更像是 "let support the breakdown of 16b registers to 8b for making migration of 8b SW easier",而不是 "let support pairing two 8b registers for 16b math"。

在 80386 之后,这种做法被放弃了,a 寄存器的 32 位扩展名 eax 没有为上部 16b 部分添加新的别名,使得单独访问它变得更加困难(低 16b 是原始 ax 的别名,这是与 8086/186/286 向后兼容所必需的)。

因为eax, ebx, ...上半部分的那些额外的16b寄存器会大大增加寄存器的数量,使得旧的指令编码不再可行,实际上x86指令集的性质会是很难让基本指令大多为 2 个字节长,额外的组合可能会将平均值提高到 3 个字节。

现在,您支持更多 multi-register 组合的想法会使所需的操作码爆炸得更多更快,因此这样的 ISA 平均每条指令可能需要大约 4-6 个字节。

虽然基本上花了很长一段时间人们才开始感到受到 16b 数学的严重限制(从 0 到 65535 的值在我看来确实很多,回到我在 ZX Spectrum 上做一些程序的时候Z80 CPU),而 32b 是真正的突破,甚至大多数 real-life 人类数学任务,如 shop/etc 中的价格。可以很容易地用 32b 整数完成。又花了十年多的时间才更频繁地达到这个限制(不仅仅是在特殊情况下),比如当整部电影确实开始在磁盘上编码时,磁盘的大小通常超过千兆字节。

所以通常根本不需要您提出的问题(今天的 64b 选项进一步推动了它,它涵盖了疯狂的值范围),并且当最终需要它时,从单独的构建它非常简单说明...例如 80386+ 代码添加 eax:ebx:ecxesi:edi:edx:

    ; eax:ebx:ecx += esi:edi:edx  (96b integer addition)
    add  ecx, edx
    adc  ebx, edi
    adc  eax, esi

简单到不能证明上面提到的将这样的东西直接放入 CPU.

的操作码大小爆炸是合理的