8086指令系统---控制转移指令(二)
执行RET 4指令时,先使返回地址出栈:(IP)←000B,(SP)←0FFC+2=0FFD,然后,(SP)+4=0FFD+4=1000,结果使SP跳过了堆栈数据而回到了原始位置。本文引用地址:https://www.eepw.com.cn/article/201611/322187.htm
5 中断及中断返回指令
INT n中断指令(interrupt),n为中断类型号
IRET 中断返回指令(return from interrupt)
INTO 溢出则中断(中断类型为4)
INTn 中断指令(interrupt),n为中断类型号
执行操作:① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
(SP) ← (SP)-2,((SP)) ← (IP)
③ 转中断处理程序:(IP) ← (n×4)
(CS) ← (n×4+2)
IRET中断返回指令(return from interrupt)
执行操作:① 返回地址出栈:(IP) ← ((SP)),(SP) ← (SP)+2
(CS) ← ((SP)),(SP) ← (SP)+2
② FLAGS出栈:(FLAGS) ← ((SP)),(SP) ← (SP)+2
INTO溢出则中断(中断类型为4)
执行操作:若OF=1(有溢出),则:
① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
(SP) ← (SP)-2,((SP)) ← (IP)
③ 转中断处理程序:(IP) ← (4×4)= (10H)
(CS) ← (4×4+2)= (12H)
中断指令用于调用中断例行程序(又称中断服务程序),这是一种远调用。完成各种功能的中断例行程序都有一个编号,称为中断类型号。各种中断例行程序的入口地址按中断类型号的顺序存储在一个表中,这个表称为中断向量表。每个中断例行程序的入口地址占用4个字节,因此,它在中断向量表中的地址可用中断类型号乘4来求得。执行中断指令时,首先要入栈保存调用程序执行的现场,即当时的标志寄存器的值和断点的地址,然后,根据中断类型号(n×4)到中断向量表中取得中断例行程序的入口地址,分别送给IP和CS,以实现调用中断例行程序的功能。
中断返回指令IRET的操作和INT指令相反,即从堆栈中取出返回地址和标志位,然后返回到被中断的程序。
INTO指令隐含的中断类型号为4,因此保存断点地址和标志位后,从中断向量表的10H和12H两个字中取出中断例行程序的入口地址,从而转去运行中断例行程序。
INT指令(包括INTO)执行后,把IF和TF置0,但不影响其它标志位。
6 处理机控制指令
处理机控制指令包括一组置0或置1标志位的指令,还有一些控制处理机状态的指令。
这一组指令分别对标志位CF、DF、IF执行置0、置1或求反的操作,如,CLD指令执行的操作是:DF←0;STD执行的操作是:DF←1。
标志位处理指令只影响本指令指定的标志,而不影响其它标志位。
⑴ 标志位处理指令 ⑵ 处理机控制指令
CLC CF置0 NOP 无操作
STC CF置1 HLT 停机
CMC CF求反 WAIT 等待
CLD DF置0 ESC 转义
STD DF置1 LOCK 封锁
CLI IF置0
STI IF置1
6.2 处理机控制指令
NOP 无操作指令(no operation)
HLT 停机指令(halt)
WAIT 等待指令(wait)
ESC mem 转义指令(escape)
LOCK前缀封锁(lock)
NOP 无操作指令(no operation)
执行操作:不执行任何操作,其机器码占用1个字节单元,执行时间为3个时钟周期,因此,该指令的作用表现在时间和空间上。时间上它可使上下两条指令的执行有一点间隔,这使某些指令的执行,特别是控制硬件接口的指令因为有一点延时而增加可靠性。空间上它的位置可在调试指令时用其它指令来代替。
HLT 停机指令(halt)
执行操作:使处理机停止软件的执行并等待一次外部中断的到来,中断结束后处理机继续执行下面的程序。使用该指令的目的通常是为了保持外部硬件中断与软件系统的同步。
WAIT 等待指令(wait)
执行操作:测试微处理器的BUSY/TEST管脚,如果执行WAIT指令时,BUSY/TEST=1(指示不忙),则继续执行下一条指令。如果执行WAIT指令时,BUSY/TEST=0(指示忙),则微处理器等待直到BUSY/TEST管脚变为1。
ESC mem 转义指令(escape)
执行操作:mem指定存储单元,执行ESC指令时,从存储器取得指令或操作数通过总线送给8087~80387数值协处理器。协处理器能处理算术运算、函数运算、对数运算等数值运算,其运算速度比使用常规指令写的软件快的多。
LOCK前缀 封锁(lock)
执行操作:指令前加LOCK,使得在锁定指令期间保持锁存信号LOCK=0,以禁止外部总线上的主控制器或系统其它部件。例如,LOCK MOV AL,[SI]执行时,总线封锁直至MOV指令执行完毕。
【小结】
1、8086寻址方式
寻址方式 | 操作数地址(PA) | 指令格式举例 |
立即寻址 | 操作数在指令中给出 | MOV DX,100H ; (DX)←100H |
寄存器寻址 | 操作数在寄存器中 | ADD AX,BX ; (AX)←(AX)+(BX) |
直接寻址 | 操作数的有效地址由指令直接给出 | MOV AX,[100] ; (AX)←(100) MOV AX,VAR ; (AX)←(VAR) |
寄存器 间接寻址 | PA=(DS)×16+(BX)或(SI)或(DI) PA=(SS) ×16+(BP) | MOV AX,[BX] ; (AX)←((DS)×16+(BX)) |
寄存器 相对寻址 | PA=(DS)×16+(BX)或(SI)或(DI)+位移量 PA=(SS) ×16+(BP)+位移量 | MOV AL,MESS[SI]; (AL)←((DS)×16+(SI)+OFFSET MESS) |
基址变址 寻址 | PA=(DS)×16+(BX)+(SI)或(DI) PA=(SS) ×16+(BP) +(SI)或(DI) | MOV AX,[BX+DI]; (AX)←((DS)×16+(BX)+(DI)) |
相对基址 变址寻址 | PA=(DS)×16+(BX)+(SI)或(DI)+位移量 PA=(SS) ×16+(BP) +(SI)或(DI)+位移量 | MOV AX,BUFF(BX+DI); (AX)←((DS)×16+(BX)+(DI)+OFFSET BUFF) |
2、8086指令系统
学习一条指令时,要注意以下几个方面:
(1) 指令功能--该指令能实现何种操作,通常指令助记符就是指令功能的英文缩写词。
(2) 指令支持的寻址方式--指令中的源操作数和目的操作数字段允许采用的寻址方式。
(3) 指令对标志位的影响--该指令执行后对各个标志位的影响。
(4) 指令的特殊要求--该指令隐含使用或限定使用的寄存器以及需要预置的参数。
评论