汇编语言
基础知识和8086 CPU的寻址能力简介

本篇文章,主要简单介绍一下汇编语言的基础知识和8086 CPU的寻址能力。

机器语言

机器语言是用二进制代码表示的、计算机能直接识别和执行的一种机器指令的集合。 机器指令,其实就是一串二进制数。

由于机器语言对于程序员来说不够直观,难于辨别和记忆,生产效率低下,于是汇编语言产生了。

汇编语言

汇编语言的汇编指令是机器指令的助记符,两者之间一一对应。但是,汇编指令更适合人类阅读和编写,容易记忆。

由于计算机只能读懂机器指令,我们编写的汇编代码又如何让计算机执行呢? 这就需要有一个能够将汇编指令转换为机器指令的翻译程序,这个程序称为编译器。

CPU与存储器

CPU是计算机的核心部件,它控制整个计算机的运作并进行运算。

要想让一个CPU工作,就必须向它提供指令和数据。指令和数据在存储器中存放,也就是我们平时所说的内存。

指令和数据

指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。

CPU在工作的时候把有的信息看作指令,有的信息看作数据,为同样的信息赋予了不同的意义。

例如,二进制1000100111011000,既可以表示数据0x89D8,也可以表示指令mov ax,bx。

存储单元

存储器被划分成若干个存储单元,每个存储单元可以存储一个字节的数据(8位二进制数),存储单元从0开始顺序编号。

CPU对存储器的读写

CPU可以对多种器件进行操作,最常见的是对内存数据的读写。

CPU在读写数据的时候,需要指明对哪个器件进行操作(存储单元的地址),进行什么操作(读或写),以及数据信息。

在计算机中,CPU和其他芯片有专门的连接导线,通常称为总线。通过总线,CPU就可以将地址、数据和控制信息传送到芯片上。

根据传送信息的不同,总线从逻辑上分为3类,分别为地址总线、控制总线和数据总线。

例如,CPU从3号单元中读取数据的过程如下。

  1. CPU通过地址线将地址信息3发出;
  2. CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据;
  3. 存储器将3号单元中的数据8通过数据线送入CPU。

地址总线

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

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

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

以下为具有10根地址总线的CPU,向内存发出地址信息为11(二进制为0000001011)时,10根地址线上传送的二进制信息。

数据总线

CPU与内存或其他器件之间的数据传输,是通过数据总线来进行的。

数据总线的宽度,决定了CPU和外界的数据传输速度。8根数据总线,一次可传输一个8位二进制数据。16根数据总线,一次可传输两个字节。

8088 CPU的数据总线宽度为8,8086 CPU的数据总线宽度为16。

向内存中写入数据0x89D8,8088 CPU数据总线上的数据传输情况如下。

控制总线

CPU对外部器件的控制是通过控制总线来进行的。

控制总线是一个总称,是一些不同控制线的集合。

有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。

例如,"读信号输出"的控制线负责向外传送读信号,"写信号输出"的控制线负责传送写信号。

内存地址空间

内存地址空间的大小,受CPU地址总线宽度的限制。

8086 CPU的地址总线宽度为20,内存地址空间大小为1MB(2的20次方)。

80386 CPU的地址总线宽度为32,则内存地址空间最大为4GB(2的32次方)。

在基于一个计算机硬件系统编程的时候,必须知道这个系统中的内存地址空间分配情况。因为在对其进行读写时,必须知道它的第一个单元的地址和最后一个单元的地址,才能保证在预期的存储器中进行。

对于CPU来说,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

小结

每一种CPU都有自己的汇编指令集。

CPU可以直接使用的信息存放在存储器中。

在存储器中,指令和数据没有任何区别,都是二进制信息。

存储单元从零开始顺序编号。

一个存储单元可以存储8个bit(位),即8位二进制数。

每一个CPU芯片都有许多管脚,这些管脚和总线相连。一个CPU可以引出3种总线的宽度,标志了这个CPU的不同方面的性能:

  • 地址总线的宽度,决定了CPU的寻址能力;(访问的地址范围,能支持的最大内存)
  • 数据总线的宽度,决定了CPU与其他器件进行数据传送时的一次数据传送量;(外部总线)
  • 控制总线的宽度,决定了CPU对系统中其他器件的控制能力。

8086 CPU

什么是16位结构的CPU呢?主要有几个方面的结构特性:

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

8086是16位结构的CPU,或叫16位机,字长为16位。

能够一次性处理、传输、暂时存储的信息的最大长度为16位。

8086 CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。 (2的20次方=1048576=1M个地址,每个内存单元为1个字节,因此可寻址1MB)

从8086 CPU内部结构来看,一次只有处理传输16位的地址,寻址能力只有64KB。 (2的16次方=65536=64K,可寻址64KB)

8086 CPU,在内部使用2个16位地址,合成一个20位的物理地址。 其中,一个为段地址,另一个为偏移地址。通过地址加法器,合成一个20位的物理地址。

公式为:物理地址=段地址*16+偏移地址

8086 CPU 相关部件的逻辑结构如下。

8086 CPU 读写内存时物理地址的传送过程如下。

其实,内存本身并没有分段的概念。段的划分来自于CPU,例如上面提到的,CPU使用段地址和偏移地址来给出内存单元的物理地址,从而实现使用分段来管理内存。

段地址*16,说明段的起始地址一定是16的倍数。

偏移地址为16位,寻址能力为64KB(2的16次方),所以一个段的长度最大为64KB。 比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。

补充个知识点,一个N进制的数据左移1位(N进制的位,非二进制位),相当于乘以N。

  • 一个十进制数左移1位,相当于乘以10。例如2左移1位等于20,相当于2*10;
  • 一个二进制数左移1位,相当于乘以2。例如0011(3)左移1位等于0110(6);
  • 一个十六进制数左移1位,相当于乘以16。例如0x0A(10)左移1位等于0xA0(160)。

由于十六进制的1位,相当于二进制的4位。因此,乘以16也相当于其二进制数左移4位。

CPU可以用不同的段地址和偏移地址形成同一个物理地址。例如物理地址21F60H可以用如下段地址和偏移地址来表示:

寄存器(8086 CPU)

一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。 简单地说,在CPU中:

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

不同的CPU,寄存器的个数、结构是不同的。

8086 CPU拥有14个寄存器,每个寄存器有一个名称。这些寄存器分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

所有寄存器都是16位的,可以存放两个字节的数据。

下一篇,我们再聊聊寄存器和如何编写一个汇编程序。

参考

《汇编语言》第3版 王爽

维基百科