首页 > 编程语言 >计算机基础系列 —— 汇编语言

计算机基础系列 —— 汇编语言

时间:2024-03-24 17:29:35浏览次数:20  
标签:汇编器 Register 系列 计算机 汇编语言 RAM 指令 我们

Same hardware can run many different programs(Software)

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

我们在之前的文章里,构建了 Register、RAM 和 ALU,使得我们有了存储和计算的能力,我们接着借助之前的组合逻辑单元和时序逻辑单元把 Register、RAM 和 ALU 就可以构建一个电脑架构(Hack),如下图:

这篇文章我们先介绍运行在这个架构上的汇编语言,用来编写在这个电脑架构上可以运行的程序,后面的文章会介绍这个电脑架构如何实现。我们了解汇编语言之后,也会实现自己的汇编器,把汇编语言编译成机器语言,如下图。

所以我们可以通过汇编语言的指令集来操作 Program、data 和 CPU 里的寄存器(具体是 A 和 D 两种寄存器),参考下图。

接下来我们来看看 Hack 的汇编语言里的指令集 A 指令和 C 指令,以及控制流、变量和标签。

A 指令

A 指令很简单,当我们写 @19 的时候就代表 Address register 被设置成 19(CPU 会帮我们干这件事,后面我们会实现这颗 CPU),而且 RAM[A] 和 ROM[A] 会被自动选中,Hack 汇编语言用 M 表示 RAM[A]。

C 指令

C 指令要复杂一些,有如下这些指令:

我们看一些例子,学习 C 指令的使用。

给 Data Register 赋值

给 RAM 赋值

控制流

这里用 A 指令选择存储在 ROM 里需要执行的指令,每条指令存储在 ROM 里的一个 Register 里。

变量

把 A 指令里的 const 替换成 symbol(变量名)即可,这里把变量名绑定到对应的 const 的工作是我们后面文章介绍的汇编器做的,这些 symbol 实际在 ROM 里不存在,汇编器帮我们实现了 symbol 和 地址的映射关系,我们来看一些例子:

汇编器还帮我们预定义了一些 Register,方便我们使用:

标签

sym 帮我们定义了数据的相对地址,这样我们不用记住数据(RAM)对应的绝对地址,就可以访问数据。同理,我们需要新的 sym 帮我们定义控制流的相对地址,我们用 (sym) 表示,这样我们不用记住程序段的绝对地址,就可以通过标签访问对应的程序段(ROM)。

我们需要 infinite loop 确保程序不会执行想要运行程序外的程序(用来表示程序结束):

有了控制流和标签,我们就相当于可以实现 for 循环:

指针

这里是这门课我最喜欢的部分之一,学习这门课之后你可以清清楚楚的知道指针是什么,而不是捧着《c++ primer》看大段的指针是什么的描述。

结合用 C++ 指针的写法写一下上面的汇编语言:*R0 = -1。我们对指针的理解更深刻了。来看一下更复杂点的例子:

数组

实际上就是通过指针访问的一连串数字,理解了指针,就可以理解数组了,我们看下例子:

我们可以看到程序定义了长度为 5,arr[1] = 100 的数组,并计算了数组所有元素相加的和。

A 指令和 C 指令总结

接下来我们来看二进制版本的指令集,我们编程还是用汇编语言,但是汇编器会把汇编程序翻译成下面的二进制版本加载到 ROM 里运行。

二进制版本指令集

I/O(输入和输出)

  • 输入

可以看出 RAM 里的一个寄存器用来连接键盘,一个 Register 是 16-bit,足够表示键盘上的按键。例子:

  • 输出

输出设备是一个 256(row) * 512(col) 像素的黑白屏幕。

我们可以看到 1 代表黑色,0 代表白色,每 32 个寄存器代表屏幕里的一行像素。

课程里有两个小项目帮助理解内容,一个是计算两个寄存器的乘积,一个是通过按键控制屏幕全黑或者全白,感兴趣的可以看文章开头的 github 实现,也可以自己学习课程实现。

接下来的文章会介绍如何构建 CPU 和如何写一个汇编语言的汇编器。

标签:汇编器,Register,系列,计算机,汇编语言,RAM,指令,我们
From: https://blog.csdn.net/quoniammm/article/details/136991181

