32位自定义架构模拟中,短于32位数值的内存存储问题求解
解决方案建议
针对你在32位模拟架构中遇到的窄数据内存写入问题,参考真实CPU的设计思路,有几个更优的方案可以解决:
1. 在寻址信息中增加数据宽度标识
你的当前寻址信息占4位,可以拿出2位来表示操作的数据宽度(比如00=8位、01=16位、10=32位),剩下2位保留原寻址功能。指令格式变为CODE, (addr_info + width), add-a, add-b, add-c。
执行逻辑:
- 读操作:从目标地址读取对应宽度的字节,自动零扩展(无符号)或符号扩展(有符号)到32位寄存器参与运算;
- 写操作:8位操作直接将寄存器低8位写入目标地址;16位操作写入目标地址开始的连续2字节;32位操作写入连续4字节,全程不干扰无关内存区域。
这个方案兼顾内存效率和编程简洁性,模拟实现的复杂度较低,仅需在读写内存时增加宽度判断分支。
2. 新增窄数据专用操作指令
扩展指令集,为8位、16位数据单独设计操作码,比如ADD8、STORE8、LOAD16等,和原有的32位指令区分开。
这类指令的执行逻辑内置窄数据处理:
- 加载时自动将窄数据扩展到32位寄存器;
- 运算后自动截断到对应宽度,仅写入内存中目标地址的对应字节/双字节,不会覆盖其他数据。
这个方案逻辑清晰,程序员使用时无需额外处理位运算,直接调用对应指令即可,缺点是指令集数量略有增加,但对于学习模拟来说完全可控。
3. 设计字节可寻址内存,运算后按需截断写入
既然你的地址是8位,内存可以设计为字节可寻址(总容量256字节),寄存器统一用32位进行运算。执行写操作时,根据当前操作的数据类型:
- 8位操作:仅将寄存器低8位写入目标地址;
- 16位操作:将寄存器低16位写入目标地址开始的连续2字节;
- 32位操作:写入连续4字节。
模拟时的写操作示例(C语言):
// 8位写入 memory[addr] = (uint8_t)(reg_value & 0xFF); // 16位写入 *(uint16_t*)(memory + addr) = (uint16_t)(reg_value & 0xFFFF); // 32位写入 *(uint32_t*)(memory + addr) = reg_value;
这个方案内存无浪费,编程时只需明确数据类型,模拟层自动处理写入逻辑,不需要手动掩码。
关于提问渠道:
Stack Overflow本身就是合适的平台,提问时可以添加computer-architecture、emulation、c标签;另外Stack Exchange的Computer Science板块也适合这类架构设计类的理论问题。
内容的提问来源于stack exchange,提问作者SuitYourself
相关产品推荐
相关产品推荐

