微机原理之 80X86指令系统
计算机是通过执行指令序列来完成用户的特定任务的,因此每种计算机都有一组指令集供用户使用,这组指令集就称为计算机的指令系统。
主要内容:
1、8086/8088指令格式
2、8086/8088指令系统的寻址方式
3、8086/8088指令系统
重点:
- 8086指令格式和寻址方式(也是考点)
- 数据传送、算术运算、位操作、串操作、控制转移以及处理器控制等六大类指令
1. 8086指令格式
计算机是通过执行指令来处理各种数据的,因此,一条指令即要指出如何处理数据,同时还应指出数据的来源、操作结果的去向。一般来说指令是由操作码、寻址方,操作数组成。
1.1操作数的分类:
- 1.源操作数:只能读取的操作数。
2.目的操作数:即可读取又可写入(存放操作结果)的操作数。
ADD AX , BX 操作码 目的操作数 源操作数
还可以分为:
- 1.数据操作数
- 2.地址操作数
1.1.1 数据操作数
这类操作数是与数据有关的操作数,即指令中要操作的对象是数据。数据操作数又可分为立即数操作数、寄存器操作数、存储器操作数和I/O操作数。
立即数操作数: 指令中要操作的数据在指令中
寄存器操作数: 指令中要操作的数据存放在指定的寄存器中。
存储器操作数: 指令中要操作的数据存放在指定的存储器中。
I/O操作数 : 指令中要操作的数据来自或送到I/O端口。
1.1.2 地址操作数
这类操作数是与程序转移地址有关的操作数,即指令中要操作的对象不是数据,而是要转移的目的地址。
地址操作数也可分为立即数操作数、寄存器操作数和存储器操作数,即要转移的目的地址包含在指令中,或存放在寄存器中,或存放在存储器单元之中
2. 8086/8088的寻址方式(重点)
所谓寻址方式就是寻找操作数存放地址(位置)的方法。在8086/8088系统中,操作数又可分为两大类:数据操作数和地址操作数。因此,寻址方式也分为数据寻址方式和地址寻址方式两大类。
2.1 数据寻址方式
1)立即数寻址方式
例如:MOV AL, 80H MOV AX, 1234H
2)寄存器寻址方式
例如:MOV AX, CX
3)存储器寻址方式
存储器寻址方式的操作数存放在存储器单元中。因此,要存取操作数就必须知道其存储器的单元地址。在指令中可以直接给出或间接给出操作数的地址,以达到存取操作数的目的。
指令中给出的地址只是操作数的有效地址(EA),若要从存储器中存取操作数还须得到实际的地址(物理地址)。物理地址=段基址左移四位+有效地址
有效地址可以由以下三种地址分量组成:
● 位移量(Displacement):它是存放在指令中的一个8位或16位的数,但它不是立即数,而是一个地址。
● 基址(Base Address):它是存放在基址寄存器BX或BP中的内容。
● 变址(Index Addess):它是存放在变址寄存器SI或DI中的内容。
1. 直接寻址方式 : MOV AL, [1064] ( 段超越 ES:[1064H] )
2. 寄存器间接寻址 :MOV AX, [SI]
3. 寄存器相对寻址:MOV CL, [BX+1064H]
4. 基址加变址寻址方式:
5. 基址加变址相对寻址:MOV [BX+DI+1234H], AH
I/O端口寻址方式
- 直接端口寻址方式:IN AL, 21H
- 间接端口寻址方式:OUT DX, AL
2.2 地址的寻址方式
地址的寻址方式其实是程序转移地址的寻址方式,也就是找出程序转移的地址号,而不是操作数。
转移地址可以在段内,也可以跨段转移(称段间转移)。寻求转移地址的方法有以下四种:
1. 段内直接寻址:
2. 段内间接寻址方式:
3. 段间直接寻址方式:
4. 段间间接寻址方式:
练习题:
指出下列指令中源操作数的寻址方式,若为储存器寻址方式,写出其逻辑地址:
1. mov bx,2000h 立即数寻址
2. mov bx,[si] 寄存器间接寻址
2. add ax, [bx+si+10h] 基址加变址相对寻址
3. mov ax, data 段内直接寻址(有疑问??)
3. in al,dx io端口间接寻址
4. mov bx, offset var
3.8086/8088指令系统
1.数据传送类指令
实现CPU中的寄存器与存储器或I/O端口之间原始数据、中间结果、最终结果以及其他有关信息的传送。它可分为以下四组:
- 通用数据传送指令:MOV PUSH POP XCHG XLAT
- 输入输出指令:IN OUT
- 地址传送指令:LEA LDS LES
- 标志传送指令:LAHF SAHF PUSHF POPF
(一)通用数据传送指令
mov 指令
push/pop src ; sp-2 ,16位操作数,但不能是立即数
XCHG opr1,opr2 ; 可实现寄存器与寄存器之间,寄存器与存储器之间进行数据交换;
注意段寄存器的内容不能参加交换!
(二) 输入/输出指令IN / OUT(直接与间接)
(三)目标地址传送指令
LEA reg16, mem
此指令的功能是将存放源操作数的16位偏移地址(即有效地址EA)送到一个16位的通用寄存器中。即源操作数必须是一个存储器操作数,目的操作数必须是一个寄存器操作数
2.算术运算类指令
8086/8088的算术运算指令共20条,除符号扩展指令(CBW,CWD)外,其余指令都影响状态标志位。
CMP dst, src (dst) - (src) ;前减后
指令类型 | 指令格式 | 操作功能 |
---|---|---|
AAA | 非压缩型BCD码加法调整指令 | |
十进制调整指令 | DAA | 压缩型BCD码加法调整指令 |
AAS | 非压缩型BCD码减法调整指令 | |
DAS | 压缩型BCD码减法调整指令 | |
AAM | 非压缩型BCD码乘法调整指令 | |
AAD | 非压缩型BCD码除法调整指令 |
3.位操作指令
逻辑运算指令:
AND OR NOT XOR TEST
移位指令:
SHL SAL SHR SAR
循环移位指令:
ROL ROR RCL RCR
需要用到时查询该指令即可 !!!
4.字符串指令(略)
5.控制转移类指令(重点指令)
能够使程序的执行流程发生改变的指令。共有以下四类指令:
- 无条件转移 —JMP 转移地址
- 条件转移 —JCC 转移地址
- 循环—loop,loope,loopne等
- 子程序调用—call, ret
1. JMP 不用讲
2. 条件转移
⑴ 判断单个标志
ZF: JZ(JE), JNZ(JNE)
SF: JS, JNS
OF: JO, JNO
PF: JP, JNP
CF: JC, JNC
(2) 判断CX寄存器
JCXZ : CX=0
3.循环
LOOP 循环
判断CX是否等于零,不等于零则循环
4. 子程序调用
- CALL 子程序调用指令
用法:CALL dst
说明:由编译程序自动匹配为某种寻址方式 - RET 子程序返回指令
用法:RET