在不检测溢出的16位体系结构中如何存储32位字?

时间:2019-03-29 10:44:00

标签: assembly cpu-architecture 32-bit 16-bit 68hc11

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

如何将其存储在真实的68HC11系统中?

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

2 个答案:

答案 0 :(得分:3)

一件事与另一件事无关,32位以及16位x86处理器可以在64位处理器问世很久之前就处理64位变量。只要有足够的存储空间,8位处理器就可以处理100万个位变量。

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容易。

答案 1 :(得分:3)

  

如何在16位体系结构中存储 32位数字代码字...

存储信息就不需要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本身以如下方式存储16位字(例如程序计数器):高8位存储在地址 N 中,低8位存储在地址中N + 1

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

6811绝对支持“进位标志”,并带有随身携带和“溢出标志”。因此6811并不是CPU“未检测到溢出”的示例。参见 old_timer 的答案,加法如何在溢出和携带CPU上起作用。