第1章 基础知识

1.1 机器语言

  • 机器语言是机器指令的集合,机器指令就是一堆二进制数字
  • 早期计算机就是执行机器指令,进行运算现在PC机种CPU(一种微处理器)会处理这些
  • 每一种微处理器,硬件设计和内部结构的不同,需要不同电平脉冲来控制,所以都有自己的机器指令集(机器语言)

1.2 汇编语言的产生

  • 汇编语言的主体是汇编指令,汇编指令是机器指令便于记忆的书写格式
  • 寄存器简单来讲就是CPU种存储数据的器件,一个cpu可以有多个寄存器
  • 程序员用汇编语言写出源程序,再通过汇编编译器编译为机器码,被机器执行

1.3 汇编语言的组成

由三类指令组成

  1. 汇编指令(核心,决定了汇编语言特性):机器的助记符,有对应机器码
  2. 伪指令:没有对应机器码,由编译器执行,机器不执行
  3. 其他符号:如+-/等,由编译器识别,无对应机器码

1.4 存储器

  • 内存:指令和数据在存储器中存放,向cpu提供指令和数据
  • 磁盘:磁盘上的数据、程序需要读到内存才能被cpu是哟

1.5 指令和数据

  • 二者都是二进制信息,在存储上没有区别,cpu工作时会将有的信息当做指令,有的信息当做数据,为相同的信息赋予了不同的意义

1.6 存储单元

  • 存储器被分为若干存储单元,每个存储单元从0开始顺序编号
  • 微机存储器的容量是以字节为最小单位来计算的,它的存储单元可以存储一个Byte。

1.7 CPU对存储器的读写

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

  • 存储单元的地址(地址信息)

  • 器件的选择,读或写的命令(控制信息)

  • 读或写的信息(数据信息)

  • 以上三种信息怎么从cpu传到存储器芯片中?电子计算机处理,传输的信息都是电信号,要通过导线来传递。计算机中有专门连接CPU和其他芯片的导线,通常称为总线。物理意义上就是很多导线的集合。

  • 从传输信息的不同,总线从逻辑上分为3类:

  1. 地址总线
  2. 控制总线
  3. 数据总线
    每个CPU芯片都用很多管脚,跟总线相连

1.8 地址总线

  • N根地址线,可以对\(2^n\)个存储单元进行寻址,可以说这个cpu的地址总线的宽度为N

1.9 数据总线

  • 数据总线的宽度决定了CPU跟外界的数据传送速度,比如8根数据总线一次可以传送一个8位二进制数据,即一个字节,16根数据总线则是2个字节。

1.10 控制总线

  • 控制总线是一个总称,是一些不同控制线的集合,有多少种控制线,CPU对外部器件就有多少种控制,它的宽度决定了CPU对外部器件的控制能力。

1.11 内存地址空间(概述)

  • CPU可寻址到的所有内存单元所组成的

1.12 主板

  • 每个PC机上都有一个主板,主板上的器件通过总线相连,这些器件有CPU,存储器,外围芯片组,扩展插槽,插槽上一般插有RAM内存条和各类接口卡

1.13 接口卡

  • 计算机系统中所有可用程序控制其工作的设备都必须受CPU控制。
  • cpu对外部设备,如显示器,音响等不能直接控制,控制它们的是扩展插槽上的接口卡。
  • 扩展插槽通过总线和CPU相连,所以接口卡通过总线和CPU相连,CPU控制接口卡,接口卡控制外设

1.14 各类存储器芯片

  • 存储器芯片从读写属性上可分为两类:
    • 随机存储器(RAM),可读可写,必须带电存储,关机后存储的内容消失
    • 只读存储器(ROM),只读不写,关机后内容不会消失
  • 从功能和连接上分:
    • 随机存储器:用于存放宫CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上的RAM和插在扩展插槽的RAM
    • 装有BIOS的ROM:BIOS是各类接口卡(显卡网卡等)厂商提供的软件系统,可以利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插有存储相应BIOS的ROM。
    • 接口卡上的RAM:某些接口卡需要对大批量输入输出数据进行暂时存储,在其上装有RAM,最典型的是显示卡上的RAM,称为显存。显示卡随时将显存中的数据向显示器上输出。我们需要将要显示的内容写入显存,就会出现在显示器上。

1.15 内存地址空间

  • 上述那些存储器在物理上是独立的器件,但都与CPU的总线相连,CPU向它们发出读写命令时都通过控制线,也就是说CPU将它们当做内存来对党,把它们看作一个由若干存储单元构成的逻辑存储器,一般我们称之为内存地址空间。每个物理存储器都在这个逻辑存储器中占有一个地址段,即一段地址空间。
  • 内存地址空间的大小受CPU地址总线宽度限制
  • 在基于一个计算机硬件系统编程时,需要知道这个系统中内存地址空间的分配情况。当我们想在某类存储器中读写数据时,必须知道它的首尾单元地址,才能正确进行读写操作

