gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:21 24 4
gpt4 key购买 nike

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


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


比如乘法和偏差:

我们有 edx:eax

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

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

最佳答案

旧的 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 一起运行位寄存器,但也与预选对。尽管 8086 更像是原生 16b CPU,因此此功能更像是“支持将 16b 寄存器分解为 8b,以便更轻松地迁移 8b 软件”,而不是“支持配对两个 8b 寄存器以进行 16b 数学运算”。

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

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

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

虽然基本上花了很长一段时间人们才开始感到受到 16b 数学的严重限制(从 0 到 65535 的值在我看来确实很多,回到我用 Z80 CPU 在 ZX Spectrum 上做一些程序的时候),而 32b 是真正的突破,甚至是大多数现实生活中的人类数学任务,如商店价格等。可以很容易地用 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 的操作码大小爆炸是合理的。

关于algorithm - 使用多寄存器处理大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49181818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com