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

Assembly 如何将32位字存储在不检测溢出的16位体系结构中?,assembly,cpu-architecture,32-bit,16-bit,68hc11,Assembly,Cpu Architecture,32 Bit,16 Bit,68hc11,如果系统无法检测到溢出,那么在假设的16位体系结构中如何存储32位数字码字 它将如何存储在实际系统中 让我困惑的是,在没有检测到溢出的系统中,我不确定是否可以存储大于16位的值。一件事与另一件事无关,32位和16位x86处理器在64位处理器问世之前很久就可以处理64位变量。8位处理器可以处理一百万位变量,只要有足够的内存用于存储 int fun0 ( void ) { return(sizeof(unsigned long long)); } unsigned long long fu

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

它将如何存储在实际系统中


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

一件事与另一件事无关,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 
我们一次处理一个数字,我们手工做的数学是一个数字宽,但我们可以处理无限大的数字,只要我们有足够的纸

我们做了一位数的计算

  9
+ 5
====
 14
  1
  0
+ 0
====
  1
哪个是4,哪个是1

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

  1
  9
+ 0
======
 10
哪个是0携带1

然后我们做了一位数的计算

  9
+ 5
====
 14
  1
  0
+ 0
====
  1
最终得到结果99+5=104

使用除base 2以外的计算机比使用base 10更简单时没有区别

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

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

要存储N位数据,需要N/8字节的内存

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

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

。。。如果此系统无法检测到溢出

计算,尤其是加法是另一回事。如果用溢出一词表示进位标志:

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

当您使用GCC编译器在不支持进位标志的32位CPU上对MIPS 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使用big-endian存储。这意味着CPU本身存储16位字,如程序计数器,高8位存储在地址N,低8位存储在地址N+1

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


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

6811不是8位体系结构,不是16位体系结构吗?此外,溢出与存储无关,而是与对寄存器执行某些操作的结果有关。您可以轻松地将32位存储到两个16位寄存器中。在这种情况下,当您对两个16位操作数执行加法等操作时,溢出将起作用。6811具有条件代码寄存器CCR,该寄存器指示是否存在溢出。感谢您的回答!可能我的问题不太清楚,我说的是两种计算机体系结构:16位和6811。您能给我举一个例子,说明如何在16位体系结构中存储32位数字码字吗?再次非常感谢。6811与16位或32位体系结构有什么关系?这就是我困惑的原因。我也不明白你为什么说没有溢出指示器,所以我认为这完全是一个假设的情况?32位值可以存储在两个16位值中。您将高16位放在一个寄存器中,将低16位放在另一个寄存器中。是的,这个问题纯粹是为了学习,假设的16位系统设计时没有溢出指示器,并与6811系统进行了比较。如果我理解正确,两个系统都将根据系统的不同,简单地将一个32位字存储在2个16位或4个8位寄存器中?@KristinaCer Correct。是否有溢出标志在这方面并不重要。就存储而言,32位是32位,如果您有空间存储32位,那么您可以存储32位。您可以直接读取这些位,也可以根据指令集通过寄存器进行操作…如何存储这些位取决于您,或者如果您使用编译器,他们已经决定了如何执行。非常感谢@old_timer的回答。我在想,如果假设使用两个补码的16位系统没有检测溢出的机制,那么我可以操作的数字是有限的
H例如,如果我想加上两个会产生17位码字的数字,我会得到一个错误的答案,因为在这种情况下无法检测溢出?@KristinaCer在您的理论CPU中,无法自动检测溢出。但您仍然可以“手动”计算它。68HC11是一个8/16 MCU,因为它同时具有8位和16位累加器,ADDD将在溢出时调整CCR[C]。您可以模拟为CCR[C]=D15•M15+M15•/R15+/R15•D15,其中D=ACCD,M=Memory,R=Result@old_timer存储通常基于默认的CPU端;采用big-endian的68HC11将在较低的地址中具有最重要的字节/字