#### 第9章: #### 汇编语言 机器语言是机器指令的集合。机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。执行指令由`CPU`来完成,也就是我们常说的微处理器,芯片。 每一种CPU由于硬件设计内部结构不同,需要不同的电平脉冲来控制,所有有一套属于自己的机器指令。 用8086CPU完成s=768+1288-1280的机器码如下: 1011100000000000000000000 0000010100000000000110000 0010110100000000000000101 如果写错了是否很难找到。由于比难于辨认和记忆,产生了汇编语言。 汇编语言是机器指令便于记忆的书写格式,例如操作将寄存器BX传送到AX中: 机器指令:1000100111011000 汇编指令:mov ax,bx 汇编语言由汇编指令、伪指令、其他符号组成。 #### 9.1 基础知识 ##### 存储器 CPU是计算机的核心部件,它掌控整个计算机的运行并进行运算。想要让一个CPU工作,就必须向他提供指令和数据。指令和数据在存储器中存放,也就是我们平时所说的内存。没有内存,CPU没法工作,再聪明的大脑没有记忆也无法工作。磁盘不同于内存,磁盘的作用是做数据持久化。CPU需要使用磁盘的数据内容时需要磁盘先将数据放到内存中,CPU使用内存的数据。 ##### 指令和数据 在内存和磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作的时需要将信息作为指令或数据。为同样的信息赋予了不同意义。 例如: 1000100111011000 >>89D8H(作为数据) 1000100111011000 >>mov ax,bx(作为程序) ##### 存储单元 存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号,例如一个存储器有128个存储单元,编号从0-127。 :-: ![](https://img.kancloud.cn/a1/8a/a18af54ce891f67450dac646c3d98187_162x400.png) 计算机最小信息单位是bit(比特),也就是一个二进制位。8个bit组成一个Byte(B,字节)。 所以微型计算器的存储单元可以存储一个Byte,也就是8个二进制位(8位,8bit)。 所以拥有128个存储单元的存储器,我们可以说它的容量是128个字节。 1KB=1024B 1MB=1024KB 1GB=1024MB 1TB=1024GB (2的10次方) #### 9.2 CPU CPU通过`三大总线`:`地址总线`、`控制总线`、`数据总线`与外部器件(内存、现存、接口卡等)进行数据的读写。 :-: ![](https://img.kancloud.cn/a8/9e/a89e937fd7bc2652296478ce5f19695d_665x338.png) CPU读取内存过程 (1)CPU通过地址线将信息3发出。 (2)CPU通过控制线发出内存读命令,选中存储器芯片,通知它将会从中读取信息。 (3)存储器将3号单元中的数据8通过数据线传入CPU。 写操作类似。 ##### 地址总线 ![](https://img.kancloud.cn/3f/aa/3faa9599255ddd0f9e7373cf35e14fe1_665x338.png) 地址总线上发送的地址信息 计算中一根导线可以传送的稳定状态只有两种,高电平或低电平。用二进制表示为0或1。10根导线可以传送10位二进制数据。10位二进制可以表示多少个不同的数据呢。2的10次方。最小数为0,最大数为1023。 所以地址总线如果有10根地址线,直接可以寻找1024个存储单元(实际中会有段地址加偏移地址找到1024以外的存储单元,之后章节会讲)。 一个CPU有N根地址线,则可以说这个CPU的地址总线宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。 ##### 数据总线 CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。8根数据总线一次可以传送8位二进制数据(1个字节)。16根数据总线一次可传送两个字节。 8088CPU的数据总线宽度位8,8086CPU的数据总线宽度为16。 :-: ![](https://img.kancloud.cn/b2/1d/b21d6f06c0a68a15b09e5dbb41af3506_665x338.png) 8位数据总线传送的信息 :-: ![](https://img.kancloud.cn/c1/2a/c12afd3d6d498c6618db0eba825488c5_665x338.png) 16位数据总线传送的信息 8086CPU有16根数据线,一次可以传16位数据。8088CPU只有8根数据线,一次只能传8位数据,写入89D8H时需要进行两次数据传送。 ##### 控制总线 CPU对外部器件的控制是通过控制总线来进行的。控制总线是一些不同控制线的集合。有多少根控制总线就意味着CPU提供了对外部器件的多少种控制。所以控制总线的宽度决定了CPU对外部器件的多少种控制能力。 内存读命令或写命令是有几根控制总线综合发出的。 ##### 内存地址控制(概述) 一个CPU的地址总线宽度位10。那么可以寻址1024个内存单元,这1024个内存单元就构成了这个CPU的内存地址空间。 ##### 主板 每台计算机都有一个主板,主板上有核心器件和一些主要器件,这些器件通过总线相连。这些器件有CPU、存储器、外围芯片组、扩展插槽等。扩展插槽一般插有RAM内存条和各类接口卡。 ##### 接口卡 在计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。CPU对外部设备不能直接控制,如显示器、音响、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。扩展插槽通过总线与CPU相连,所以接口卡与CPU也通过总线相连。 ##### 各类存储器芯片 一台计算机中有多个存储器芯片。从读写属性上分为两类:随机存储器(RAM),只读存储器(ROM)。 随机存储器可读可写,必须带电存储,关机后的内容丢失;只读存储器只能读取不能写入。 `随机存储器` 用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成。装在主板上的RAM和在插在扩展槽的RAM。 `装有BIOS(基本输入/输出系统)的ROM` BIOS是由主板和各类接口卡厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。 `接口卡上的RAM` 某些接口卡需要对大批量输入、输出数据进行暂时存储,在其上装有RAM。最典型的是显示卡的RAM。 :-: ![](https://img.kancloud.cn/7e/6b/7e6bd23a0e53a68949e9cb810b1c3baa_600x491.png) ##### 内存地址空间 存储器物理上是独立的器件,但有两个特点: 1. 都和CPU的总线相连。 2. CPU对它们进行读或写的时候通过控制总线发出内存读写命令。 所以CPU在操作它们的时候,把它们都当作内存来对待,把它们总的看作一个由若干存储单元组成的`逻辑存储器`。这个逻辑存储器就是我们所说的`内存地址空间`。 而`虚拟内存空间`是由操作系统将其抽象出来的。 :-: ![](https://img.kancloud.cn/88/ea/88ea1dc7c27fcd8ca0f2f55a8692c218_159x500.png) 内存地址空间的大小受CPU地址总线宽度的限制。8086CPU的总线宽度为20.可以传送2的20次个不同的之地信息(0到2的20次方-1)。即可以定位2的20次方个内存单元,则8086CPU的内存地址空间为1MB。80386CPU的地址总线宽度为32,则地址空间为4GB。 #### 9.3 寄存器 一个CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。 在CPU中: 1. 运算器进行信息处理。 2. 寄存器进行信息存储。 3. 控制器控制各种器件进行工作。 4. 内部总线连接各种器件,使它们之间可以进行数据的传送。 CPU中主要的部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变寄存器中的内容来实现对CPU的控制。 不同的CPU,寄存器的个数、结构是不同的。8086CPU由14个寄存器,每个寄存器都有一个名称:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 ##### 通用寄存器 :-: ![](https://img.kancloud.cn/d9/64/d964a5e64d068ad3f1bfd9a3df00bc8e_918x422.png) 现在的8086CPU的寄存器可以存储一个16位的数据,因为上一代的寄存器是8位的,需要兼容。 所以 AX可以分为AH和AL; BX可以分为BH和BL; CX可以分为CH和CL; DX可以分为DH和DL; AH、BH、CH、DH是高位字节(8位) AL、BL、CL、DL是低位字节(8位) ##### 几条汇编指令 mov ax,18 将18送入寄存器AX mov ah,78 将78送入寄存器AH add ax,8 将寄存器AX中的数字加8 mov ax,bx 将寄存器BX中的数据送入寄存器AX add ax,bx 将寄存器AX中的数据加上寄存器BX中的数据存入寄存器AX中 注意内存溢出问题 例如:AH为8位,十进制最大值是256,二进制是11111111(256-1)。如果将256送入AH。则AH会变成00000000。进的数字会被抛弃,导致数据错误。 ##### 物理地址 CPU要访问内存单元时,要给出内存单元的地址。所有内存单元构成的存储空间是一个一维的线性空间,每一个存储单元在这个空间中都有一个唯一的地址,我们将这个唯一的地址称为物理地址。 ##### 16位结构的CPU 16位的CPU有以下几个特点 1. 运算器一次最多可以处理16位的数据。 2. 寄存器最大宽度为16。 3. 寄存器和运算器之间的通路为16位。 ##### 8086CPU给出物理地址的方法 1. CPU中相关的部件提供两个16位地址,一个称为`段地址`,另一个称为`偏移地址。` 2. 段地址和偏移地址通过内部总线送入一个称为`地址加法器`的部件。 3. 地址加法器将两个16位地址合成一个20位的物理地址。 4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路。 5. 20位物理地址被地址总线传送到存储器。 地址加法器采用`物理地址=段地址X16+偏移地址`的方法用段地址和偏移地址合成物理地址。 16位的段地址X16得到20位地址。偏移地址负责具体向前或者向后的地址偏移量。 ##### 不同寄存器的作用 CPU中的寄存器作用是不一样的。 一些保留段地址偏移地址帮助寻找物理地址CS、DS、SS、ES。 一些存储数据AX、BX、CX、DX。 一些存储指令CS:IP。 ##### 字的概念 字是两个字节,16位。一个字节是8位。所以很多CPU传送一次的数据是一个字。 ##### 栈机制 CPU和大部分程序都会有栈机制。栈是一种数据结构,遵从先进后出。 比如:一个盒子可以放三条裤子,放的顺序是第一条第二条第三条,而拿出来的顺序是第三条第二条第一条。 在计算机硬件设计和软件设计,确定运行顺序是很有必要的。所以栈是常见的一种运行机制(和数据结构)。 注意:避免`栈段`超界。