【问题标题】:32 bit operations on 8 bit architecture [closed]8位架构上的32位操作[关闭]
【发布时间】:2019-10-07 05:29:07
【问题描述】:

我只是想问你是否有可能在 8 位架构上获得 32 位操作,如果可以,如何实现?

我考虑了一段时间,我最好的想法是 typedef char[N] 从 N 字节大小获取类型,然后实现诸如 add(char *, char *) 之类的函数。

提前致谢!

(我正在使用大约 6502 处理器)

【问题讨论】:

  • 有用于任意宽度/精度数学的库。
  • link 这个类似的 32bit os calc 64bit long long int
  • 这取决于您的平台和您未指定的工具集。
  • 检查nand2tetris.org - 这对建立这样的基本理解很有好处

标签: c 32-bit 8-bit


【解决方案1】:

您已将您的问题标记为“C”,因此此答案会考虑到这一点。

我知道的大多数 8 位系统的 C 编译器都有 long 类型。您可以简单地使用这些。


说了这么多,它是如何工作的?

所有常见的 8 位处理器都有一个特殊的 1 位标志,用于接收来自 8 位操作的进位/借位。他们有考虑到这个标志的加法和减法指令。所以一个 32 位的加法会被翻译成这个序列:

    ; 1st operand in R0 to R3
    ; 2nd operand in R4 to R7
    ; addition works only with A(ccumulator)
    ; result goes into R0 to R3
    MOV     A,R0
    ADD     A,R4
    MOV     R0,A
    MOV     A,R1
    ADDC    A,R5
    MOV     R1,A
    MOV     A,R2
    ADDC    A,R6
    MOV     R2,A
    MOV     A,R3
    ADDC    A,R7
    MOV     R3,A

想想你是如何在纸上算数的。不需要在最右边的数字上添加进位,即最低有效的数字。由于右边没有“无”,所以没有进位。我们可以将每个 8 位步骤解释为对以 256 为基数的数字系统的一位数的操作。

对于位操作,不需要进位或借位。


另一个想法:你怎么称呼 8 位系统?什么时候指令只能并行处理 8 位,或者数据总线只有 8 位宽?

对于后一种情况,我们可以看看例如 68008 处理器。在一个 32 位处理器内部,它的数据总线只有 8 位。在这里,您将使用 32 位指令。如果处理器从/向内存读取或写入 32 位值,它将自动生成 4 个连续的访问周期。

【讨论】:

  • 谢谢,但我不太明白为什么第一次添加没有进位。你能解释一下吗?
  • 谢谢!很好的解释!
【解决方案2】:

许多(我所知道的...)CPU 都有所谓的“进位标志”(1 位),当加法或减法导致回绕时设置。它基本上是计算的额外位。然后他们有加法和减法的版本,其中包括这个进位标志。因此,您可以(例如)通过进位进行 4 个 8 位加法来进行 32 位加法。

伪代码示例,小端机器(因此 4 字节结果中的字节 0 是最低有效字节):

carry,result[0] = opA[0] + opB[0]
carry,result[1] = opA[1] + opB[1] + carry
carry,result[2] = opA[2] + opB[2] + carry
carry,result[3] = opA[3] + opB[3] + carry
if carry == 1, overflow the 32 bit result

第一个加法指令可能称为 ADD(不包括进位,只是设置它),而随后的加法可能称为 ADC(包括进位并设置它)。有些 CPU 可能只有 ADC 指令,需要先清除进位标志。

【讨论】:

    【解决方案3】:

    如果你使用标准的int / long 类型,编译器会自动做正确的事情。 long 具有(至少)32 位,因此无需手动处理进位;编译器已经能够做到这一点。如果可能,请使用标准的uint32_t/int32_t 类型以提高可读性和可移植性。检查反汇编代码,了解编译器如何处理 32 位算术。

    【讨论】:

      【解决方案4】:

      一般来说,“我可以在只有 N 位的处理器上做 M 位算术吗?”的答案。是“当然可以!”

      要了解原因:回到学校时,您可能只学习了最多 10+10 和 10×10 的加法和乘法表。然而,对任意位数的数字进行加、减或乘法都没有问题。

      而且,简单地说,这就是计算机可以对大于其位宽的数字进行操作的方式。如果您有两个 32 位数字,并且一次只能将它们相加 8 位,则情况几乎就像有两个 4 位数字一样,您一次只能添加一个数字。在学校里,你学会了如何添加单独的数字对,并处理进位 - 同样,计算机只需添加成对的 8 位数字,并处理进位。减法和乘法也遵循您在学校学到的相同规则。 (除法和往常一样,可能会比较棘手,尽管您在学校学习的长除法算法通常也是进行长计算机除法的良好开端。)

      对基数不是 10 的数字系统有一个非常清晰的理解是有帮助的。我说,“如果你有两个 32 位数字,并且一次只能将它们相加 8 位,情况几乎完全一样就像有两个 4 位数字,一次只能添加一个数字。”现在,当你取两个 32 位数字并一次将它们相加 8 位时,你会发现你正在以 256 为基数进行算术运算。起初这听起来很疯狂:大多数人从未听说过以 256 为基数,而且它似乎在一个那么大的基地工作可能非常困难。但仔细想想,它实际上非常简单。

      (只是为了好玩,我曾经写过一些代码来对任意大的数字进行算术运算,它的基数为 2147483648。起初这听起来真的很疯狂——但它同样合理,而且事实上,大多数任意精度库都是这样工作的。虽然实际上“真正的”库可能使用基数 4294967296,因为它们在处理进位方面比我聪明,而且他们不想浪费一点点。)

      【讨论】:

        猜你喜欢
        • 2011-12-18
        • 2015-08-03
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多