微机原理 80x86指令系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1.3 8086/8088指令系统
8086/8088CPU指令系统包含有133条基本指令。按其功能可以分为6类,它们是:
⑴数据传送类指令
⑵算术运算类指令
⑶逻辑运算与位移类指令
⑷字符串指令
⑸控制转移类指令
⑹处理器控制类指令。
一、数据传送类指令
数据传送类指令时将数据、地址或立即数传送到寄存器或存储器单元中。可完成寄存器与寄存器之间、寄存器与存储器之间、寄存器与I/O端口之间的字节或字传送。它又可分为通用数据传送指令、输入/输出指令、目标地址传送指令和标志传送指令四组。特点:除SAHF和POPF不影响标志寄存器内容。
(一)通用数据传送指令
1. 最基本的传送指令
指令格式及操作:
MOV dst,src;(dst)←(src)
将源操作数s指定的内容送到d目的操作数
dst是目的操作数,它可以是存储器、通用寄存器(不能为IP)和段寄存器(不能为CS),不能为立即数。
Src是源操作数,它可以是存储器、通用寄存器、段寄存器和立即数。
MOVE指令需要注意的问题:
①MOVE指令可传送8位数据,也可传送16位数据。
②MOVE指令中的两操作数s和d,必用1个寄存器,不允许同时为存储单元。
③不能用CS和IP做目的操作数。
④不允许段寄存器之间直接数据传送。
⑤不允许立即数做目的操作数。
⑥不能向段寄存器送立即数。
2.堆栈操作指令
堆栈操作指令是用来完成压入和弹出堆栈操作的。8086/8088指令系统中提供了完成这两种操作的相应指令。
⑴压入堆栈指令
指令格式及操作:
PUSH src;(SP) ←(SP)-2,
((SP)+1:(SP)) ←(src) src源操作数可以是寄存器操作数和存储器操作数,且必须是16位的操作数,但不能是立即数。
⑵弹出堆栈指令
指令格式及操作:
POP dst; (dst) ←((SP)+1:(SP)),
(SP) ←(SP)+2
dst目的操作数可以是寄存器操作数和存储器操作数,且必须是16位的操作数,但不能是立即数。
特点:
①s和d可以是16位寄存器或存储器两相邻单元;
②堆栈按字操作;
③每执行一条入栈指令,堆栈地址指针SP减2,入栈的数据位于栈顶;
④高位字节先入栈,放在高位地址单元,低位字节后入栈,放在较低地址单元;先进先出原则;
⑤执行弹出指令时,过程相反,栈顶指针的值加2;
⑥CS段寄存器的值可以入栈,但不能反过来弹出一个字到CS
3.交换指令
将源操作数和目的操作数(字或字节)相互对应交换位置。
指令格式及操作:
XCHG opr1, opr2;(opr1) ←→(opr2)
4.字节转换指令
通过查表来完成代码转换,用于实现字节翻译的功能。
指令格式及操作:
XLAT src_table;(AL) ←((BX)+(AL))
XLAT指令是用来将一种字节代码转换成另一种字节代码。执行的结果放在AL中。
使用指令前:BX寄存器的内容指向表格首址;AL中存放待查的码,即某一项与表首地址的距离。
XLAT指令还可以有以下几种表示形式:
XLAT;不写操作数
XLATB;有B就不允许再写操作数。
XLAT ES:src_table;重设段寄存器为ES
Hex_table
码,则可用以下几条指令实现:
Hex_table+F46H
6100FH
(二) 输入/输出指令
只能用累加器作为执行I/0数据传送的机构。输入输出指令可以分为两大类:一类是直接端口地址的输入/输出指令:一类是通过DX寄存器间接端口地址的输入/输出指令。
⑴输入指令
①直接寻址的输入指令
寻址范围0-255(少于8位地址)
指令格式及操作:
IN acc, port;(acc) ←(port)
②间接寻址的输入指令
寻址范围0-65535(少于或超过8位地址)指令格式及操作:
IN acc, DX;(acc) ←((DX))
⑵输出指令
①直接寻址的输出指令
指令格式及操作:
OUT port, acc; (port) ←(acc)
②间接寻址的输出指令
指令格式及操作:
OUT DX, acc; ((DX)) ←(acc)
(三)目标地址传送指令
1. 取有效地址指令
指令格式:
LEA reg16, mem
此指令的功能是将存放源操作数的16位偏移地址(即有效地址EA)送到一个16位的通用寄存器中。即源操作数必须是一个存储器操作数,目的操作数必须是一个通用寄存器操作数。例如:
LEA BX, buffer
LEA AX, [BP][DI]
LEA DX, beta[BX][SI]
注意LEA指令和MOV指令的异同。
不同:
LEA BX, buffer;将存储器buffer的偏
移地址送到BX
MOV BX, buffer;将存储器buffer的内
容传送到BX
相同:
LEA BX, buffer
MOV BX, OFFSET buffer
以上两条指令都是将存储器buffer的偏移地址送到BX。其中OFFSET buffer表示存储器偏移地址。