assembly - 在不检测溢出的 16 位架构中如何存储 32 位字?
问题描述
如果该系统无法检测到溢出,32 位数字码字将如何存储在假设的 16 位架构中?
它将如何存储在真正的68HC11系统中?
令我困惑的是,在没有检测到溢出的系统中,我不确定是否可以存储大于 16 位的值?
解决方案
如何将 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 上进行添加。
推荐阅读
- android - WifiManager enableNetwork 几秒钟后恢复到以前的网络
- java - Java 9 Cleaner 是否应该优于最终化?
- php - 预处理节点:调用所有节点类型的函数
- java - 未在本地运行时,自定义 AccessDecisionManager 不会在 JPA 存储库方法调用上被调用
- android - 如何知道视频文件长度是否与其原始长度相同
- c# - 在 EntityCore 中使用 Postgre 的 lpad
- javascript - JS/TS 如何遍历对象数组并更改值
- python - 如何迭代命名元组对象?
- c# - Unity - 将大量顶点加载到 ComputeShader 以进行光线跟踪的高性能选项?
- excel - 查找值的所有匹配项的函数