第1章 基础知识

1.1 机器语言

  1. 机器语言:是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。
  2. 计算机
    • 早期计算机:可以执行机器指令,进行运算的机器;
    • 现代计算机:在我们常用的PC机中,有一个芯片(CPU,Central Processing Unit,中央处理单元,是一种微处理器)来完成上面所说的早期计算机的功能 ;现代计算机是指由CPU和其他受CPU直接或间接控制的芯片、器件、设备组成的计算机系统。

      1.3 汇编语言的组成

      汇编语言发展至今,有以下3类指令组成:
  3. 汇编指令:机器码的助记符,有对应的机器码;
  4. 伪指令:没有对应的机器码,由编译器执行,计算机并不执行;
  5. 其它符号:如+、-、*、/ 等,由编译器识别,没有对应的机器码。

汇编语言的核心是汇编指令,它决定了汇编语言的特性。

1.4 存储器

存储器:也就是我们平常说的内存。CPU是计算机的核心部件,它控制整个计算机的运作并进行运算。要想让一个CPU工作,就必须向它提供指令和数据。指令和数据就存储在内存当中。磁盘不同于内存,磁盘中的数据或程序不读到内存中,就无法被CPU使用。

1.5 指令和数据

指令和数据是应用上的概念。在内存和磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作时,把有的信息看作指令,有的信息看作数据。只是为同样的信息赋予了不同的意义。

1.6 存储单元

存储器(内存)被划分为若干个存储单元,每个存储单元从0开始编号。
电子计算机的最小信息单位是bit(比特),也就是一个二进制位。8个bit组成一个Byte(字节)。
微型机的存储器(内存)的存储单元可以存储一个Byte,也就是8个二进制位。一个存储器有128个存储单元,那么它可以存储128Byte。
微型存储器的容量是以Byte为最小单位来计算的。对于拥有128个存储单元的存储器来说,我们可以说它的存储容量是128字节。

1024B = 1MB,1024MB = 1GB, 1024GB = 1TB

1.7 CPU对存储器的读写

存储单元在存储器中的编号可以看作是其在存储器中的地址。
CPU要从内存中读取数据,首先要指定存储单元的地址。另外,在微机中,不止存储器一种器件,因此CPU在读写数据时,还要指明要对哪一个器件进行操作,进行什么操作(是读数据还是写数据)。

因此CPU想要读写数据,必须和外部器件(标准说法是芯片)进行下面3类信息的交互:

  1. 存储单元的地址(地址信息);
  2. 器件的选择,读或写的命令(控制信息);
  3. 读或写的数据(数据信息)。

那么CPU是通过什么将地址、数据和控制信息传到存储器芯片中的呢?
电子计算机能处理、传输的信息都是电信号,电信号当然要用导线传送。
计算机中有专门连接CPU和其他芯片的导线,通常称为总线。
总线:从物理上来讲,是一根根导线的集合;从逻辑上,根据传送信息的不同,又可以分为3类:地址总线、控制总线和数据总线

如何命令计算机进行数据的读写呢?
要让一个计算机或微处理器工作,应向它输入能够驱动它进行工作的电平信息(机器码)。

1.8 地址总线

CPU通过地址总线来指定存储器单元,可见地址总线能传送多少个信息,CPU就可以对多少个存储单元进行寻址

现假设,一个CPU有10根地址总线,让我们来看一下它的寻址情况。我们知道,在电子计算机中,一根导线可以传送的稳定状态只有两种,高电平或是低电平。用二进制表示就是1或0 ,10 根导线可以传送10 位二进制数据。而10 位二进制数可以表示多少个不同的数据呢? 2的10次方个。最小数为0,最大数为1023。

一个CPU有N根地址总线,则称这个CPU地址总线的宽度为N。这样的CPU最多可以寻址2N个内存单元。

1.9 数据总线

CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。8根数据总线一次可传送8个二进制位,即一个字节。

1.10 控制总线

CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些控制线的集合。有多少根控制总线,就意味着CPU提供了多少对外部器件的控制。控制总线的宽度决定了CPU对外部器件的控制能力。

1.11 内存地址空间(概述)

内存地址空间:举例,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成该CPU的内存地址空间。

1.12 主板

在每一台PC中,都有一个主板,主板上有核心器件和一些主要器件,这些器件通过总线(地址总线、数据总线、控制总线)相连,这些器件有CPU,存储器,外围芯片组,扩展插槽等。扩展插槽上一般插有RAM内存条和各类接口卡。

1.13 接口卡

计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制CPU对外部设备都不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。扩展插槽通过总线和CPU相连,所以接口卡也通过总线同CPU相连。CPU可以直接控制这些接口卡,从而实现CPU对外设的间接控制。

1.14 各类存储器芯片

一台PC机中,装有多个存储器芯片,从物理连接上看,它们是独立的、不同的器件。
从读写属性上,可分为:

  1. 随机存储器(RAM,random access memory,也叫随机存取存储器):可读可写,但必须带电存储,关机后存储的内容丢失;
  2. 只读存储器(ROM,Read-only memory):只能读取不能写入,关机后其中的内容不丢失。

从功能和连接上又能分为以下几类:

  • 随机存储器:用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成:装在主板上的RAM和插在扩展插槽上RAM
  • 装有BIOS的ROM:BIOS是由主板和各类接口卡(如显卡、网卡)厂商提供的系统软件。可通过它利用该硬件进行最基本的输入输出。在主板和某些接口卡上插有存储相应BIOS的ROM。
  • 接口卡上的RAM:某些接口卡需要对大批量输入、输出数据进行暂时存储,在其上装有RAM。最典型的是显示卡上的RAM, 一般称为显存。显示卡随时将显存中的数据向显示器上输出。换句话说,我们将需要显示的内容写入显存,就会出现在显示器上。
    PC机中各类存储器的逻辑连接

    1.15 内存地址空间

    上述存储器,在物理上是独立的器件,但是在以下两点上相同:

    • 都和CPU的总线相连;
    • CPU对他们进行读或写的时候都通过控制总线发出内存读写命令。

