该系列博文是基于王爽老师著的汇编语言第三版,电子书获取地址如下:
链接:https://pan.baidu.com/s/1kB9-tRtywNWagf5av4N7zQ
提取码:xlzb
汇编语言(Assenbly Language)是指用于任意电子计算机,微处理器,微控制器或者其他可编程器件的低级语言(也被叫做符号语言),在汇编语言中用助记符代替机器指令的操作码,用地址符号或标号代替指令合作和操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转化为机器指令,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可以直接移植。
简单的来说,机器语言就是机器指令的集合。而机器指令就是指一个计算机可以正确识别并执行的命令。我们常用的电子计算机大多数都是采用将高低电平转换为二进制数字的形式来使计算机的电子器件收到驱动,进行运算。我们这里提到的电子计算机是指广义上的可以运行机器指令并运算的机器,现在大多数都是指借助CPU直接或简介控制的计算机系统,由于每一种CPU的硬件结构和内部结构均有差别,因此我们就需要使用不同的电平脉冲信号来控制,这里需要不同的电平脉冲信号就代表着不同的微处理器都需要各自的机器指令集,也就是机器语言。
比如我们早期的在纸带上打孔形式来传递信息就是机器语言的一种。
简单的了解了一些汇编语言的概念后,我们需要思考一个简单的问题就是一个汇编指令如何成功的被计算机识别并且运算呢?
比如mov ax,bx这个命令(该指令含义是指将BX的值赋予AX)这个赋值过程计算机是如何实现的呢?
我们分析下上面的指令,如果计算机如果想要将一个变量的值赋予另一个变量的前提是需要一个可以存储并获取的数据可以,那么对于计算机来说,这些数据是存储在哪里呢?通常情况下,计算机需要一个容器来存储变量,这个硬件结构被我们称为存储器。什么是存储器?存储器是指计算机用来存储数据和运算步骤的硬件结构,其既可以存放数据,又可以存储指令。
我们继续分析下上面的命令,当我们有了存储器保存数据,那么该如何将数据取出来呢?计算机为我们提供了一个负责控制计算机各个硬件之间的协调工作的硬件结构,其主要任务就是从内存中存取数据并加以简单处理,这个结构就是控制器。 控制器的基本任务就是按照计算机所排列的指令顺序,依次在存储器中取出数据并由译码器进行分析判断,根据指令性质执行指令。
小拓展: 取值周期和执行周期
- 取值周期是指取出一条指令需要的时间
- 执行周期是指执行一条指令需要的时间
最后当我们已经可以通过控制器在存储器取出数据的时候,我们该如何获取指令最终的运算结果呢?这个时候计算机又提供了一个负责处理数据之间运算的部件运算器。 运算器主要负责数据之间的运算,比如算术运算或逻辑运算等等。当然为了经济型考虑,我们常采用二进制运算的形式来实现运算器设计。
除了上述三个核心组件外,计算机还包含了用来收集展示数据的外设部分,比如键盘鼠标显示器等等。
从20世纪初,物流学和电子学科学家们就在争论制造可以进行数值运算的机器应该采用什么结构,人们被十进制这个人类惯用的技术方法困扰。所以那时以研制模拟计算机的呼声更为响亮和有力。20世纪30年代中期,匈牙利科学家冯诺依曼大胆的提出抛弃十进制,采用二进制作为计算机的基础。同时他还说预先编制计算程序,然后由计算机来按照人们事前指令的计算顺序来执行数值计算工作。这里冯诺依曼的理论要点是:
宏观上来讲我们将数据存放到了存储器,但是小伙伴有没有想过我们到底把数据放到了存储器的哪里?实际上存储器是很多小块的内存区域组合起来的,我们通常将这种内存区域称为存储单元。那么一个存储单元有多大呢?
计算机最小的信息单位是bit(比特),bit就是一个二进制位,8个bit可以组成一个byte,也就是我们通常说的字节。
微型存储器的存储单元可以存储一个byte大小的数据,即8个二进制位。
我们日常经常提到的CPU(Central Processing Unit) 实际上是一块超大规模的集成电路,同时也是负责一个计算机运算和控制的核心部件。之前我们提到过的存储器被划分成了多个存储单元,每一个存储单元都会有一个从零开始排序的编号,这些编号我们可以看作是存储单元在存储器中的地址。如果CPU想要获取一条数据,首先就需要知道数据存放在哪个存储单元,也就是通过存储单元的地址值来获取数据。那么CPU是通过什么将指令和数据传递到硬盘上呢?
计算机能够处理,传输信号和指令其实都是通过电信号的方式,电信号理所当然的需要用导线传递,因此在计算机专门有连接CPU和其他硬件的导线,这些导线的集合被我们称为总线。总线从物理结构上来说就是一条条导线的集合。
总线的分类
- 地址总线: 负责寻找指定内存单元的总线,其导线条数决定了CPU的寻址能力
- 数据总线: 负责数据传递的总线,其导线条数决定了CPU获取和传递数据的能力
- 控制总线:负责对外部器件的控制
那么我们在拥有了硬件基础上,如何让计算机按照我们的思路进行运算呢?
刚刚我们有提到计算机本质上数据的传递是通过二进制实现的,而二进制其实就是高低电平的变化。那么计算机通过二进制记录这些高低电平的变化后会产生两种不同的内容。第一种是用来记录数据本身的二进制代码,这些代码是为了记录我们内存中数据的变化。第二种是用来记录CPU针对硬件结构下达的指令,负责控制计算机输入输出,进行运算命令。也就是说,计算机的软件本质上是通过数据和指令构成的。
指令的组成:
指令是通过操作码|地址码的格式组成的,这种格式是为了让控制器能够快速的识别当前指令的性质和操作地址。
数据的分类
- 第一类就是作为指令执行对象的输入数据
- 第二类是作为指令执行结果中获取的输出数据
- 当然数据也可以当作某些变量名来使用
如果存储器中的数据和指令的格式并没有明显区别,计算机是如何区分数据和指令的呢?