前言
汇编语言是能直接操作 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 其它寄存器

从上图可以看出 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 环境下搭建汇编编程环境。不积跬步无以至千里,继续加油。