这篇文章是我在学习王爽的《汇编语言》时,所做的第一章内容的一些学习笔记,其中的一些插图也是我从书本里截下来的。如果文章中的内容有什么错误,还请指出。
1.1 引题:计算机的基础功能
- 我们都知道计算机能够完成很多复杂的任务,看起来计算机好像有很多的功能,但实际上我们把这些复杂的任务进行一步步的细分,最后不难发现,其实这只用到了计算机的三个基础功能
- 读取数据
- 运算数据
- 写入数据
1.2 那我们如何实现这些基础的功能?
- 首先,需要有相应动作的指令(指挥CPU该怎么做),还有提供运算的数据(指令与数据)
- 然后,你需要有相应的元件去执行(去完成这三个功能),也就是CPU
- 接着,由于计算机的指令和数据凭空产生的,它也需要地方进行存放,那么存放的位置在哪里?(存储器)
1.3.1 分析这几个部分。首先是分析——指令和数据 这一部分
- 问题的分析:我们怎么去编写这些指令和数据?进一步的说,我们怎么让计算机干活?
- 使用计算机语言
- 接下来讲讲计算机语言(部分)的发展史
- 机器语言(机器码):全是二进制的一长串数字,用来表示我们的指令和数据
- 优点:机器可以直接识别,直接执行,非常高效
- 缺点:人很难看懂,而且整个代码会非常非常长
- 汇编语言:由汇编指令来实现,实际上与机器指令的区别仅在于指令的表示方法(类似用了助记的符号)
- 优点:转换成机器指令很方便,代码比机器码整洁很多,可读性也增强了,效率和机器码相当
- 缺点:还是不太容易读,而且指令非常多。代码量还是很大,很多繁琐的步骤在重复
- 高级语言:如C语言,在语言层面上更接近人类的自然语言,代码更为简洁,易读
- 优点:语言易读,容易理解,代码冗余部分少了很多,整体更加简洁
- 缺点:要执行这些程序需要将其进行转换,转换为汇编->机器语言,效率相对于汇编和机器语言低
- 总结:在这一部分里,我们选择采用汇编语言的方式来实现上面的功能,这需要我们学习一些简单的汇编指令
- 基础的两条汇编指令
- mov a,b
- 将存储位置b内部存储的数据,转移到存储位置a内部
- 实际上就是寄存器b的数据转移到寄存器a(只是现在还不能提到寄存器···)
- b可以是一个数值,即 mov a, 18
- add a,b
- 将存储位置b内部存储的数据加到存储位置a内部的数据上
- 等同于:a=a+b
- b也可以是个数值
- mov a,b
1.3.2 接下来分析的部分是——存储的部分(存储器)
- 前言:存储器通常存放的都是CPU所需要指令和数据,这是计算机必不可少的一部分
- 问题1:指令和数据是怎么在存储器中存储的?
- 实际上,指令和数据在存储器中并没有做区分,而是一视同仁,都当做数据来进行存储
- 而数据的存储和我们之前学习的一样,都是将二进制的数据在内存中存储
- 概念补充:存储单元
- 存储器被划分为若干个存储单元,每个存储单元从0开始按顺序编号
- 微型机存储器的存储单元是1Byte,也就是8 个bit
- 补充:微机存储器的容量是以字节为最小单位来计算的
- 打个比方,一个微机存储器有128个存储单元,我们可以说它的容量是128个字节
- 问题2:这些存储器有什么种类吗?
- 在一台计算机(PC电脑)中,存储器是不唯一的,并且有着多个种类,我们叫它们为存储器芯片。
- 这些存储器芯片从物理连接上看是 独立的、不同的 器件,有着非常多的种类
- 但从抽象的模型和读写属性来看,我们可以将其分为两类:
- 随机存储器(RAM)
- 特征:可读可写,但是必须带电存储,断电会丢失。用于存放CPU使用的大部分程序和数据
- 常见类别1:主随机存储器
- 一般由两个位置上的RAM组成,分别是
- 装在主板上的RAM
- 插在扩展插槽上的RAM
- 一般由两个位置上的RAM组成,分别是
- 常见类别2:接口卡上的RAM(如显卡)
- 某些接口卡需要对大批量1输入、输出数据进行暂时存储,因此会自带RAM
- 显卡就是很典型的一类,显示卡上的RAM称为显存
- 显示卡随时将显存中的数据输出到显示器上。
- 因此我们只要将要显示的内容写入显存上,紧接着就会出现在显示器上
- 只读存储器(ROM)
- 特征:只能读取不能写入,但是断电后数据不丢失
- 常见类别:装有BIOS的ROM
- BIOS(Basic Input/Output System ,基本输入输出系统),这是由主板和各类接口卡厂商提供的软件系统,借助它可以对硬件设备实现基本的输入输出
- 随机存储器(RAM)
- 问题3:这些存储器是怎么和CPU进行交流的?换句话说,我们要在内存中读取、写入数据,这些过程是通过什么实现的?
- 首先,CPU要在内存中指定位置进行读写操作,那就一定要先找到那个指定位置。这个部分实际上是通过地址寻址的方式实现的
- 在内存中,每个存储单元都有相应的地址,整个内存可以视作是连续的一条带,从上往下地址是连续的(也就是后面会提到的逻辑存储器)
- 接下来要解决的问题是,即使知道了内存指定位置的地址,我们要通过什么来进行操作呢?
- 还需要一个交流的渠道——也就是总线 (Bus)
- 补充概念:总线(Bus)
- 什么是总线?
- 电子计算机能处理和传输的都是电信号,电信号肯定是需要导线来进行传输
- 计算机中专门有连接CPU和其他芯片(不一定是存储器)的导线,统称为总线
- 总线从物理上来讲,是一根根线的集合(并不是只有一根啊)
- 总线有什么类别?
从传递信息的类别来看,大致有三种:- 数据总线(Data Bus)
- 控制总线(Code Bus)
- 地址总线
- 什么是总线?
- 总线的一个常用参数:宽度
- (因为总线实际上不是一根线,而是一系列线的集合,那么这些线的多少就是总线的“宽度”)
线越多的话,一次性传输的数据也就较多(并行传输)
- 控制总线的宽度:
- 有多少根控制总线,就意味着CPU提供了对外部器件有多少种控制(控制能力的强弱)
- 控制总线是由一些不同控制线集合成的
- “读信号输出”的控制线负责由CPU向外发送读信号(低电平表示读)
- 地址总线的宽度:
- 地址总线是用来进行传输地址,对内存进行控制的,而地址总线的宽度,一定程度上会决定寻址范围和能力
- (因为总线实际上不是一根线,而是一系列线的集合,那么这些线的多少就是总线的“宽度”)
-
- 数据总线的宽度:
- 决定了CPU和外界的数据传输速度
- 八根数据总线能够一次传送一个8位二进制数(1Byte)
- 而8088CPU的数据总线宽度为8,8086CPU数据总线宽度为16
- 在传一个16位的二进制数时,8088CPU需要传两次,而8086只用传一次
- 数据总线的宽度:
- 问题4:我们刚才知道,一台计算机里的存储器种类是非常多的,它们的连接方式也有不同,那么这些内存我们是否要进行区分处理呢(换个意思,就是我们要不要把显卡的存储器、网卡的存储器在单独去考虑它的读写操作呢)?
- 并不是,这些存储器虽然在物理上式独立的器件,但是有几点是相同的
- 与CPU相连
- CPU能通过控制线对它们进行读和写
- CPU对它们进行读写操作时是一视同仁的,因此从逻辑上来说,我们可以把它们总体看成一个由若干存储单元组成的逻辑存储器(全部排成一列表),这个就是所谓的内存地址空间
- 并不是,这些存储器虽然在物理上式独立的器件,但是有几点是相同的
- 补充概念:内存地址空间及其分配
- 所有的物理存储器被看做一个由若干个存储空间单元组成的逻辑存储器
- 每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间(我们在这个地址空间里面读写数据···就是在相应的物理存储器中读写)
- 注意:不同计算机系统的内存地址空间分配情况是不一样的,在编程之前要进行充分了解
1.3.3 最后分析的部分是——执行结果部分,也就是CPU的大致结构
- 问题1:CPU的大致结构是怎么样的?它怎么去根据这些指令和数据进行操作?
- CPU的基本结构是:
- 运算器
- 用于对各种数据进行运算,并输出结果
- 控制器
- 实现一些控制的功能,如输入输出等等
- 寄存器
- 寄存器其实也是一个存储器,只不过它上面存储的一些内容是我们用来控制CPU的
我们可以通过改变各种寄存器中的内容来达到控制CPU的目的
- 寄存器其实也是一个存储器,只不过它上面存储的一些内容是我们用来控制CPU的
- 运算器
- 问题2:这几个结构之间肯定是需要交流的,它们交流(传输)的途径是什么呢?
- CPU内部结构之间的数据传输、信息传递依靠 内部总线 来实现
- 这个内部总线和前面提到的总线有些不同,这里的“内部”强调的是,这是CPU内部的总线,之前的总线是CPU与外部器件的
1.4 分析完这些部分之后,我们对一个读写操作的大体实现步骤有了更加清晰的认识,也就是:
- 我们预先在内存中准备好相应的指令和数据
- 然后上电运行,CPU会按照一定顺序从内存中读出数据(也有指令)
- 内部步骤就是通过地址总线,传输要访问的内存地址
- 紧接着通过控制总线发出读指令
- 内存响应CPU,通过数据总线传输相应位的数据给CPU
- 接着CPU执行这些指令
- 再通过类似上面的操作,反馈回内存
- 接着继续读取、写入···(一直往下执行)