前言

汇编语言是能直接操作 CPU 寄存器的语言,学好汇编语言能使我们更好的理解计算机的工作过程。上学那会儿学过计算机原理与接口技术这门课程,汇编多少接触过点儿,不过已经忘完了。现在好多开源代码的底层都是用汇编写的,没有点汇编基础还真的看不懂。那么问题来了,为什么底层的代码要用汇编编写呢?有人回答是汇编的效率更高。汇编和和高级语言最终都要被编译成机器语言,为什么说汇编的效率就更高呢?^_^

机器语言

机器语言是机器指令的集合。例如机器指令 1000 1001 1101 1000 表示把寄存器 BX 的内存送到 AX 中,汇编指令则写成 mov ax,bx。机器语言难于辨别和记忆,于是汇编语言诞生了。汇编语言的出现极大的解放了生产力,相比直接编写机器语言效率上大概提升 3 到 5 倍。

汇编指令组成

汇编语言由 3 种指令组成:

  • 汇编指令:机器码的助记符号,有对应的机器码
  • 伪指令:没有对应的机器码,由编译器执行,计算机并不执行
  • 其它符号:如 + - * / 等,由编译器识别,没有对应的机器码

内存地址空间

CPU 通过总线和内存、硬盘等设备连接,总线从逻辑上分为三类:地址总线、控制总线、数据总线。一个 CPU 有 N 根地址总线,则说这个 CPU 的地址总线宽度为 N,这 N 根线用 0 、1 表示的信息量为 2 的 N 次方,称其寻址能力为 2 的 N 次方。计算机的最小单位信息是 bit ,也就是一个二进制位,8 个 bit 组成一个 Byte,也就是一个字。换算关系如下所示:

1TB = 1024GB ,1GB = 1024MB,1MB = 1024KB,1KB = 1024B,1B = 8bit

微机存储器的容量是以字节为最小单位来计算的,8086 有 20 位地址总线,即 1MB 的寻址能力(即 2 ^ 20B = 1M)。

把主存储器地址空间、显卡地址空间、网卡地址空间、系统 BIOS 地址空间的总和看作一个由若干个存储单元组成的逻辑存储器,这个逻辑存储器就是内存地址空间。

8086 是 16 位的 CPU ,则在内部能够一次性处理、传输、暂时存放的数据为 16 位。8086 有 20 位地址总线,即 1MB 的寻址能力。8086 CPU 的寄存器是 16 位的,那怎么用 16 位的寄存器来表示 20 位的地址总线呢?其实 8086 CPU 在内部用两个 16 位地址(段地址和偏移地址)合成一个 20 位的物理地址,即 物理地址 = 段地址 * 16 + 偏移地址。段地址 * 16又被叫做基础地址。

8086 有 4 个段寄存器:CS、DS、SS、ES。

CS 为代码段寄存器,IP 为指令指针寄存器。任意时刻,设 CS 中的内容为 M ,IP 中的内容为 N ,则 8086 将从内存 M * 16 + N 单元开始,读取一条指令并执行。

8086 工作过程

8086 工作过程简要描述:

  • 1.从 CS:IP 指向的内存单元读取指令到指令缓存器
  • 2.IP = IP + 所读指令的长度,从而指向下一条指令
  • 3.执行指令并从第 1 步开始重复

知道了 8086 CPU 执行指令的过程,那么我们就可以修改 CS 或 IP 或同时修改 CS 和 IP 来控制 CPU 。

  • 修改 CS、IP 的的指令,“jmp 段地址:偏移地址” jmp 2:3,
  • 仅修改 IP 的内容,“jmp 某一合法寄存器” jmp ax,

    执行前 ax = 1000H,CS = 2000H,IP = 0003H

    执行后 ax = 1000H,CS = 2000H,IP = 1000H

8086 其它寄存器

MacDown logo
MacDown logo

从上图可以看出 8086 CPU 内部有 14 个寄存器,一下子也不用记住这么多,随着学习的深入,慢慢的就都认识了。

8086 的所有寄存器都是 16 位的,其中有 4 个通用寄存器,分别为 AX,BX,CX,DX。8086 上一代的 CPU 是 8 位的,为了保持兼容,这 4 个通用寄存器又可以分为两个独立的 8 位寄存器来使用:

  • AX 分为 AH 和 AL
  • BX 分为 BH 和 BL
  • CX 分为 CH 和 CL
  • DX 分为 DH 和 DL

其它的寄存器以后再慢慢介绍。

几个简单的汇编指令

汇编指令 控制 CPU 完成的操作
mov ax,1 将 1 送入寄存器 ax
mov al,1 将 1 送入寄存器 ax 的低 8 位
add ax 8 将寄存器 ax 中的数值加 8
mov ax,bx 将 bx 中的数据送入 ax

总结

通过本文章我们知道了 8086 CPU 的工作过程,即从 CS:IP 处取指令放到缓冲器,新 IP 值为原 IP + 指令长度,执行指令并从头开始;知道了修改 CS 或 IP 或 CS 和 IP 的 jum 方法;知道了 4 个通用寄存器,AX、BX、CX、DX 并且知道它们可以单独作为两个 8 位寄存器使用;了解了基本汇编指令 mov、add 的用法。下篇介绍下怎么在 mac 环境下搭建汇编编程环境。不积跬步无以至千里,继续加油。