汇编语言是直接作用在硬件之上工作的编程语言,我们首先要了解硬件系统的结构,才能有效地应用汇编语言对其进行编程。
但是,在汇编课程中不对硬件系统进行全面和深入探究,在《微机原理与接口》中进行关于PC机以及CPU物理结构和编程结构的全面研究。汇编课程的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活地控制系统进行工作。
一、机器语言
机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转换为一列高低电平,以使计算机的电子器件受到驱动,进行计算。
早期计算机指的是可以执行机器指令,进行运算的机器,而现在使用芯片CPU(Central Processing Unit,中央处理单元)来完成早期计算的功能,CPU是一种微处理器。
现在我们提到的计算机是指由CPU和其他受CPU直接或间接控制的芯片、器件、设备组成的计算机系统。
拿两个例子看一下机器语言的麻烦吧!
第一个例子,应用8086CPU完成计算s=768+12288-1280,其机器码如下
第二个例子,在显示器上输出“welcom to masm”,其机器码如下
是的,别震惊,短短的一个输出语句其机器码就是这么长。一旦其中某个1变成了0或者0变成了1,想找出错误来基本是不可能的
二、汇编语言的产生
针对上述机器语言的麻烦,汇编语言就应运而生。汇编指令是机器指令便于记忆的书写方式。例如,同样是先一个功能:把寄存器BX的内容送到AX中,两者分别为
之后,程序猿们就用汇编指令写源程序。但是,计算机能知道的语言只有机器指令,这时候就需要翻译官将汇编语言程序翻译为机器码,然后由计算机执行,整个过程如下图所示:
三、汇编语言的组成
汇编语言由以下3类指令组成:
汇编指令(核心指令):机器码的助记符,有对应的机器码
伪指令:没有对应的机器码,由编译器执行,计算机并不执行
其他符号:如+
, -
, *
和/
等,由编译器识别,没有对应的机器码
四、存储器
要想让一个CPU工作,必须向他提供指令和数据。指令和数据在存储器中存放,也就是我们平时所说的内存。
磁盘不同于内存,磁盘上的数据或程序如果不读到内存中,就无法被CPU利用。
五、指令和数据
指令和数据是应用上的概念,在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。
六、存储单元
存储器被分为若干个存储单元,每个存储单元从0开始顺序编号。例如一个存储器有128个存储单元,编号从0~127.
而每个存储的单元都是由8个二进制开关组成的,每个开关大小为1bit,所以1个存储单元大小为8bit,其中1Byte = 8bit,所以一个存储单元大小为1Byte.
用1B代表1Byte(字节),对于大容量的存储器其存储单位计量容量如下:
七、CPU对内存的读写
存储器(内存)被分成了一个一个的存储单元,存储单元从0开始编号,这些编号可以看作存储单元在存储器中的地址。
CPU要从内存中读取数据,首先要指定存储单元的地址,也就是说要先确定它要读取哪一个存储单元中的数据。
另外,在一个计算机中,除了存储器外还有起的器件。CPU在读写数据时还要指明,要对哪个数据进行哪种操作,是要往外读还是往里写数据。
所以,CPU要想进行数据的读写,必须执行下面的步骤:
知道存储单元的地址
选择要进行读或写(控制信息)的器件
开始读或写数据(数据信息)
针对上面这3个步骤,每个步骤都需要不同的导线来传送电信号。在计算机中有专门连接CPU和其他芯片的导线,称为总线,震度一上述的步骤,一共有3类总线与之对应
- 地址总线
- 控制总线
- 数据总线
下面是一个CPU从序号为3的存储单元中读取数据的过程
写和读的方向是相反的,所以这里就不写他的过程了。上面知道了CPU是怎么进行数据读写的,但是如何命令计算机进行数据的读写呢?
对于8086CPU,下面的机器码,能够从3号存储单元中读取数据。
可以看到机器码的一串0,1非常难以记忆,所以使用汇编指令来表示
八、地址总线
CPU通过地址总线来找到对应的存储器单元,地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。
- 如果只有1根线,其寻址地址为:0或1
- 如果有2根线,其寻址地址为:0, 1, 2或3
所以,如果有根线,那它的寻址地址总数为个,存储单元:。
像下面这张图就展示了10根地址总线向内存单元为11发出的二进制信息,1101
换算完就是11.
九、数据总线
CPU与内存或其他器件之间的数据传送是通过数据总线来进行的,数据总线的宽度决定了CPU和外界的数据传送速度。
- 8根数据总线一次可以传送一个8位二进制数据(即一个字节)
- 16根数据总线一次可传送两个字节。
下面这张图就是8位数据总线发送两个字节的数据,可以看到,这两个数据只能分两次传输
而16位的数据总线就可以一次传送到这两个字节的数据
十、控制总线
CPU对外部器件的控制是通过控制总线来进行。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。
十一、内存地址空间(概述)
什么是内存地址空间?
举例说明:一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成了这个CPU的内存地址空间。
在进入深入讨论之前,需要知道两个基础知识:主板和接口卡。
十二、主板
在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件,这些器件通过总线(地址总线、数据总线、控制总线)相连接。这些器件有CPU、存储器、外围芯片组、扩展插槽等。扩展插槽上一般有RAM内存条和各类接口卡。
十三、接口卡
计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。CPU对外部设备都不能直接控制,如显示器、音响、打印机等。直接控制这些设备进行工作的是插在扩展卡槽上的接口卡。
扩展插槽通过总线和CPU相连,所以接口卡也通过总线同CPU相连。CPU可以直接控制这些接口卡,从而实现CPU对外设的间接控制。简单地来说,CPU通过总线向接口卡发送命令,接口卡根据CPU的命令控制外设进行工作。
十四、各类存储器芯片
一台PC机中,装有多个存储器芯片,这些存储器芯片从物理连接上看是独立的、不同的器件。
从读写属性上来看,这些存储器芯片可以分为两类:
- 随机存储器(RAM):可读可写,但必须带电存储,关机后存储的内容丢失
- 只读存储器(ROM):只能读取不能写入,关机后其中的内容不丢失
这些存储器从功能和连接上又可以分为以下几类
- 随机存储器RAM
用于存放CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上RAM和插在扩展插槽上的RAM - 装有BIOS(Basic Input/Output System,基本输入/输出系统)的ROM
BIOS是由主板和各类接口卡(如显卡、网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插有存储相应的BIOS的ROM。例如,主板上的ROM中存储着主办的BIOS(通常被称为系统BIOS);显卡上的ROM中存储着显卡的BIOS;如果网卡上装有ROM,那其中就可以存储网卡的BIOS。 - 接口卡上的RAM
某些接口卡需要对大批量输入、输出数据进行暂时存储,在其上装有RAM。最典型的是显示卡上的RAM,一般称为显存。显示卡随时将显存中的数据向显示器上输出。换句话说,我们将需要显示的内容写入显存,就会出现在显示器上。
下面这张图1.7展示了PC系统中各类存储器的逻辑连接情况
十五、内存地址空间
上面那么多的RAM和ROM(针对每种器件所用),在物理上是独立的器件,但是在下面两点上是相同的
- 都和CPU的总线相连
- CPU对它们进行读或写的时候都通过控制线发出内存读写命令
还记得吗,之前学习CPU调用内存单元的数据吗,这里也是一样的,CPU操纵这些器件都是当作内存来对待的,把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们说的内存地址空间。
下面这张图1.8就说明了CPU将系统中各个类型的存储器看作一个逻辑存储器的情况
在上面的这张图中,所有的物理存储器被放到了一个由若干存储单元组成的逻辑存储器,每个存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中的读写数据。
假设图中的内存地址空间的地址段分配如下:
- 地址0~7FFFH的32KB空间为主随机存储器的地址空间
- 地址8000H~9FFFH的8KB空间为显存地址空间
- 地址A000H~FFFFH的24KB空间为各个ROM的地址空间
这样,如果这时开始向不同的内存单元中写入数据
- CPU向内存地址为1000H的内存单元中写入数据,这个数据就被写入主随机存储器中;
- CPU向内存地址为8000H的内存单元中写入数据,这个数据就被写入显存中,然后就被输出到显示器上;
- CPU向内存地址为C000H的内存单元中写入数据的操作是没有结果的,C000H单元中的内容不会被改变,C000H单元实际上就是ROM存储器的一个单元。
内存地址空间的大小受CPU地址总线宽度的限制。8086CPU的地址总线宽度为20,则可以定位个内存单元,则8080CPU的内存地址大小为1MB。80386CPU的地址总线宽度为32,则内存地址空间最大为4GB.
不同的计算机系统的内存地址空间的分配情况是不同的,下面的图1.9展示了8086PC机内存地址空间分配的基本情况。
和上面的逻辑一样,如果向内存中读写数据
- 从地址0~9FFF的内存单元中读取数据,实际上就是在读取主随机存储器的数据
- 向地址A0000~BFFF的内存单元中写数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上
- 向地址C0000~FFFFF的内存单元中写入数据是无效的,因为这等于改写只读存储器的内容
十六、总结
对汇编来说,我们就是帮助CPU调用内存空间的数据,或读或写。这个内存空间可能会包括系统的RAM,设备的ROM,显存的ROM等等各种,这样就实现了设备之间的交互功能。
检测点1.1
1个CPU的寻址能力为8KB,那么它的地址总线的宽度为16.
1KB的存储器有1024个存储单元,存储单元的编号从0到1023.
1KB的存储器可以存储个bit,1024个Byte。
1GB、1MB、1KB分别是 、 、Byte。
8080、8088、80286、80386的地址总线宽度分别为16根、20根、24根、32根,它们的寻址能力分别为: (KB)、1 (MB)、 (MB)、2(GB)
8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为 1(B)、1(B) 、2(B)、2(B)、 4(B)
从内存中读取1024字节的数据,8086至少要读 1024 次,80386至少要读 456 次
在存储器中,数据和程序以 二进制信息 形式存放。