计算机基础系列 —— 虚拟机代码翻译器(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,并实现编译器以及操作系统。

相关推荐

  1. 计算机系统基础 练习题 2

    2024-03-31 12:20:01       33 阅读
  2. Lua-Lua虚拟2

    2024-03-31 12:20:01       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 12:20:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 12:20:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 12:20:01       87 阅读
  4. Python语言-面向对象

    2024-03-31 12:20:01       96 阅读

热门阅读

  1. Ubuntu下udp通信

    2024-03-31 12:20:01       42 阅读
  2. es与mysql同步问题

    2024-03-31 12:20:01       39 阅读
  3. Leetcode 3. 无重复字符的最长子串

    2024-03-31 12:20:01       42 阅读
  4. 带头双向循环链表的实现及注释教学

    2024-03-31 12:20:01       39 阅读
  5. 面试碰到的一些问题

    2024-03-31 12:20:01       34 阅读
  6. PHP - ZipArchive上传、下载实例

    2024-03-31 12:20:01       40 阅读
  7. HTML 中的 jQuery 事件处理与 Ajax 异步请求

    2024-03-31 12:20:01       37 阅读
  8. 【图像处理】-1.图像二值化

    2024-03-31 12:20:01       39 阅读
  9. Mysql 常用语句及用法记录

    2024-03-31 12:20:01       34 阅读
  10. 阿里云服务器初始化简记

    2024-03-31 12:20:01       31 阅读
  11. 微信小程序渲染有问题

    2024-03-31 12:20:01       41 阅读
  12. Python100个库分享第4个—difflib

    2024-03-31 12:20:01       41 阅读