博客
关于我
实践: 《编码:隐匿在计算机软硬件背后的语言》 -- 实现一个简单的8位CPU的虚拟机
阅读量:371 次
发布时间:2019-03-04

本文共 1016 字,大约阅读时间需要 3 分钟。

最近在看Charles Petzold的《编码》这本书。书上用生动的例子从导线灯泡继电器开关自己搭建了一个简单的8位计算机,实现了加法、减法、条件判断等基本功能。为了巩固对书上知识的理解,我用C++模拟了一个8位CPU虚拟机,支持内存输入输出和机器码执行,自己编码并运行程序。

项目地址:https://github.com/sesiria/CodeMachine

结构设计

这个程序采用C++实现一个简单的8位计算机。程序结构包括一个主菜单(UI),基本输入和执行命令功能。

  • 主循环中会进行虚拟机的初始化和反初始化,确保程序有序地运行。
  • 在执行命令时,可以中途使用“Reset”命令进行初始化。
  • 命令处理过程会自动忽略无效输入,确保系统稳定运行。
  • 当用户选择退出时,程序会关闭虚拟机并退出。

基本输入输出

输入包括主菜单的各种命令,每个命令对应不同的操作。程序中实现了一个获取命令的函数和一个处理命令的函数。

  • getCommand:用于获取用户输入的命令字符串。
  • processCommand:处理用户选择的命令,忽略无效输入,如果用户选择退出则退出程序。

输入代码

最重要的功能是输入代码,可以是机器指令或数据。通过processInputInstruction函数实现:

  • 判断输入格式是否正确,如果是数据则存入当前地址并移动指针。
  • 支持两种输入方式:直接输入数据或指定地址后输入数据。
  • 地址指针自动循环在内存最后一个单元和第一个单元之间。

输入汇编

由于汇编代码的处理复杂,包含字符串处理和宏处理,目前尚未完成,待补充。

执行代码

将虚拟机指针指向指令开始执行,直到遇到HLT指令停止。每条指令依次处理,支持基本操作。

复位机器

通过“Reset”命令中途初始化虚拟机,确保程序能在中途恢复状态。

显示内存内容

查看当前内存的内容,包括数据和指令,方便调试和分析。

机器内部结构模拟

设计了一个结构体kernalObj来模拟机器的内存和寄存器:

  • m_BUF:内存缓冲区。
  • m_A:系统寄存器。
  • m_CI, m_CO, m_ZF:与加减运算相关的寄存器。
  • m_CODE, m_CL, m_CH:地址寄存器。
  • m_IP:指令指针。

初始化和释放内存功能分别通过initMachineuninitMachine实现。

实现代码

通过C++实现虚拟机的各个模块,包括主函数、命令处理、内存管理和指令执行,确保代码结构清晰、功能完善。

转载地址:http://hobg.baihongyu.com/

你可能感兴趣的文章
OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
查看>>
OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
查看>>
OSPF技术连载14:OSPF路由器唯一标识符——Router ID
查看>>
OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
查看>>
OSPF技术连载16:DR和BDR选举机制,一篇文章搞定!
查看>>
OSPF技术连载17:优化OSPF网络性能利器——被动接口!
查看>>
OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
查看>>
OSPF技术连载19:深入解析OSPF特殊区域
查看>>
SQL Server 复制 订阅与发布
查看>>
OSPF技术连载20:OSPF 十大LSA类型,太详细了!
查看>>
OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
查看>>
OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
查看>>
OSPF技术连载2:OSPF工作原理、建立邻接关系、路由计算
查看>>
OSPF技术连载5:OSPF 基本配置,含思科、华为、Junifer三厂商配置
查看>>
OSPF技术连载6:OSPF 多区域,近7000字,非常详细!
查看>>
OSPF技术连载7:什么是OSPF带宽?OSPF带宽参考值多少?
查看>>
OSPF技术连载8:OSPF认证:明文认证、MD5认证和SHA-HMAC验证
查看>>
OSPF故障排除技巧
查看>>
spring配置文件中<context:property-placeholder />的使用
查看>>
OSPF有哪些优势?解决了RIP的什么问题?
查看>>