第2章 寄存器

  • cpu内各个器件用的是内部总线联系,cpu和主板上其他器件用外部总线联系
  • 在cpu中:
    • 运算器进行信息处理
    • 寄存器进行信息存储
    • 控制器控制各种器件进行工作
    • 内部总线连接各种光器件,传送数据
  • 寄存器是cpu中程序员可以用指令读写的部件,改变寄存器内容来实现对CPU的控制
  • 8086cpu有14个寄存器

2.1 通用寄存器

  • 8086的寄存器都是16位的,其中AX BX CX DX四个寄存器为通用寄存器。上一代8086cpu为8位,为了兼容,这4个寄存器可以分为2个8为寄存器独立使用。低8位用AL表示,高八位用AH表示

  • 存放一般性数据的寄存器叫通用寄存器

2.2 字在寄存器中的村粗

  • 8086cpu为了兼容性,一次可以处理两种尺寸的数据,分别是字节(存在8位寄存器)和字(存在16位寄存器)
  • 字是word,由俩自己组成,分别称为高位字节和低位字节
  • 一个内存单元可以存放8为数据,而cpu的寄存器又可以存放n个8位的数据,所以计算机中大部分数据是由8位数据组成的。十六进制数的一位相当于4位二进制数,用十六进制可以直观看出数据是由哪些8位数据构成

2.3 几条汇编指令

  • 汇编指令或者寄存器的名称不区分大小写
  • 在进行数据传送或运算时,要注意指令的两个操作对象的位数应该是一致的

2.4 物理地址

  • 所有内存单元构成的存储空间是一个一维的线性空间。每个内存单元都在这个空间有唯一的地址,称之为物理地址
  • CPU通过地址总线向存储器送入的必须是一个内存单元的物理地址。在送入前,内部必须先形成物理地址。不同cpu可以有不同的形成物理地址的方式。下面讨论8086CPU的方式

2.5 16位结构的CPU

  • 16位结构,16位机,字长为16位都是一个意思,说明这个cpu具有以下几方面的结构特性:
    • 运算器一次最多处理16位数据
    • 寄存器的最大宽度为16位
    • 寄存器和运算器之间的通路为16位

8086cpu给出物理地址的方法

  • 8086cpu有20位地址总线,可以传送20位地址,达到1mb的寻址能力。
  • 但8086cpu又是16位结构,在内部一次性处理,传输,暂时存储的的地址为16位,如果只是将地址简单的发出,一次只能发16为的地址,表现出的寻址能力只有64KB。
  • 8086cpu用在内部用两个16位地址合成的方法来形成一个20位的物理地址。
    • CPU的相关部件提供两个16位地址,一个叫段地址,一个叫偏移地址,通过内部总线送入地址加法器,合成一个20位的物理地址
    • 再通过内部总线送入输入输出控制电路,再送入地址总线,最后被送入存储器
    • 地址加法器的方法是
      物理地址=$ 段地址\times 16+偏移地址$ (十六进制说法,二进制说法是左移四位)

2.7 上述公式的本质含义

  • 本质含义是CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。8086cpu的寻址功能是 基础地址+偏移地址=物理地址 这种寻址模式的一种实现方案

2.8 段的概念

  • 内存没有分段,段的划分来自于CPU。由于8086cpu 物理地址=$ 段地址\times 16+偏移地址$ 的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存
  • 编程时可以根据需要,将若干地址连续的内存单元看做一个段,用段地址*16定位段的起始地址/基础地址,用偏移地址来定位段中的内存单元。
  • 一个段的起始地址必定是16的倍数,偏移地址为16位,16位寻址能力为64KB,所有一个段的长度最大为64KB
  • CPU可以用不同的段地址和偏移地址来形成同一个物理地址
  • 段地址(SA),偏移地址(EA)
  • 在8086pC机中,21F60H内存单元不应该这样说,要说成内存2000:1F60单元或内存的2000H段中的1F60H单元中
  • 可以根据需要,将连续地址,起始地址为16的倍数的一组内存单元定位一个段

2.9 段寄存器

  • 8086cpu有四个段寄存器:CS DS SS ES,当CPU要访问内存时,由这四个段寄存器提供内存单元的段地址

2.10 CS和IP

  • 这俩是8086中最关键的寄存器,指示了cpu当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。

  • 假设CS的内容为M,IP的内容为N,则8086cpu将从M * 16+N(CS:IP)内存单元读取一条指令并执行

    • 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
    • IP=IP+所读取指令的长度,从而指向下一条指令
    • 执行指令,回到第一步,重复这个过程
  • 8086CPU刚开始工作时(复位/上电启动)时,CS和IP被设置为CS=FFFFH,IP=0000H。即在刚启动时,CPU就从FFF0H单元读取指令执行,这是CPU开机后所执行的第一条指令

  • 指令和数据都是二进制信息,CPU怎么区分呢?CPU将CS:IP指向的内存单元中的内容看做指令,因为在任何时候,CPU将CS和IP中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码。换句话说,如果内存中一段信息被CPU执行过,则它所在的内存单元必然被CS:IP指向过