编写你自己的虚拟机

《LC3 虚拟机教程》总结

  • 作者及资源:由 Justin Meiners 和 Ryan Pendleton 创作,可在GitHub repo查看最终代码和其他资源。
  • 教程目标:教读者编写能运行汇编语言程序的虚拟机,帮助理解计算机内部运作和编程语言工作原理,代码约 250 行 C 语言(unix 版本和 windows 版本),只需懂基本 C 或 C++及二进制算术。
  • 主要内容

    • 虚拟机介绍:虚拟机像计算机,模拟 CPU 和其他硬件组件,能理解机器语言编程,根据目的模拟不同硬件,如视频游戏模拟器需忠实重现原设备细节,有的虚拟机则为软件开发方便而创建,如 Java 虚拟机可在数千设备上运行 Java 程序,虚拟机还可用于安全隔离执行代码,如以太坊智能合约。
    • LC - 3 架构:模拟 LC - 3 架构,它是用于教学的计算机架构,有简化指令集,包含内存(65536 个 16 位存储位置)、寄存器(10 个 16 位通用寄存器、程序计数器、条件标志寄存器)、指令集(16 种 opcode)和条件标志(3 种表示计算结果正负)。
    • 汇编示例:展示简单的 LC - 3 汇编程序“Hello World”和计数到 10 的程序,说明汇编是人类可读可写形式,需通过汇编器转换为二进制机器码,程序结构简单,循环和条件用类似 goto 的指令实现,学习汇编非必需但可自行编写和汇编程序。
    • 执行程序流程:加载指令、更新程序计数器、根据 opcode 执行指令、重复此过程,注意有些指令会改变执行流程,主循环中处理命令行输入,使程序可用。
    • 实现指令:详细阐述 ADD 和 LDI 指令的实现,包括不同模式(立即模式和寄存器模式)、符号扩展、更新条件标志等,其他指令可依此方法实现,代码可在教程结尾找到。
    • 指令 cheat sheet:包含其余指令(RTI、RES 除外)的完整实现代码,如 Bitwise and、Bitwise not、Branch 等。
    • 陷阱例程(Trap routines):LC - 3 提供用于执行常见任务和与 I/O 设备交互的陷阱例程,每个陷阱例程有特定 trap code,在 VM 中用 C 实现,可利用操作系统的输入函数提高性能,完整陷阱例程代码在教程结尾。
    • 加载程序:介绍将汇编程序转换为机器码文件并加载到内存的过程,文件开头 16 位指定起始地址,需将大端序转换为小端序,还提供了方便的读取图像文件函数和交换 16 位值的函数。
    • 内存映射寄存器(Memory mapped registers):LC - 3 有键盘状态寄存器(KBSR)和键盘数据寄存器(KBDR)等内存映射寄存器,通过特殊地址访问,读取和写入需调用特定函数,完成 VM 最后组件。
    • 平台特定细节:包含在不同平台(Linux/macOS/UNIX 和 Windows)上处理输入的函数,包括关闭输入缓冲、恢复输入缓冲、检查键盘输入等,在程序开始和结束时进行相应设置和处理。
    • 运行虚拟机:编译 VM 后,可下载已组装的程序文件(如 2048 或 Rogue),并以其路径作为参数运行 VM,提供了调试方法,若程序出错可通过调试器逐步检查指令。
    • 交替 C++技术:利用 C++泛型在编译时拼接指令执行代码,减少代码重复,更接近计算机硬件布线方式,完整 C++版本代码可查看。
    • 贡献:atul - g 贡献了参考卡,许多程序员用不同语言完成教程并在 GitHub 上以“lc3”标签组织,可提交自己的项目,感谢 inkydragon 贡献 Windows 平台支持,还需帮助完成集成测试。
阅读 13
0 条评论