如何将 32 位字存储在不检测溢出的 16 位体系结构中?
How 32-bit word would be stored in 16-bit architecture that does not detect overflow?
如果此系统无法检测到溢出,如何将 32 位数字代码字存储在假设的 16 位体系结构中?
它如何存储在真实的 68HC11 系统中?
让我困惑的是,在没有检测到溢出的系统中,我完全不确定是否可以存储大于16位的值?
事与愿违,早在 64 位处理器问世之前,32 位和 16 位 x86 处理器就可以处理 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
使用 2 进制以外的计算机比使用 10 进制更容易。
how a 32-bit numeric codeword would be stored in a 16-bit architecture ...
只是存储信息不需要CPU的任何功能。
要存储 N 位数据,您需要 N/8 字节的内存。
如果四个字节包含一个 32 位字、一个 32 位浮点值、两个 16 位字、4 个 8-,则软件(而不是硬件)必须 "know"位字或 32 个单位。
如果你用汇编语言编写程序,你必须相应地编写程序。如果你使用某种编程语言,编译器必须这样做。
... if this system cannot detect the overflow?
计算(尤其是加法)是另一回事。如果您通过单词 "overflow" 引用 "carry flag":
您可以手动检查进位:如果您将两个数字相加并且有进位,则总和将小于两个被加数中的每一个。如果没有进位,和将大于或等于每个被加数。
当您使用 GCC 在 MIPS CPU(32 位 CPU not 上执行 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
How would it be stored in a 6811 system?
据我所知 6811 使用 "big endian" 存储。这意味着 CPU 本身以高 8 位存储在地址 N 和低 8 位的方式存储 16 位字(如程序计数器)存储在地址 N+1.
因此,大多数编译器也会存储一个 32 位字 "big endian":高 8 位存储在地址 N,低 8 位存储在地址 N存储在地址 N+3.
6811肯定支持"carry flag",加进位和"overflow flag"。所以 6811 不是 CPU "not detecting an overflow" 的例子。请参阅 old_timer 的回答如何在具有溢出和进位的 CPU 上进行添加。
如果此系统无法检测到溢出,如何将 32 位数字代码字存储在假设的 16 位体系结构中?
它如何存储在真实的 68HC11 系统中?
让我困惑的是,在没有检测到溢出的系统中,我完全不确定是否可以存储大于16位的值?
事与愿违,早在 64 位处理器问世之前,32 位和 16 位 x86 处理器就可以处理 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
使用 2 进制以外的计算机比使用 10 进制更容易。
how a 32-bit numeric codeword would be stored in a 16-bit architecture ...
只是存储信息不需要CPU的任何功能。
要存储 N 位数据,您需要 N/8 字节的内存。
如果四个字节包含一个 32 位字、一个 32 位浮点值、两个 16 位字、4 个 8-,则软件(而不是硬件)必须 "know"位字或 32 个单位。
如果你用汇编语言编写程序,你必须相应地编写程序。如果你使用某种编程语言,编译器必须这样做。
... if this system cannot detect the overflow?
计算(尤其是加法)是另一回事。如果您通过单词 "overflow" 引用 "carry flag":
您可以手动检查进位:如果您将两个数字相加并且有进位,则总和将小于两个被加数中的每一个。如果没有进位,和将大于或等于每个被加数。
当您使用 GCC 在 MIPS CPU(32 位 CPU not 上执行 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
How would it be stored in a 6811 system?
据我所知 6811 使用 "big endian" 存储。这意味着 CPU 本身以高 8 位存储在地址 N 和低 8 位的方式存储 16 位字(如程序计数器)存储在地址 N+1.
因此,大多数编译器也会存储一个 32 位字 "big endian":高 8 位存储在地址 N,低 8 位存储在地址 N存储在地址 N+3.
6811肯定支持"carry flag",加进位和"overflow flag"。所以 6811 不是 CPU "not detecting an overflow" 的例子。请参阅 old_timer 的回答如何在具有溢出和进位的 CPU 上进行添加。