- 冯博琴《微型计算机原理与接口技术》(第3版)【教材精讲+考研真题解析】讲义与视频课程【20小时高清视频】
- 圣才电子书
- 5911字
- 2021-06-04 17:24:00
3.3 8086指令系统
视频二维码(扫码观看)
掌握:
指令码的含义
指令对操作数的要求
指令的对标志位的影响
指令的功能
8086指令系统
从功能上包括六大类:
数据传送
算数运算
逻辑运算和移位
串操作
程序控制
处理器控制
一、数据传送指令
通用数据传送
输入输出
地址传送
标志位操作
1通用数据传送
特点:该类指令的执行对标志位不产生影响
(1)一般数据传送指令
一般数据传送指令MOV
格式:MOV dest,src
操作:src→dest
例:MOV AL,BL
注意点:
两操作数字长必须相同;
两操作数不允许同时为存储器操作数;
两操作数不允许同时为段寄存器;
在源操作数是立即数时,目标操作数不能是段寄存器;
IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。
一般数据传送指令应用例:
将(*)的ASCII码2AH送入内存数据段1000H开始的100个单元中。
题目分析:
确定首地址
确定数据长度
写一次数据
修改单元地址
修改长度值
判断写完否?
未完继续写入,否则结束
程序段:
上段程序在代码段中的存放形式:
设CS=109EH,IP=0100H,则各条指令在代码段中的存放地址如下:
数据段中的分布:
送上2AH后数据段中相应存储单元的内容改变如下:
(2)堆栈操作指令
掌握:
有关堆栈的概念
栈顶、栈首、栈底
堆栈指令的操作原理
执行过程,执行结果
堆栈操作的原则:
先进后出
以字为单位
压栈指令PUSH
指令执行过程:
SP-2→SP
操作数高字节→SP+1
操作数低字节→SP
压栈指令的操作
设AX=1234H,SP=1200H
执行PUSH AX指令后堆栈区的状态:
出栈指令POP
指令执行过程:
SP→操作数低字节
SP+1→操作数高字节
SP←SP+2
出栈指令的操作
执行POP AX
堆栈操作指令说明
指令的操作数必须是16位的;
操作数可以是寄存器或存储器两单元,但不能是立即数;
不能从栈顶弹出一个字给CS;
PUSH和POP指令在程序中一般成对出现;
PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。
堆栈操作指令例:
(3)交换指令
格式:XCHG REG,MEM/REG
注:两操作数必须有一个是寄存器操作数,不允许使用段寄存器。
例:
XCHG AX,BX
XCHG [2000],CL
(4)查表指令
格式:XLAT
说明:用BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址。
操作:将BX+AL所指单元的内容送AL查表指令。
例:
数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第11个代码的ASCII码
查表指令例
可用如下指令实现:
执行后:AL=42H
还可用其他方法实现,如:
MOV BX,2000H
MOV AL,[BX+0BH]
(5)字位扩展指令
将符号数的符号位扩展到高位;
指令为零操作数指令,采用隐含寻址,隐含的操作数为AX及AX,DX;
无符号数的扩展规则为在高位补0;
字节到字的扩展指令。
格式:CBW
操作:将AL内容扩展到AX
规则:若最高位=1,则执行后AH=FFH
若最高位=0,则执行后AH=00H
字位扩展指令例
判断以下指令执行结果:
MOV AL,44H
CBW
MOV AX,0AFDEH
CWD
MOV AL,86H
CBW
2输入输出指令
掌握:
指令的格式及操作
指令的两种寻址方式
指令对操作数的要求
专门面向I/O端口操作的指令
指令格式:
输入指令:IN acc,PORT
输出指令:
指令寻址方式
根据端口地址码的长度,指令具有两种不同的端口地址表现形式。
(1)直接寻址:端口地址为8位时,指令中直接给出8位端口地址;寻址256个端口。
(2)间接寻址:端口地址为16位时,指令中的端口地址必须由DX指定;可寻址64K个端口。
I/O指令例
IN AX,80H
MOV DX,2400H
IN AL,DX
OUT 35H,AX
OUT AX,35H
3地址传送指令
(1)取偏移地址指令LEA
操作:将变量的16位偏移地址取出送目标寄存器,当程序中用符号地址表示内存偏移地址时,须使用该指令。
格式:LEA REG,MEM
指令要求:源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。
(2)LEA指令
比较下列指令:
MOV SI,DATA1→符号地址
执行结果:SI=1234H
LEA SI,DATA1
执行结果:SI=DATA1
MOV BX,[BX]
执行结果:BX=7788H
LEA BX,[BX]
执行结果:BX=1100H
LEA指令在程序中的应用
将数据段中首地址为MEM1的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段。
4标志位操作指令
(1)LAHF,SAHF
LAHF
操作:将FLAGS的低8位装入AH
(2)PUSHF,POPF
针对FLAGS的堆栈操作指令
将标志寄存器压栈或从堆栈弹出
视频二维码(扫码观看)
二、算术运算类指令
加法运算指令
减法运算指令
乘法指令
除法指令
注意:算术运算指令的执行大多对状态标志位会产生影响
1加法指令
注意:加法指令对操作数的要求与MOV指令相同
(1)ADD指令
格式:ADD OPRD1,OPRD2
操作:OPRD1+OPRD2→OPRD1
注意:ADD指令的执行对全部6个状态标志位都产生影响。
ADD指令例
MOV AL,78H
ADD AL,99H
注意:指令执行后6个状态标志位的状态。
标志位状态:
CF=1 SF=0
AF=1 ZF=0
PF=1 0F=0
(2)ADC指令
指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样。
指令的操作:OPRD1+OPRD2+CF→OPRD1
ADC指令多用于多字节数相加,使用前要先将CF清零。
ADC指令应用例——求两个20B数的和。
(3)INC指令
格式:INC OPRD→不能是段寄存器或立即数
操作:OPRD+1→OPRD
常用于在程序中修改地址指针。
2减法指令
注意:减法指令对操作数的要求与对应的加法指令相同。
(1)SUB指令
格式:SUB OPRD1,OPRD2
操作:OPRD1-OPRD2 OPRD1
注意:对标志位的影响与ADD指令同。
(2)SBB指令
指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样。
指令的操作:OPRD1-OPRD2-CF OPRD1
(3)DEC指令
格式:DEC OPRD
操作:OPRD-1 OPRD
注意:指令对操作数的要求与INC相同,常用于在程序中修改计数值。
应用程序例
(4)NEG指令
格式:NEG OPRD→8/16位寄存器或存储器操作数
操作:0-OPRD→OPRD
用0减去操作数,相当于对该操作数求补码
(5)CMP指令
格式:CMP OPRD1,OPRD2
操作:OPRD1-OPRD2
指令执行的结果不影响目标操作数,仅影响标志位!
用途:用于比较两个数的大小,可作为条件转移指令转移的条件。
指令对操作数的要求及对标志位的影响与SUB指令相同。
两个无符号数的比较:
CMP AX,BX
若 AX>BX CF=0
若 AX<BX CF=1
两个带符号数的比较:
CMP AX,BX
两个数的大小由OF和SF共同决定:
CMP指令例
程序功能:在20个数中找最大的数,并将其存放在MAX单元中。
3乘法指令
注意点:乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX。
(1)无符号数乘法指令
格式:MUL OPRD→不能是立即数
操作:
(2)无符号数乘法指令例
MUL BYTE PTR[BX]
4除法指令
无符号除法指令
格式:DIV OPRD
有符号除法指令
格式:IDIV OPRD
除法指令的操作
若OPRD是字节数
执行:AX/OPRD
结果:AL=商 AH=余数
若OPRD是双字节数
执行:DXAX/OPRD
结果:AX=商 DX=余数
5BCD码调整指令
将指令执行的二进制运算结果调整为压缩BCD码或扩展BCD码表示的十进制数。
共6条,均为隐含寻址方式,隐含的操作数是AL或AL、AH;
不能单独使用,要紧跟在相应的算术运算指令之后。
三、逻辑运算和移位指令
指令类型:
逻辑运算
与,或,非,异或
移位操作
非循环移位,循环移位
1逻辑运算
逻辑运算指令对操作数的要求大多与MOV指令相同。
“非”运算指令要求操作数不能是立即数;
除“非”运算指令外,其余指令的执行都会使标志位OF=CF=0
(1)“与”指令
格式:AND OPRD1,OPRD2
操作:两操作数相“与”,结果送目标地址。
“与”指令的应用
实现两操作数按位相与的运算
AND BL,[SI]
使目标操作数的某些位不变,某些位清零
AND AL,0FH
在操作数不变的情况下使CF和OF清零
AND AX,AX
“与”指令应用例
(2)“或”运算指令
格式:OR OPRD1,OPRD2
操作:两操作数相“或”,结果送目标地址
“或”指令的应用
实现两操作数相“或”的运算
OR AX,[DI]
使某些位不变,某些位置“1”
OR CL,0FH
在不改变操作数的情况下使OF=CF=0
OR AX,AX
“或”指令的应用例
“或”指令的应用
如何实现将一个二进制数9变为字符‘9’?
(3)“非”运算指令
格式:NOT OPRD
操作:操作数按位取反再送回原地址。
注:指令中的操作数不能是立即数,指令的执行对标志位无影响。
例:NOT BYTE PTR[BX]
(4)“异或”运算指令
格式:XOR OPRD1,OPRD2
操作:两操作数相“异或”,结果送目标地址。
例:
XOR BL,80H
XOR AX,AX
(5)“测试”指令
格式:TEST OPRD1,OPRD2
操作:执行“与”运算,但运算的结果不送回目标地址。
应用:常用于测试某些位的状态。
2移位指令
注:移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。
(1)非循环移位指令
逻辑左移
算术左移
逻辑右移
算术右移
算术左移和逻辑左移
算术左移指令:
逻辑左移指令:
逻辑右移
格式:
逻辑右移例
MOV AL,68H
MOV CL,2
SHR AL,CL
算术右移
格式:
非循环移位指令的应用:
左移可实现乘法运算
右移可实现除法运算
(2)循环移位指令
指令格式、对操作数的要求与非循环移位指令相同。
不带进位位的循环移位:
带进位位的循环移位:
循环移位指令的应用:
用于对某些位状态的测试;
高位部分和低位部分的交换;
与非循环移位指令一起组成32位或更长字长数的移位。
程序功能:将1000H开始存放的4个压缩BCD码转换为ASCII码存放在3000H开始的单元中去。
程序例:
四、串操作指令
1串操作指令说明
针对数据块或字符串的操作;
可实现存储器到存储器的数据传送;
待操作的数据串称为源串,目标地址称为目标串。
2串操作指令的特点
源串一般存放在数据段,偏移地址由SI指定。允许段重设;
目标串必须在附加段,偏移地址由DI指定;
指令自动修改地址指针,修改方向由DF决定。
DF=0→增地址方向
DF=1→减地址方向
数据块长度值由CX指定;
可增加自动重复前缀以实现自动修改CX内容。
视频二维码(扫码观看)
3重复前缀
条件重复
串操作指令流程(以传送操作为例)
4串操作指令
串传送MOVS
串比较CMPS
串扫描SCAS
串装入LODS
串送存STOS
(1)串传送指令
格式:
MOVS OPRD1,OPRD2
MOVSB
MOVSW
串传送指令常与无条件重复前缀连用。
对比用MOV指令和MOVS指令实现将200个字节数据从内存的一个区域送到另一个区域的程序段。
串传送指令例
用串传送指令实现200个字节数据的传送:
(2)串比较指令
格式:
CMPS OPRD1,OPRD2
CMPSB
CMPSW
串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。
前缀的操作对标志位不影响。
串比较指令例
测试200个字节数据是否传送正确,如果不正确,找出第一个不相等的字符,并将其地址与不相等的字符放到BX和AL当中:
(3)串扫描指令
格式:
SCAS OPRD→目标操作数
SCASB
SCASW
执行与CMPS指令相似的操作,只是这里的源操作数是AX或AL。
串扫描指令的应用:常用于在指定存储区域中寻找某个关键字。
(4)串装入指令
格式:
LODS OPRD→源操作数
LODSB
LODSW
操作:
对字节:AL←[DS:SI]
对字:AX←[DS:SI]
串装入指令的应用:用于将内存某个区域的数据串依次装入累加器,以便显示或输出到接口。
LODS指令一般不加重复前缀。
(5)串存储指令
格式:
STOS OPRD→目标操作数
STOSB
STOSW
操作:
对字节:AL→[ES:DI]
对字:AX→[ES:DI]
串存储指令的应用:常用于将内存某个区域置同样的值
此时:
将待送存的数据放入AL(字节数)或AX(字数据);
确定操作方向(增地址/减地址)和区域大小(串长度值);
使用串存储指令+无条件重复前缀,实现数据传送。
串存储指令例:内存某个区域清零
设计思想:
五、程序控制指令
转移指令
循环控制
过程调用
中断控制
程序的执行方向
程序控制类指令的本质是:控制程序的执行方向
决定程序执行方向的因素:CS,IP
控制程序执行方向的方法:修改CS和IP,则程序转向另一个代码段执行;仅修改IP,则程序将改变当前的执行顺序,转向本代码段内其它某处执行。
1转移指令
通过修改指令的偏移地址或段地址及偏移地址实现程序的转移。
无条件转移指令:无条件转移到目标地址,执行新的指令。
有条件转移指令:在具备一定条件的情况下转移到目标地址。
(1)无条件转移指令
格式:
原则上可实现在整个内存空间的转移。
①无条件段内转移
转移的目标地址在当前代码段内,段地址不改变。
段内直接转移
转移的目标地址由指令直接给出
格式:JMP Label→近地址标号
段内直接转移示图
下一条要执行指令的偏移地址=当前IP+位移量。
段内间接转移
转移的目标地址存放在某个16位寄存器或存储器的某两个单元中。
例:
JMP BX
若:BX=1200H
则:转移的目标地址=1200H
段内间接转移例
JMP WORD PTR[BX]
设:BX=1200H
②无条件段间转移
转移的目标地址不在当前代码段内。
段间直接转移
转移的目标地址由指令直接给出
格式:
JMP FAR Label→远地址标号
段间直接转移示图
段间间接转移
转移的目标地址由指令中的32位操作数给出。
例:
JMP DWORD PTR[BX]
无条件转移指令例
MOV SI,1122H
MOV WORD PTR[SI],0120H
ADD SI,2
MOV WORD PTR[SI],0122H
视频二维码(扫码观看)
(2)条件转移指令
在满足一定条件下,程序转移到目标地址继续执行。
条件转移指令均为段内短转移,即转移范围为:-128~+127。
条件转移指令的应用:
几种条件转移指令的应用:
JC/JNC:判断CF的状态。常用于比大小;
JZ/JNZ:判断ZF的状态。常用于循环体的结束判断;
JO/JNO:判断OF的状态。常用于有符号数溢出的判断;
JP/JPE:判断PF的状态。用于判断运算结果低8位中1的个数是否为偶数;
JA/JAE/JB/JBE:判断CF或CF+ZF的状态。常用于无符号数的大小比较。
条件转移指令例
统计内存数据段中以TABLE为首地址的100个8位符号数中正数、负数和零元数的个数。
条件转移指令例(流程图)
2循环控制指令
循环范围:以当前IP为中心的-128~+127范围内循环。
循环次数由CX寄存器指定。
循环指令:
无条件循环指令
格式:LOOP LABEL
循环条件:CX≠0
操作:
3过程调用和返回
用于调用一个子过程;子过程由程序员预先设计并装入内存,子过程执行结束后要返回原调用处。
调用指令的执行过程:
保护断点;
将调用指令的下一条指令的地址(断点)压入堆栈;
获取子过程的入口地址;
子过程第1条指令的偏移地址;
执行子过程,含相应参数的保存及恢复;
恢复断点,返回原程序;
将断点偏移地址由堆栈弹出。
过程调用:
(1)段内调用
被调用程序与调用程序在同一代码段;
调用前只需保护断点的偏移地址。
格式:
执行过程:
将断点的偏移地址压入堆栈;
根据过程名找子程序入口。
段内调用例
(1)CALL TIMRE→直接调用
(2)CALL WORD PTR[SI]→间接调用
设:SI=1200H CS=6000H
执行第(2)条指令后:
CS=6000H
IP=3344H
(2)段间调用
断点保护时的压栈顺序:
先将断点的CS压栈,再压入IP。
段间调用例
格式:CALL FAR PROC
格式例:
CALL FAR TIMRE
CALL DWORD PTR[SI]
(3)返回指令
功能:从堆栈中弹出断点地址,返回原程序。
格式:RET
RET指令一般位于子程序的最后。
4中断指令
中断
中断源
中断的类型
中断指令
引起CPU产生一次中断的指令
中断与过程调用:
中断是随机事件或异常事件引起,调用则是事先已在程序中安排好;
响应中断请求不仅要保护断点地址,还要保护FLAGS内容;
调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。
(1)中断指令
格式:INT n→中断类型码n=0~255
说明:n×4→存放中断服务子程序入口地址的单元的偏移地址,该单元在数据段,段地址=DS。
中断指令的执行过程:
将FLAGS压入堆栈;
将INT指令的下一条指令的CS、IP压栈;
由n×4得到存放中断向量的地址;
将中断向量(中断服务程序入口地址)送CS和IP寄存器;转入中断服务程序。
中断指令例
执行程序段:
执行INT 21H指令后
IP=[21H×4]
CS=[(21H×4)+2]
(2)溢出中断指令
格式:
若OF=1,则启动一个类型为4的中断过程,给出一个出错标志,如果OF=0,不做任何操作。
INTO指令通常安排在有符号数加减运算指令之后。
(3)中断返回指令
格式:
IRET
六、处理器控制指令
结束语:
掌握:
指令的格式及意义;
指令对操作数的要求及对标志位的影响;
指令的应用。