相关文章

  • 「Linux系列」Shell 流程控制if-else/for循环/While循环/until循环/case语句/跳出循环
    文章目录一、Shell流程控制二、If语句三、For循环四、While循环五、Until循环六、Case语句七、跳出循环break/continue八、相关链接一、Shell流程控制Shell脚本中的流程控制结构允许你根据条件执行不同的代码块,或者重复执行某些代码块。这些结构包括if语句......
  • 基于VB6的磁性移动窗体 - 开源研究系列文章
          这次继续整理代码。这个磁性窗体是以前大学的时候开发的,当时模仿的Winamp的效果进行的编程。当时的时候有WindowsAPI函数能够进行处理,但是XP的年代,那个API只是移动的虚框,而不是移动窗体,于是就进行了窗体移动的开发,同时结合API函数进行了编码,在窗体移动的时候能够磁......
  • 计算机网络安全试题
     计算机网络安全试题一、是非题(每题1分,共10分。正确的在括号内划√,错的划×,填入其它符号按错论。)( )1.城域网采用LAN技术。( )2.TCP/IP体系有7个层次,ISO/OSI体系有4个层次。( )3.ARP协议的作用是将物理地址转化为IP地址。( )4.在差分曼彻斯特......
  • 计算机类主题会议推荐之——CVIDL 2024
    【IEEE出版】第五届计算机视觉、图像与深度学习国际学术会议(CVIDL2024)大会官网:www.cvidl.org大会时间:2024年4月19-21日大会地址:中国-珠海收录检索:EICompendex,ScopusISBN:979-8-3503-7382-0​大会简介第五届计算机视觉、图像与深度学习国际学术会议(CVIDL2024)定于202......
  • 【附源码】java松江大学城就餐推荐系统设计与实现(ssm毕业设计+maven+vue+计算机专业)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在现代都市的快节奏生活中,餐饮服务已经成为人们日常生活中不可或缺的一部分。尤其是对于大学生这一群体,他们通常生活在学校周边的大学城,拥有丰富的就餐选......
  • MeterSphere接口自动化系列之Sql前后查询依赖场景
    一、使用场景    需要多次查询数据,并对查询结果进行比较,查询的前后存在依赖,多条记录循环处理。二、实际场景实例本文的场景如下:        先查询结果表信息,根据结果表的字段作为条件,用于后续源数据查询语句的条件,并根据源数据算术运算后的结果和结果表的实际......
  • C#9.0新特性详解系列之四:顶级程序语句(Top-Level Programs)
    原文链接:https://www.cnblogs.com/markkang/p/14091908.html1背景与动机通常,如果只想用C#在控制台上打印一行“HelloWorld!”,这可不是Console.WriteLine("HelloWorld!");一条语句就可以搞定的,还涉及到其他必要基础代码(如定义类和入口函数Main),例如下面:usingSystem;classProgr......
  • 计算机组成原理 练习卷 第2章第1节数据与文字的表示方法(解析版)(正确答案版)
    一、(共18题,共90分)1.若一个数的编码是10000111,它的真值为+7,则该编码是       。(单选题本题5分)A原码B反码C补码D移码正确答案:D解:如果为原码,真值为-7,同理B的反码和C的补码都为负数,只有移码才为正数。2.计算机内常采用______作为字符编码。(单选题本题......
  • 【办公类-22-11】周计划系列(5-3)“周计划-03 周计划内容循环修改“ (2024年调整版本)
    背景需求:前文从原来的“新模版”文件夹里提取了周计划主要内容和教案内容。【办公类-22-10】周计划系列(5-2)“周计划-02源文件docx读取5天“(2024年调整版本)-CSDN博客文章浏览阅读1.1k次,点赞29次,收藏22次。【办公类-22-10】周计划系列(5-2)“周计划-02源文件docx读取5天“(2024......
  • CS 2410计算机体系结构
    CS2410计算机体系结构2024年春季课程项目分发时间:2024年2月19日到期时间:4月22日晚上11:592024年介绍这是一个单人项目。允许并鼓励你与同学讨论该项目,但不得分享项目源代码和报告。请在报告中列出您的讨论同行(如果有的话)屈服动态调度处理器的一个优点是它能够容忍延迟或在无序......