指令:能够被计算机识别并执行的二进制代码。
指令系统:所有指令的集合。
指令按功能分类:数据传送类、算术运算类、逻辑运算和移位、串操作、控制转移类、处理器控制。
一、8086 指令格式
1. 指令的一般格式
在《计组》里面,我们有对目的地址和目的操作数进行严格区分,但在《微机接口》里面我们统称为目的操作数。
8086 指令的长度在 1~7 字节之间,操作码为 1~2 字节,指令的长度决定于操作数的个数以及所采用的寻址方式。(可见,8086 使用的是 CISC 复杂指令集。)
按操作数数量分类:
- 零操作数指令
- 单操作数指令
- 双操作数指令
2. 操作数类型
① 立即数操作数
(关键)立即数是运算数据本身,无地址含义,故无法作目的操作数。由于立即数无法作目的操作数,所以不能用于单操作数指令。
② 寄存器操作数
③ 存储器操作数
存储器操作数的表现形式:[ 内存偏移地址 ]
二、8086 寻址方式
寻址方式:是指获得操作数所在的地址的方法。
寻址方式分类:
- 寻找操作数的地址;
- 寻找要执行的下一条指令的地址,即程序的地址。
后者主要在程序转移或过程调用时用来寻找目标地址或入口地址,这将在调用指令(CALL)或程序转移指令(JMP)中介绍。
1. 立即寻址
仅适用于源操作数。
例、MOV AX,1200H
2. 直接寻址
与《计组》中不同,这里只指存储器直接寻址。
指令中直接给出操作数的 偏移地址,默认在 DS 数据段。
允许段重设,即可以通过增加段前缀以实现段超越。比如:ES:[1200H] 。
例、MOV AX,[1200H] 等价于 MOV AX,DS:[1200H]
3. 寄存器寻址
参加操作的操作数在 CPU 的寄存器中。
例、MOV AX,BX
4. 寄存器间接寻址
特点:
① 寄存器的内容表示操作数的偏移地址。
② 允许的寄存器为 BX、BP、SI、DI,又称为间址寄存器或地址指针。
(考点)判断指令的书写正误。
③ 操作数的段地址取决于间址寄存器,允许段重设。
非串操作的情况下:
- BX、SI、DI:默认为 DS 数据段;
- BP:默认为 SS 堆栈段。
④ 因为寄存器的内容表示操作数的偏移地址,所以指令中的间址寄存器必须加上方括号。
例、MOV BX,1200H;MOV AX,[BX]
5. 寄存器相对寻址
① 操作数在内存中的偏移地址由 间址寄存器 的内容加上指令中给出的一个 8 位或 16 位的位移量组成,即 偏移量 = 寄存器内容 + 位移量。
间址寄存器:BX、BP、SI、DI 。
② 操作数所在的段由所使用的间址寄存器决定。
例、指令MOV AX,Disp[BX]
假设 DS=6000H,BX=1000H,Disp=08H
则偏移地址为 BX+Disp=1008H
操作数物理地址为 61008H
③ 可以使用的寄存器为:BX、BP、SI、DI 。
④ (记忆)格式可以为:
-
MOV AX,[BX+Disp]
-
MOV AX,Disp[BX]
-
MOV AX,[BX]+Disp
-
MOV AX,Disp+[BX]
在 CPU 执行指令之前,会需要编译器对指令进行编译。
每一种寻址方式都对应有唯一的编码。
虽然编译器不认识 [BX]+Disp 和 Disp+[BX] 这两种形式,但它会进行语法分析,将其与寄存器相对寻址方式匹配。随后转换为对应的二进制代码,交由 CPU 执行。
6. 基址变址寻址
① 操作数的偏移地址 = 一个基址寄存器的内容 + 一个变址寄存器的内容。
② 操作数的段地址由选择的 基址寄存器 决定,允许段重设。
- 若基址寄存器为 BX,则默认在 DS 数据段;
- 若基址寄存器为 BP,则默认在 SS 堆栈段。
MOV AX,[BX][SI] (√)
MOV AX,[BP][SI] (√)
MOV AX,[BX]+[SI] (√)
MOV AX,[BX+SI] (√)
MOV AX,[BX][BP] (×)
例、MOV SI,1100H;MOV BX,SI;MOV AX,[SI+BX]
7. 基址-变址-相对寻址
① 操作数的偏移地址 = 基址寄存器的内容 + 变址寄存器的内容 + 位移量。
② 操作数的段地址由选择的 基址寄存器 决定,允许段重设。
③ (重点)指令中不能同时出现两个基址寄存器或两个变址寄存器。
8. 隐含寻址
有些指令的操作码不仅包含了操作的性质,同时还隐含规定了部分操作数。
例、乘法操作(8位 × 8位 → 16位)
这条指令隐含规定了被乘数在 AL 中,同时乘积的结果存放在 AX 中。