基础知识
机器语言
机器语言是机器指令的集合,机器指令是一台计算机可以正确执行的命令,是一列二进制数字。计算机将其转变成对应的一列高低电平,以驱动计算机的电子器件,进行CPU的主要工作——运算。
每一种微处理器的硬件设计和内部架构都不同,故需要用不同的电平脉冲来控制其工作,所以每一种微处理器都有其自己的机器指令集,也就是机器语言。
若使用8086CPU完成运算 s = 768 + 1288 - 1280, 机器码如下:
101110000000000000000011
000001010000000000110000
001011010000000000000101
程序员们将这些机器码打在纸带或卡片上,1打孔,0不打孔,再将程序通过过纸带机或者卡片机输入计算机,进行运算。
汇编语言的产生
显然,机器码很麻烦,所以产生了汇编语言。
操作:寄存器BX的内容送到AX中
机器指令:1000100111011000
汇编指令:mov ax, bx
寄存器是CPU中的储存数据的器件,一个CPU中有多个寄存器。
汇编语言通过编译器来编译成机器码,再由计算机最终执行。(编译器的编译工作自然也是由计算机执行)
汇编语言的组成
汇编语言又三类指令组成
汇编指令,机器码的助记符,有对应的机器码
伪指令,没有对应的机器码,由编译器执行,计算机不执行
其他符号,如 + - * / 等,又编译器识别,没有对应的机器码
汇编指令决定了汇编语言的特性。
储存器
CPU要运算的数据的储存位置,指令和数据都在储存器中存放,就是内存(RAM)。
指令和数据
在内存或磁盘中,指令和数据没有任何区别,都是二进制信息。
储存单元
储存器被划分成多个储存单元,每个储存单元从0开始顺序编号,如一个有128个储存单元的储存器,编号从0
~ 127.
微型机储存器的一个储存单元可以存储一个Byte,即8个二进制位,即8个bit,bit(比特)是电子计算机的最小信息单位
CPU对存储器的读写
CPU想要从内存中读取数据,首先要制定存储单元的地址,就像数据居住在一个小区的一个房子里,我们要找数据就要先确定他住在哪个房子里,而每个房子都有自己的门牌号码,这号码就可以看成储存器的编号。
在CPU读写数据时还要指明其要对哪一个器件进行操作,因为CPU中不知有储存器这一种器件。
CPU要进行数据的读写,必须和外部器件(芯片)进行下面3类信息的交互
存储器单元的地址(地址信息)
器件的选择,读或写的命令(控制信息)
-
读或写的数据(数据信息)
在计算机中有专门连接CPU和其他芯片的导线(电子计算机处理、传输的信息都是电信号,电信号当然要用导线传送)称为总线,总线从逻辑上又分为3类:地址总线、控制总线和数据总线。
-
读3号位置的数据操作:
CPU通过地址线对内存发出信息3
CPU通过控制线发出内存读命令,选中存储器芯片,并通知其要从中读取数据
存储器将3号位置的数据通过数据线发到CPU
机器码: 10100001 00000011 00000000
汇编指令:mov ax, [3]
含义: 传送3号单元的内容送入ax
地址总线
不同CPU的地址总线不同且有限,假设一个CPU有N根地址总线,那么它最多可以寻找2的N次方个内存单元(Byte)
数据总线
数据总线的宽度决定了CPU和外界的数据传送速度,比如8根数据总线一次可以传送一个8位二进制数据(即一个字节,一个Byte,一个存储单元)
- 当CPU的数据总线宽度为8,那么它向内存中写入数据89D8H时,就要分成两次传送,第一次传送D8,第二次传送89,
第一次:
10010001 (89)
第二次:
00011011 (D8)
- 当CPU的数据总线宽度为16,那么他可以一次传送89D8H
第一次:
00011011 - 10010001 (89D8)
控制总线
控制总线的宽度决定了CPU对外部器件的控制能力,前面讲的内存读写命令是又几根控制线综合发出的,其中一根称为“读信号输出”的控制线负责由CPU向外部传送读信号,CPU向该控制线输出低电平表示将要读取数据;同理,有一根称为“写信号输出”的控制线负责传送写信号。
内存地址空间概述
一个CPU的地址总线宽度为10,那么可以寻址2的10次方即1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。
主板
就是PC机中的各个核心器件和主要器件都通过总线(地址总线、数据总线、控制总线)相连。这些器件有CPU、存储器、外围芯片组、扩展插槽等。扩展插槽根据接口和协议的不同,一般插有RAM内存条和各类接口卡。
接口卡
所有可用程序控制其工作的设备,都要由CPU进行控制。
但CPU不能对外部设备直接控制,如显示器、音响、打印机等。所以CPU通过总线向接口卡发送命令,接口卡根据CPU的命令控制外设进行工作。
各类存储器芯片
- RAM 随机存储器
用于存放CPU使用的绝大部分程序和数据
- 装有BIOS的ROM 只读存储器
BIOS是由各种接口卡厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出(Basic
Input/Outp System)
- 接口卡上的RAM
如显存,应付大批量输入输出数据的暂时存储情况,我们将需要显示的内容写入显存,就会显示在显示器上。
内存地址空间
上面说的各类存储器,在物理上是独立的器件,但有以下两点相同:
都和CPU的总线相连(直接:RAM等, 间接: 接口卡)
CPU对它们进行读或写的时候都通过控制线发出内存读写命令。
也就是说,CPU把他们总的当作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间,汇编语言面对的就是这个内存地址空间。
这个总的逻辑存储器通过不同的器件的空间分成了一个个地址段,CPU通过访问不同的地址段以达到控制不同的器件的目的,在一段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
假设内存地址空间的地址段分配如下:
- 地址0~7FFFH的 32KB空间为 主随机存储器的地址空间;
- 地址8000H~9FFFH的 8KB空间 为 显存地址空间;
- 地址A000H~FFFFH的 24KB为 各个ROM的地址空间;
这样,当CPU向内存地址为1000H的内存单元中写入数据,这个数据就会被写入到随机存储器中,以此类推。
- 而CPU向内存地址为C000H的内存单元中写入数据的操作是没有结果的,因为C000H单元的内容是ROM存储器中的一个单元,它是只读的。
内存地址空间受CPU地址总线宽度的限制。
8086CPU的地址总线宽度为20,所以可以传送2的20次方个不同的地址信息(0 ~ 2的20次方-1),即可以定位2的20次方个内存单元,则8086PC的内存地址空间大小为1MB(1024KB、2的20次方Byte)。
同理,80386CPU的地址总线宽度为32,则内存地址空间最大为4GB。
在使用基于一个计算机硬件系统进行编程的时候,必须知道这个系统的内存地址空间分配情况。