8086汇编第一部分:基本概念
一 写在开头
1.1 本节内容
本节主要内容是有关8086汇编语言程序设计的基本概念。
二 8086 CPU的基本知识
2.1 汇编语言
机器语言的晦涩和难以阅读催生了汇编语言。汇编语言使用助记符来表示各种二进制指令,便于人们的阅读。
因为机器只能够执行二进制的机器指令,无法理解汇编指令,所以需要有一个叫做编译器的软件将汇编语言源代码翻译成对应的二进制机器指令。再将翻译而来的二进制指令交由CPU去执行。
汇编语言发展至今,有以下3类指令组成。
(1) 汇编指令:机器码的助记符,有对应的机器码。
(2) 伪指令:没有对应的机器码,由编译器执行,计算机并不执行。
(3) 其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码。
2.2 存储器
存储器用于存放各种数据和指令。它的计量容量如下:
1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB
CPU对存储器的控制通过三种总线进行,它们分别是:地址线、数据线、控制线。值得注意的是,8086的数据总线宽度为16位。
下面举例说明CPU对存储器的读写过程。比如CPU要从3号单元中读取数据,那么其过程如下所示。
(1) CPU通过地址线将地址信息3发出。
(2) CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据。
(3) 存储器将3号单元中的数据8通过数据总线送入CPU。
写操作上述读操作类似,不同的是CPU通过控制线发出内存写命令,并且数据线上的数据是由CPU提供的。内存将该数据写入到地址线制定的内存单元中即可。
CPU如何控制机器中各种不同的存储器件?很简单,CPU将系统中各类存储器看作一个逻辑存储器。如下图所示。
下面是8086 PC机内存地址空间的分配情况。
三 寄存器
3.1 8086 CPU中的寄存器
8086 CPU拥有14个寄存器,它们分别是:AX BX CX DX SI DI SP BP IP CS SS ES PSW。
3.2 通用寄存器
通用寄存器为:AX BX CX DX。它们都是16位的,并且都可以拆分成两个8位寄存器来使用。它们分别是AH AL BH BL CH CL DH DL。
注意:8086 CPU能够一次性处理两种尺寸的数据,分别是字节(byte,8位)和字(word,16位)。
3.3 8086 CPU给出物理地址的方法:短地址 x 16 + 偏移地址 = 物理地址
3.4 CS:IP指示了要读取的指令的地址
在8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行。通过修改CS:IP的值来实现程序的跳转。
3.5 Debug的使用
Debug的常用命令
r - 查看、改变CPU寄存器的内容
d - 查看内存中的内容
e - 改写内存中的内容
u - 将内存中的机器指令翻译成汇编指令
t - 执行一条机器指令
a - 以汇编指令的格式在内存中写入一条机器指令
四 内存访问
4.1 8086 CPU中的DS寄存器通常用来保存要访问的数据段的段地址
4.2 内存访问的几段汇编代码
4.2.1 代码段1
1 mov ax, 1000H 2 mov ds, ax 3 mov ax, [0] 4 mov bx, [2] 5 mov cx, [1] 6 add bx, [1] 7 add cx, [2]
4.2.2 将123B0H~123B9H的内存单元定义为数据段。累加这个数据段中的前3个单元中的数据
1 mov ax, 123BH 2 mov ds, ax ; 将123BH送入ds中,作为数据段的段地址 3 mov al, 0 ; 用al存放累加结果 4 add al, [0] ; 将数据段中的第一个单元的数据累加到al中 5 add al, [1] ; 将数据段中的第二个单元的数据累加到al中 6 add al, [2] ; 将数据段中的第三个单元的数据累加到al中
4.2.3 将上述2中的要求改为累加这个数据段中的前3个字型数据
1 mov ax, 123BH 2 mov ds, ax 3 mov ax, 0 4 add ax, [0] 5 add ax, [2] 6 add ax, [4]
4.3 8086 CPU对栈的支持
push ax ; 将寄存器ax中的内容入栈
pop ax ; 将栈顶的内容弹出并送往ax寄存器
注意:
- 8086 CPU的进栈和出栈都是以字节为单位的
- 任意时刻,SS:SP指向栈顶元素
- 8086 CPU并不保证栈顶不超界
4.4 栈相关的几段代码
1. 将10000H~1000FH这段空间当做栈,初始状态栈是空的,将AX、BX、DS中的数据入栈。
1 mov ax, 1000H 2 mov ss, ax 3 4 mov sp, 0010H 5 6 push ax 7 push bx 8 push ds
注意:想想栈的偏移地址为什么是0010H?
2. 使用栈来保存寄存器的值
1 mov ax, 1000H 2 mov ss, ax 3 mov sp, 0010H 4 5 mov ax, 001AH 6 mov bx, 001BH 7 8 push ax 9 push bx 10 11 sub ax, ax 12 sub bx, bx 13 14 pop bx 15 pop ax
五 参考资料
1. 《汇编语言(第3版)》 王爽