也就是说,CPU在操控他们的时候,把它们当作内存来对待,把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们说的内存地址空间。
在汇编这门课中,我们面对的就是内存地址空间。
将各类存储器看作一个逻辑存储器

第2章 寄存器

一个典型的CPU由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线连接。

  • 运算器:进行信息处理;
  • 控制器:控制各种器件进行工作;
  • 寄存器:进行信息存储;
  • 内部总线:连接各种器件,在它们之间进行数据的传送。

对于汇编程序员来说,寄存器是CPU中主要的部件。因为寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。

不同的CPU,寄存器的结构、个数是不同的。8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SSDS、ES、PSW

2.1 通用寄存器

8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的,被称为通用寄存器。
16位寄存器的逻辑结构
为了兼容8位寄存器,8086CPU的AX,BX,CX,DX可以分为两个可独立使用的8位寄存器来用:

  • AX可分为AH和AL;
  • BX可分为BH和BL;
  • CX可分为CH和CL;
  • DX可分为DH和DL。

以AX为例。AX的低8位(0位~7位)构成了AL寄存器,高8位(8位到15位)构成了AH寄存器 。
16位寄存器分为两个8位寄存器

出于对兼容性的考虑,8086CPU可以一次性处理以下两种尺寸的数据:

  • 字节:记为byte, —个字节由8个bit组成,可以存在8位寄存器中。
  • 字:记为word, 一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。

AH和AL中的数据,既可以看成是一个字型数据的高8位和低8位,又可以看成是两个独立的字节型数据。

2.3 几条汇编指令

  • mov ax,bx:将寄存器bx中的值送入ax;
  • add ax,bx:将寄存器ax和bx的值相加并存入ax中。

2.4 物理地址

CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以有不同的形成物理地址的方式。

2.5 16位结构的CPU

什么是16位结构的CPU呢?
1 6 位结构( 1 6 位机、字长为1 6 位等常见说法,与1 6 位结构的含义相同)描述了一个CPU具有下面几方面的结构特性:

  • 运算器一次最多可以处理16位的数据;
  • 寄存器的最大宽度为16位;
  • 寄存器和运算器之间的通路为16位。

8 0 8 6 是1 6 位结构的C P U , 这也就是说,在8 0 8 6 内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址。

2.6 8086CPU给出物理地址的方法

8 0 8 6 CP U有2 0 位地址总线,可以传送2 0 位地址,达到1 MB寻址能力。8086CPU又是1 6 位结构,在内部一次性处理、传输、暂时存储的地址为1 6 位。从8 0 8 6 C P U 的内部结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能力只有64KB。

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
当8086CPU要读写内存时:

  1. CPU中的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址;
  2. 段地址和偏移地址通过内部总线送入一个叫作地址加法器的部件;
  3. 地址加法器将两个16位地址合成一个20位的物理地址;
  4. 地址加法器将20位的物理地址通过内部总线送入输入输出控制电路;
  5. 输入输出控制电路将20位的物理地址送入地址总线;
  6. 20位物理地址被地址总线送入存储器。

8086CPU相关部件的逻辑结构

地址加法器采用物理地址= 段地址x16+偏移地址的方法用段地址和偏移地址形成物理地址。

2.8 段的概念

内存并没有分段,段的划分来自于C P U , 由于8 0 8 6 C P U 用“基础地址(段地址[SA]x16)+偏移地址[EA]=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址X16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
有两点需要注意:段地址X16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

CPU访问内存单元时,必须向内存提供内存单元的物理地址。

CPU可以用不同的段地址和偏移地址形成同一个物理地址。

“数据在21F60H内存单元中。”这句话对于8086PC机一般不这样讲,取而代之的是两种类似的说法:①数据存在内存2000:1F60单元中;②数据存在内存的2000H段中的1F60H单元中。这两种描述都表示“数据在内存21F60H单元中”。

可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

2.9 段寄存器

段寄存器:存放段地址的寄存器。8086CPU有四个段寄存器:CS、DS、SS、ES。

2.10 CS和IP

CS和IP是8086CPU最关键的两个寄存器,它们指示了CPU当前要读取的指令的地址。CS为代码段寄存器,IP为指令指针寄存器。

在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M x 16 + N开始,读取一条指令并执行。

也可以这样表述:8086机中,任意时刻,CPU将CS:1P指向的内容当作指令执行。

8086CPU工作过程简述:

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
  2. IP= IP+所读取的指令长度,从而指向下一条指令;
  3. 执行指令。转到1,重复这个过程。

在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH, IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

CPU根据什么将内存中的信息看作指令?

CPU将CS:IP指向的内存单元中的内容看作指令

2.11 修改CS、IP的指令

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU 的控制。CPU 从何处执行指令是由CS 、IP 中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

我们如何改变CS、IP的值呢?
能够改变CS、IP的内容的指令被统称为转移指令。
jmp指令可以修改CS、IP的值。
JMP 段地址:偏移地址:能用指令中给出的段地址、偏移地址分别修改CS、IP的值。
JMP 某一合法寄存器名字:仅修改IP的值。

JMP ax:将IP的值改为ax中的值,相当于执行了:MOV IP,ax