[8位架构上的32位操作

问题描述 投票:0回答:3

我只想问您是否可以在8位体系结构上进行32位操作,如果可以,如何?

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

提前感谢!

c 32-bit 8-bit
3个回答
0
投票

您已将问题标记为“ 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位系统?当指令仅可以并行处理8位,或者数据总线仅8位宽时?

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


0
投票

许多(我所知道的全部...)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指令,并要求先清除进位标志。


0
投票

如果使用标准的int / long类型,则编译器将自动执行正确的操作。 long具有(至少)32位,因此不需要手动处理进位。编译器已经能够做到这一点。如果可能,请使用标准的uint32_t / int32_t类型以提高可读性和可移植性。检查反汇编的代码,以查看编译器如何处理32位算术。

© www.soinside.com 2019 - 2024. All rights reserved.