微机原理及应用 主讲:谢维成 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、