0

如果该系统无法检测到溢出,32 位数字码字将如何存储在假设的 16 位架构中?

它将如何存储在真正的68HC11系统中?

令我困惑的是,在没有检测到溢出的系统中,我不确定是否可以存储大于 16 位的值?

4

2 回答 2

3

如何将 32 位数字代码字存储在 16 位架构中...

简单地存储信息不需要 CPU 的任何功能。

为了存储N位数据,您需要N/8字节的内存。

软件(而不是硬件)必须“知道”四个字节是否包含一个 32 位字、一个 32 位浮点值、两个 16 位字、4 个 8 位字或 32 个单个位。

如果您用汇编程序编写程序,则必须相应地编写程序。如果您使用某种编程语言,编译器必须这样做。

...如果该系统无法检测到溢出

计算(尤其是加法)是另一回事。如果您通过“溢出”一词来指代“进位标志”:

您可以手动检查进位:如果您将两个数字相加并且有一个进位,则总和将小于两个被加数中的每一个。如果没有进位,则总和将大于或等于每个被加数。

当您使用 GCC 编译器在 MIPS CPU(不支持进位标志的 32 位 CPU)上执行 64 位加法时,将完成此检查。这里的伪代码:

sum_low  = a_low + b_low
  // The CPU does not support carry:
sum_high = a_high + b_high
  // Simulate carry:
if(a_low > sum_low) sum_high = sum_high + 1

它将如何存储在 6811 系统中?

据我所知,6811 使用“大端”存储。这意味着 CPU 本身以高 8 位存储在地址N并且低 8 位存储在地址N+1的方式存储 16 位字(如程序计数器) 。

出于这个原因,大多数编译器还会存储一个 32 位字“big endian”:高 8 位存储在地址N中,低 8 位存储在地址N+3中。

6811绝对支持“进位标志”,添加进位和“溢出标志”。因此,6811 不是 CPU“未检测到溢出”的示例。请参阅old_timer的回答如何在具有溢出和进位的 CPU 上进行添加。

于 2019-03-30T08:24:34.627 回答
3

一件事与另一件事无关,32 位和 16 位 x86 处理器早在 64 位处理器问世之前就可以处理 64 位变量。只要有足够的内存用于存储,8 位处理器就可以处理一百万位变量。

int fun0 ( void )
{
    return(sizeof(unsigned long long));
}

unsigned long long fun ( unsigned long long a, unsigned long long b )
{
    return(a+b);
}

为 16 位目标编译:

00000000 <fun0>:
   0:   3f 42           mov #8, r15 ;r2 As==11
   2:   30 41           ret         

00000004 <fun>:
   4:   1c 51 02 00     add 2(r1),  r12 ;0x0002(r1)
   8:   1d 61 04 00     addc    4(r1),  r13 ;0x0004(r1)
   c:   1e 61 06 00     addc    6(r1),  r14 ;0x0006(r1)
  10:   1f 61 08 00     addc    8(r1),  r15 ;0x0008(r1)
  14:   30 41           ret 

该指令集对于无限(直到您用完存储)大小的变量没有问题。

在小学,我们学会了如何处理这个

 99
+ 5
====

我们一次处理一个数字,我们的手工数学是一个数字宽,但只要我们有足够的纸,我们就可以处理无限大的数字。

我们做了这个个位数的数学

  9
+ 5
====
 14

这是 4 携带 1

然后我们做了这个个位数的数学

  1
  9
+ 0
======
 10

这是 0 携带 1

所以我们做了这个个位数的数学

  1
  0
+ 0
====
  1

最终得到结果 99 + 5 = 104

使用base 2以外的计算机比使用base 10更容易,没有区别。

于 2019-03-29T14:21:31.060 回答