微机原理及应用
主讲:谢维成
http://xweicheng.ys168.com
scxweicheng@yahoo.com.cn
第 3章 8086指令系统
? 数据传送指令
? 算术运算指令
? 逻辑运算指令
? 串操作指令
? 控制传送指令
? CPU控制指令
3.4.5 控制传送指令( P104)
? 调用 (Call)、转移 (Jump)、返回 (Return)
? 条件传送
? 重复控制
? 中断指令
3.4.5 控制传送指令( P104)
1、调用和返回指令
编程时往往将程序中常用到的具有相同功能的
部分独立出来,设计为一 个子程序(或叫过程) 。
需要时进行调用,子程序结束后,再返回原来调
用的地方。
方法的 优点 是:源程序长度缩短,有利于模块
化设计,使程序的编制、阅读和修改都比较方便。
8086/8088 CPU为实 现这 一功 能提 供下 面 两 条
指令: ◆调用指令 CALL
◆返回指令 RET
3.4.5 控制传送指令( P105)
(1)调用指令CALL
由于子程可能与主程序同在一个段内,也可能
不同在一个段内,与J MP指令类似,调用指令也分
如下四种。
①段内直接调用
例:CALL 0120H ; 调用地址由指令给出.
执行的操作为:
((SP)-1,(SP)-2)←(IP) ;IP压栈
(SP)←(SP)-2 ;修改SP
(IP)←(IP)+偏移量
3.4.5 控制传送指令
操作的第3项解释为:调用的地址(即I P值) 是
IP的当前值与指令中给定的位移量之和。给定的位
移量由汇编算出来,方法为:
例:CS:0100 MOV AL,38H 2字节
CS:0102 CALL 0120H 3字节
CS:0105
则位移量:0120-0105H=001BH
于是CALL 0120H的机器码为E8 1B 00
参考P? 段内直接调用
于是0105+001B=0120H
3.4.5 控制传送指令
②段内间接调用
例:CALL AX ;调用地址由AX给出.
CALL [SI] ;调用地址由存储器给出.
指令的操作为:
((SP)-1,(SP)-2)←(IP)
(SP)←(SP)-2
(IP)←(reg16)/(mem16)
3.4.5 控制传送指令
③段间直接调用
例:CALL 2000H:1000H
指令的操作为:
((SP)-1,(SP)-2)←(CS) ;CS压栈
(SP)←(SP)-2 ;修改SP
(CS)←段地址 ;(CS)←给定的段地址
((SP)-1,(SP)-2)←(IP) ;IP压栈
(SP)←(SP)-2 ;修改SP
(IP)←偏移地址 ;(IP)←给定的偏址
返回
3.4.5 控制传送指令
④段间间接调用
例:CALL DWORD PTR[DI] ;
调 用 地 址 在 DI,DI+1,DI+2,DI+3所 指 的 存 储 单 元
中, 前两个字节内容为偏移地址 ,后两个字节内容为
段地址.
执行的操作与上段间直接调用类似。
返回
3.4.5 控制传送指令
(2)返回指令RET
段内返回指令RET的操作为:
(IP)←((SP)+1,(SP)),(SP)←(SP)+2
段间返回指令RET的操作为:
(IP)←((SP)+1,(SP)),(SP)←(SP)+2
(CS)←((SP)+1,(SP)),(SP)←(SP)+2
为了正确返 回, RET类型必须与C ALL指令相匹配 ,
这将由伪指令来加以区别,后面第四章将予以介绍。
3.4.5 控制传送指令
RET n
另有一种带立即数返回指令:RET n
式中n为偶数。表示从栈顶弹出地址后舍掉 的 字 节 数 。
例:RET 4,返回后舍掉4个字节。
3.4.5 控制传送指令
(3)无条件转移指令JMP
本指令无条件转移到指定的目标地址,以执行从
该地址开始的程序段。由于8086/808 8 CPU的内存是
分段的,故JMP指令分成4种情况。
3.4.5 控制传送指令
①段内直接转移JMP
其直接转向的目标地址由指令 给出 ,根据给 定的 位
移量是8位还是16位分成如下两种情况:
位移量 转移范围 汇 编语言中格式
8位 ±127 JMP SHORT OPRD
16位 ±32K JMP NEAR PTR OPRD
例:JMP 0120H ;直接转向0120H
JMP SHORT LPI ;转向LPI
JMP NEAR PTR BBB ;转向BBB
这种转移只在段内,码段寄存器CS内容不变
3.4.5 控制传送指令
②段内间接转移
转移的目标地址由寄存器或存储单元的内容给出。
例: JMP SI
若指令执行前 ,(SI)=1200H
则指令执行后 ,(IP)=1200H,于是转向 1200H
3.4.5 控制传送指令
例: JMP [BX+DI]
若指令执行前 :(DS)=3000H,(BX)=1300H,
(DI)=1200H,(32500H)=2350H
则指令执行后 :(IP)=2350H
在汇编语言中 ,这种存储器寻址通常写成:
JMP WORD PTR[BX+DI]
表示所取得的目标地址是一个字有效地址。
返回
3.4.5 控制传送指令
③段间直接转移
采用这种寻址方式,指令直接 提供 了要 转移 的段
地址和偏移地址。
例:JMP 2000:1000H
执行时,(IP)←1000H,(CS)←2000H
在汇编中,则在符号地址前加操作符FAR PTR 来
表示, 例:JMP FAR PTR BBB
3.4.5 控制传送指令
④段间间接转移
将指定的存储单元中两个相邻的字内容送I P及C S。
例如: JMP DWORD PTR[SI]
设指令执行前:(DS)=4000H,(SI)=1212H,
(41212H)=1000H,(41214H)=4A00H
则指令执行后:(IP)=1000H,(CS)=4A00H,程序转
到4B000H继续执行指令。
例中DWORD PTR,在汇编语言中表示双字操作符。
JMP指令对标志位无影响。
3.4.5 控制传送指令
2、条件转移指令(P58)
在汇编语言中 ,常利用条件转移指令来实现程序
分支。
条件转移指令 以上一条指令所记录下来的标志位
或标志位的组合 作为依据来决定是否分支。
所有的条件转移指令 ,规 定 只能以本指令为中心
的 -128~ +127字节范围内转移。
这类指令不影响标志位, 分成两组来讨论。
3.4.5 控制传送指令
⑴根据单个标志位设置的条件转移指令
JB/JNAE/JC ;低于,或CF=1,则转移
JNB/JAE/JNC ;高于或等于,或CF=0,则转移
JP/JPE ;奇偶标志PF=1(偶),则转
JNP/JPO ;奇偶标志PF=0(奇),则转
JZ/JE ;结果为零(ZF=1),则转
JNZ/JNE ;结果不为零(ZF=0),则转
JS ;SF=1,则转
JNS ;SF=0,则转
JO ;OF=1,则转
JNO ; OF=0,则转
3.4.5 控制传送指令
⑵根据组合条件设置的条件转移
这类指令主要用来判断两个数的大小。
①判断无符号数的大小
JA/JNBE ; 高于则转移,条件为:CF=0,且ZF=0
如 A和B比较,A>B(不包括相等)
JNA/JBE ; 低于或等于则转移,条件为:CF=1或ZF=1
如 A和B比较,A≤B
3.4.5 控制传送指令
②判断有符号数的大小
JG/JNLE ;大于则转移(A>B)
条件为:SF ⊕ OF=0,且ZF=0
JNG/JLE ;小于或等于则转移(A≤B)
条件为:SF ⊕ OF=1,或ZF=1
JGE/JNL ;大于或等于则转移(A≥B)
条件为:SF ⊕ OF=0(或SF=OF)
JNGE/JL ;小于则转移(A<B)
条件为:SF ⊕ OF=1(或SF=OF),且ZF=0
3、重复控制(P106)
Iteration Control
这类指令用在一个循环程序的头部或尾部 ,以确
定是否要继续循环。循环次数通常置于 CX中。
这类指令的目标地址应该在控制指令中的 -128~
+127的范围之内。 循环控制指令不影响标志位。
3、重复控制(P106)
(1)LOOP指令
指令执行时,首先使(C X)-1,再判断(C X)=0?若
(CX)≠ 0,转 至 目 标 地 址 继续循环,若(C X)=0,退 出 循
环,执行下一条指令。上面讲取串指令举例时
DEC CX
JNZ LP
(2)LOOPZ/LOOPE
首先使(C X)-1,判断只有在( CX)≠ 0,且 ZF=1的
条 件 下,才转至目标地址。若(C X)=0或Z F=0,则退出
循环。
3、重复控制(P107)
(3)LOOPNZ/LOOPNE
此指令先使(C X)-1,只有在(C X)≠ 0,且Z F=0的 条 件
下,才转至目标地址。若(C X)=0,或 ZF=1,则退出循环。
(4)JCXZ ;若(CX)=0,则转移
例:设在D S:10AFH单元找到某个关键字符,要求
在显示器上显示该偏移地址(设偏移地址存于D I中)。
程序段如下:
MOV BX,DI ;已知(DI)=10AFH
MOV CH,4 ;CH做计数器
ROT: MOV CL,4
ROL BX,CL ;将最高4位移到低4位
MOV AL,BL
AND AL,0FH ;取出低4位
3、重复控制
ADD AL,30H ;化为ASCII码
CMP AL,3AH ;与3AH比较
JL BBB ;若(AL)<3A,则转
ADD AL,07H ;若(AL)≥3A,加07
BBB: MOV DL,AL ;(DL)←显示字符
MOV AH,02
INT 21H ;显示输出,参阅附录3
DEC CH ;十六进制偏址显示完否?
JNZ ROT ;没有,转回
MOV DL,48H
MOV AH,02
INT 21H ;最后显示 ’H’
4、中断指令
4、中断指令
8086/8088 CPU在程序中允许安排一条中断指令
来引起一个中断过程,这种 中断 叫内 中断 ,或 叫 软 中
断。有关中断的详细情况将在第六章讨论。
中断指令共有三条:
(1)INT n ;式中n=0~255,叫中断类型号
指令的操作步骤为:
①((SP)-1,(SP)-2)←(FLAGS), (SP)← (SP)-2
② IF← 0,TF← 0,保证不被外部I NTR打断,另进入
中断处理程序后不按单步执行
4、中断指令
③ ((SP)-1,(SP)-2)←(CS),(SP)←(SP)-2
(CS)←(n*4+2) ; (CS)←入口地址的段地址
n*4为向量地 址。 该向 量地 址中 的内 容即 为中 断服务
程序入口地址。
④ ((SP)-1,(SP)-2)←(IP),(SP)←(SP)-2
(IP)←(n*4) ; (IP)←入口地址的偏移地址
利用这种软件中断可以要求操作系统给予服务
例:INT 20H ;代表程序结束
INT n指令除IF和TF外,对其余标志位无影响。
4、中断指令
例:INT 21H ;DOS功能调用
MOV DL,32H ; ’2’的ASCII码
MOV AH,02H ;显示一个字符
INT 21H ;实现显示 ‘2’的功能
MOV AH,01H ;从键盘输入一个字符
INT 21H ;实现键入一个字符(AL中)
MOV BL,AL ;取键入字符(ASCII码)
4、中断指令
(2)溢出中断INTO
该指令检查溢出标志OF,如果OF=1, 则启动一个类型
4的中断过程,给出一个出错标志,如果O F=0,不 做 任 何
操作。
通常INTO指令安排在有符号数加减运算指令后面。
4、中断指令
(3)中断返回指令IRET
任何中断服务程序不管是外部中断引起的,还
是内部中断引起的,最后一条指令一定是IRET。
该指令执行的操作:
(IP)←((SP)+1,(SP)),(SP)←(SP)+2
(CS)←((SP)+1,(SP)),(SP)←(SP)+2
(FLAGS)←((SP)+1,(SP)),(SP)←(SP)+2
注意是后压先弹,先压后弹.
3.4.6 处理器控制指令
1、标志操作指令
用来对C PU标志寄存器中的某个标志位进行操
作。共有7条:
(1) CLC ;使CF=0
(2) STC ;使CF=1
(3) CMC ;使CF求反
(4) CLD ;使DF=0
(5) STD ;使DF=1
(6) CLI ;使IF=0,用来屏蔽可屏蔽中断
(7) STI ;使IF=1,用来开放可屏蔽中断
3.4.6 处理器控制指令
2、暂停指令HLT
执行H LT指令时,C PU进入暂停状态,设置该指令
通常是为了等待中断。
外部中断(包括I F=1时的可屏蔽中断请求 INTR
及非屏蔽中断请求NMI)或复位 信号可让CPU退出暂停
状态。
HLT不影响标志位。
3.4.6 处理器控制指令
3、空操作指令NOP
执行N OP指令不进行任何操作 ,但占用 3个 时钟
周期,然后执行下一条指令。
其它处理器控制指令就不予介绍了。
3.4.6 处理器控制指令
4、