机器语言与汇编语言
机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令。早期程序设计均使用机器语言,程序员用打孔纸带将 0、1 编程的程序代码输入到计算机。机器语言很难辨识和记忆,于是诞生了汇编语言。
汇编语言的主体是汇编命令。汇编指令是机器指令便于记忆的书写格式。比如
操作:寄存器 BX 的内容送到 AX 中
机器指令:
1000100111011000
汇编指令:
mov ax, bx
程序员用汇编语言编写源程序,然后通过编译器将汇编指令转换成机器码,由计算机最终执行。
汇编语言发展至今,有以下 3 类指令组成:
- 汇编指令:机器码的助记符,有对应机器码(核心)
- 伪指令:没有对应的机器码,由编译器执行,计算机并不执行
- 其他符号:如 +、-、*、/ 等,由编译器识别,没有对应的机器码
存储器
CPU 控制整个计算机的运作并进行运算,而存储器则负责存放指令和数据。要学习汇编,必须先了解 CPU 读取/写入存储器的过程。
指令和数据
指令和数据在内存中没任何不同,都是二进制信息。同一二进制信息,可以解释成指令,也能解释成数据。比如:
1000100111011000 -> 89D8H(数据)
1000100111011000 -> mov ax,bx(指令)
存储单元
存储器被划分成若干个存储单元,每个存储单元从 0 开始按顺序编号,如图所示(一般采用十六进制)。每个存储单元可以存储一个 字节(Byte),一个字节根据不同机器,可能是 8、16、32、64 位(bit)
下面是一些容量换算:1KB = 1024B,1MB = 1024KB,1GB = 1024MB,1TB = 1024GB
CPU 要从内存中读取数据,必须指定存储单元的地址。就像写信一样,要知道对方住哪。同时,一台微机中,不一定只有存储器,还有其他可以存取数据的硬件,所以 CPU 还要指明是对哪个器件进行操作,以及进行哪种操作,读 or 写。所以 CPU 要进行读写,必须提供以下信息:
- 存储单元的地址(地址信息)
- 器件的选择,读或写的命令(控制信息)
- 读或写的数据(数据信息)
CPU 是通过什么将上述三种信息送到存储器芯片中的呢?显然是导线。计算机中专门连接 CPU 和其他芯片的导向称为总线。根据传输的信息的不同,总线分为:
- 地址总线
- 控制总线
- 数据总线
比如,CPU 要读取3号地址的数据。首先,通过地址总线将地址信息 3 发出;然后,CPU 通过控制总线发出内存读命令,选中存储器芯片,通知它从中读取数据;最后,存储器将 3号地址中的数据 8 通过数据线送入 CPU。(如图)
地址总线
CPU 通过地址总线来指定存储器单元,有 N 个地址总线,则说明最多可以对 $2^N$ 个存储单元进行寻址,我们称这个 CPU 的地址总线宽度为 N.
数据总线
数据总线和地址总线差不多。比如 8086 有 16 根数据线,则可一次传送 16 位数据,而8088 只有 8 根数据线,一次只能传送 8 位数据。
控制总线
CPU 通过控制总线来控制外部部件,控制总线越宽,控制能力越强。
内存地址空间
内存地址空间指的是 CPU 可寻到的内存单元。比如一个 CPU 地址总线宽度为 10,则可寻址 1KB,则这 1KB 内存单元即该 CPU 的内存地址空间。
但是这 1KB 不一定全部用来对内存进行寻址,因为 CPU 还要连接比如显卡、网卡,它们上面也有存储器,CPU 会把这些也当作“内存”来对待。这些所有空间组成一个逻辑存储器,这个总的存储器即内存地址空间。
8086 的地址总线宽度为 20,可以定位 $2^{20}$ 个内存单元,则 8086 的内存地址空间为 1MB