计算机基础系列 —— 虚拟机代码翻译器(2)

2024-03-30 11:44

本文主要是介绍计算机基础系列 —— 虚拟机代码翻译器(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

I believe that at the end of the century the use of words and general educated opinion will have altered so much that one will be able to speak of machines thinking without expecting to be contradicted. —— Alan Turing

文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一遍,理解更深刻。

这篇文章我们来看 VM code 里的分支和函数调用。

分支

vmcode 里的分支靠 label goto 和 if-goto 实现,实现起来很简单,如下图:

唯一需要注意的就是 if-goto 语句,需要让 cond = pop,翻译成汇编语句就是判断 RAM[SP] 的结果,并 pop 掉。

函数

对于 vmcode 的函数有三个重要的 symbol call、function 和 return。理解了他们就可以直接按理解翻译成对应的汇编代码,这也就是虚拟机代码翻译器做的事情。我们具体来看看这三个关键字。

call

call 用在 caller 里,用来调用 callee。caller 和 callee 都是 function。

call 主要干了三件事(记录信息):

  1. 记住 returnaddress

  2. 记住 caller 的 segment 信息(static|pointer|temp|constant 不用保存,因为函数调用不影响这些段的地址)

  3. 更改 ARG 和 LCL 确保 callee 取用正确的信息

function

function 这里为什么要压入 nVars 的变量还没有理解,结合后面的文章理解了再回来补充。大致上应该是实参和形参的关系。

return

return 主要干了三件事(恢复信息):

  1. 通过 LCL 地址,恢复 caller 的 segments

  2. 讲 stack top(返回值)返回给 caller

  3. 返回到 caller 要执行的下一条指令

引导程序代码(Bootstrap code)

我们需要 Bootstrap code 去开始执行 vmcode,就像电脑需要开机才能运行程序一样。

这里的 Symbol 都是根据 VM Translator 和 assembler 的程序定义的,你可以更改你的程序,但是相应的 Symbol 表格也需要更改,到这里虚拟机代码翻译器就实现了,实现一个虚拟机代码翻译器可以加深对函数调用的理解。这章内容也比较抽象,如果实在理解不了,可以结合文章开头的代码实现理解,会容易一些。

下篇文章我们开始介绍高级语言 Jack,并实现编译器以及操作系统。

这篇关于计算机基础系列 —— 虚拟机代码翻译器(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861400

相关文章

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字