Presentation is loading. Please wait.

Presentation is loading. Please wait.

3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.

Similar presentations


Presentation on theme: "3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令."— Presentation transcript:

1 3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令

2 表4-6 控制转移类指令 类别 指令名称 指令格式 无条件转移 JMP目标标号 调用/返回 过程调用 CALL 过程名 条件转移
(无符号数) (CF/ZF) 过程返回 RET 弹出值 高于/不低于也不等于转移 JA/JNBE 目标标号 高于或等于/不低于转移 JAE/JNB 目标标号 低于/不高于也不等于转移 JB/JNAE 目标标号 低于或等于/不高于转移 JBE/JNA 目标标号

3 续表(2) 类别 指令名称 指令格式 条件转移 (CF/ZF) (有符号数) (OF/SF/ZF) 进位位为1转移 JC 目标标号
进位位为0转移 JNC 目标标号 等于/结果为0转移 JE/JZ 目标标号 不等于/结果不为0转移 JNE/JNZ 目标标号 大于/不小于也不等于转移 JG/JNLE 目标标号 大于或等于/不小于转移 JGE/JNL 目标标号 小于/不大于也不等于转移 JL/JNGE 目标标号

4 续表(3) 类别 指令名称 指令格式 条件转移 (有符号数 OF/SF/ZF) (OF/PF/SF) 小于或等于/不大于转移
JLE/JNG 目标标号 溢出转移 JO 目标标号 不溢出转移 JNO 目标标号 奇偶位为0/奇偶性为奇转移 JNP/JPO 目标标号 奇偶位为1/奇偶性为偶转移 JP/JPE 目标标号 符号标志位为0转移 JNS 目标标号 符号标志位为1转移 JS 目标标号

5 续表(4) 类别 指令名称 指令格式 循环控制 (CX/ZF) 循环 LOOP 目标标号 等于/结果为0循环 LOOPE/LOOPZ目标标号
不等于/结果不为0循环 LOOPNE/LOOPNZ目标标号 CX内容为0转移 JCXZ目标标号 中断 INT 中断类型 溢出时中断 INTO 中断返回 IRET

6 1.转移指令 转移指令的实质: 改变IP(或者CS和IP)的内容。 对标志位flags的影响: 所有转移指令不会影响标志位flags。
分类: 分为无条件转移和条件转移两种。

7 指令中给出的8/16位的位移量加到IP, CS保持不变。 ② 段内间接转移: JMP reg / mem
本指令无条件转移到指定的目标地址, 以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令可实现短\近\远距离跳转, 指令分成4种情况。 ① 段内直接转移: JMP disp 指令中给出的8/16位的位移量加到IP, CS保持不变。 ② 段内间接转移: JMP reg / mem reg/mem中的16位偏移地址送IP, CS保持不变。 ③ 段间直接转移 JMP segment : offset 指令中给出的16位的段和16位的偏移地址送到CS和IP。 ④ 段间间接转移 JMP mem32 mem32中的16位的段和16位的偏移地址送到CS和IP。

8 ① 段内直接转移 转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个相对于IP的位移量: JMP disp ;
位移量 转移范围 汇编语言中格式 8位 ~ JMP SHORT OPRD; 短距离 16位 ~ JMP NEAR PTR OPRD 或 OPRD ; 近距离 注意: disp的助记符写为新IP’, 而disp的机器码为位移量d(新IP’=原IP+位移量d) 例:JMP 0120H ;直接转向0120H(缺省为NEAR) JMP SHORT LP ;转向LP JMP NEAR PTR BBB;转向BBB 由于是段内转移,故转移后CS内容保持不变

9 无条件段内转移 转移目标地址: 直接转移: JMP Lable ┇ JMP Lable 偏移地址IP=当前IP+位移量(16位) ┇
段基地址CS不变; 偏移地址IP=当前IP+位移量(16位) 近地址标号 JMP Lable 代码段 位移量 Label CS : IP=

10 转移的目标地址由寄存器或存储单元的内容给出。 例1:JMP SI ; 近距离
②段内间接转移 转移的目标地址由寄存器或存储单元的内容给出。 例1:JMP SI ; 近距离 若(SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处开始执行。 注意:目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数。

11 无条件段内转移 间接转移: JMP BX JMP WORD PTR[BX] ┇ ┇ CS : IP ┇ ┇ JMP BX 代码段 指令码
XXH 数据段 XXH

12 例2:JMP [BX+DI] 设指令执行前: (DS)=3000H,(BX)=1300H, (DI)=1200H,(32500H)=2350H; 则指令执行后:(IP)=2350H 在汇编语言中,段内间接寻址通常写成: JMP WORD PTR[BX+DI] 表示所取得的目标地址是一个字。

13 ③段间直接转移 在指令中直接给出要转移到的目的段地址和偏移地址。 例:JMP 2000H:1000H ;远距离 执行时,(IP)←1000H,(CS)←2000H 注意:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FAR PTR。 例:JMP FAR PTR far_label ;远距离 其中的far_label为远类型的标号。

14 无条件段间转移 直接转移: JMP FAR PTR Lable ┇ ┇ CS : IP= Label ┇ JMP XXH IP XXH
代码段1 XXH IP XXH 远地址标号 XXH CS XXH 代码段2 CS : IP= Label

15 ④段间间接转移 转移的目的地址(段和偏移)在两个相邻的字存储单元中。例如: JMP DWORD PTR[SI] ; 远距离 设指令执行前:(DS)=4000H,(SI)=1212H, (41212H)=1000H,(41214H)=4A00H 则指令执行后:(IP)=1000H,(CS)=4A00H 于是转到4B000H处开始执行指令。 例中的DWORD PTR表示转移地址是一个双字。

16 无条件段间转移 间接转移: JMP DWORD PTR[BX] ┇ ┇ CS : IP ┇ [BX] ┇ 代码段1 JMP 代码段2 指令码
XXH IP XXH 数据段 XXH CS XXH

17 JMP DWORD PTR [SI]的机器码 段间间接转移操作示意图 4000 +) 1212 41212 41213 41214
DS:[SI] 4000 DS +) 1212 SI 41212 41212 41213 41214 41215 00 1000 IP 10 00 4A00 CS 4A 段间间接转移操作示意图

18 (2)条件转移指令 - JXX 条件转移指令可实现程序的条件分支。 条件转移指令根据标志位的状态来决定是 否进行分支转移。
格式:JXX label;xx为条件名称缩写 指令的转移范围为-128~+127字节(短跳转)。 主要的条件转移指令参见p142表3-7。

19 ① 根据单个标志位设置的条件转移指令 JB/JC ;低于,或CF=1, 则转移
JNB/JNC/JAE ;不低于,或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, 则转移

20 ② 根据组合条件设置的条件转移指令 这类指令主要用来判断两个数的大小。一般指令序列为: Jxx label ;根据比较结果转移
CMP dist,src ;比较 Jxx label ;根据比较结果转移 判断无符号数的大小 JA 高于则转移(dist>src) 转移条件为: CF=0∧ZF=0 JNA/JBE 低于或等于则转移(dist≤src) 转移条件为: CF=1∨ZF=1

21 判断有符号数的大小 转移条件为: (SF⊕OF=0)∧ZF=0 转移条件为: (SF⊕OF=0)∨ZF=1
JG ;大于则转移(dist>src) 转移条件为: (SF⊕OF=0)∧ZF=0 JGE ;大于或等于则转移(dist≥src) 转移条件为: (SF⊕OF=0)∨ZF=1 JL ;小于则转移(dist<src) 转移条件为: (SF⊕OF=1)∧ZF=0 JLE ;小于或等于则转移(dist≤src) 转移条件为: (SF⊕OF=1)∨ZF=1

22 ③根据CX内容来决定是否转移的转移指令 JCXZ label 若(CX)=0,则转移到label处开始执行。

23 条件转移指令举例:以十六进制数形式显示BX中的内容。
MOV BX, 1234H MOV CH, 4 ; CH做循环计数器 ROT: MOV CL, 4 ; CL做移位计数器 ROL BX, CL ; 将最高4位移到低4位 MOV AL, BL AND AL, 0FH ; 取出低4位 ADD AL, 30H ; 转换为ASCII码 CMP AL, 39H ; 与 ’9’ 比较 JBE DISP ; 若(AL)≤‘9’, 则转显示 ADD AL, 7 ; 若(AL)>’9’, 再加7转为‘A’-‘F’ DISP: MOV DL, AL ; (DL)←字符 MOV AH, 2 INT 21H ; 显示输出 DEC CH ; 4个十六进制数显示完否? JNZ ROT ; 没有, 循环 MOV DL, 48H ; ‘H’ INT 21H ; 最后显示’H’

24 2.循环控制指令 用在循环程序中以确定是否要继续循环。 循环次数通常置于CX中。
转移的目标应在距离本指令-128~+127的范围之内(短跳转)。 循环控制指令不影响标志位。

25 (1) LOOP 格式:LOOP label 类比 串前缀REP 操作:(CX)-1→CX; 若(CX)≠0,则转至label处执行;
DEC CX JNZ label

26 (2)LOOPZ (LOOPE) 类比 串前缀REPZ/E
格式:LOOPZ label 操作:(CX)-1→CX; 若(CX)≠0∧ZF=1,则转至label处执行; 否则退出循环,执行LOOP后面的指令。 (3)LOOPNZ (LOOPNE) 类比 串前缀REPNZ/NE 格式:LOOPNZ label 若(CX)≠0∧ZF=0,则转至label处执行;

27 例1:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。程序段如下:(逻辑地址为1A00:0H)
MOV AX, 1A00H MOV DS, AX ; 1A00H段 MOV DI, -1 MOV CX, 256 GOON: INC DI DEC BYTE PTR[DI] LOOPNZ GOON HLT

28 例2:在8000H开始的长度为1000字节的字符串中查找’S’,若找到,把其偏移地址记录在ADDR中,否则ADDR单元置为0FFFFH。
MOV DI, 8000H MOV CX, 1000 MOV AL, ’S’ MOV ADDR, 0FFFFH GOON: SCASB LOOPNZ GOON ; 两条可并为REPNZ SCASB JNZ DONE DEC DI MOV ADDR,DI DONE: HLT

29 3. 过程调用和返回指令 过程(子程序) 一段具有特定功能的,供其它程序调用的公用程序。 特点
调用子程序时,IP(或CS:IP)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(或CS:IP)。 子程序执行结束后一般均要返回调用程序。 一次定义,多次调用; 可带参数调用,以完成不同的功能。 优点 程序代码短,结构清晰,便于编程、调试、修改和阅读。 两条相关指令: 子程序调用指令 CALL 子程序返回指令 RET

30 调用指令CALL与转移指令JMP的比较 CALL 子程序入口地址 = JMP 子程序入口地址 + PUSH CALL的下一条指令地址
用于调用一个子过程; 调用前须保护断点地址(断点=CALL的下一条指令地址CS:IP);再跳转到子程序入口地址(子程序入口地址=子程序的第一条指令地址CS:IP’或CS’:IP’); 子过程执行结束后要返回原调用处继续执行原程序 —— 断点恢复(RET指令)。 入口地址 CALL 断点 RET

31 主程序调用子程序的执行过程: 将调用指令的下一条指令的地址(断点)压入堆栈(CALL指令);
----相当于乎 PUSH 下一条指令的地址(IP或 CS:IP) 获取子过程的入口地址(子过程第1条指令的偏移地址) (CALL指令) ; ----相当于乎 JMP入口地址(CS:IP’或CS’:IP’) 执行子过程,含相应参数的保存及恢复(其它指令); 将断点偏移地址由堆栈弹出,返回原程序(RET指令)。 ----相当于乎 POP IP或 CS:IP

32 (1)调用指令 CALL ① 段内直接调用 例:CALL 0120H ;子程序偏移地址由指令给出
一般格式:CALL sub ;sub为子程序的入口 根据子程序入口的寻址方式,子程序调用有4类。 ① 段内直接调用 子程序的偏移地址直接由CALL指令给出。 格式:CALL near_proc ;近调用 CALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上得到新IP’跳转到子程序入口地址。 注意:汇编以后的调用地址是相对于CALL的下一条指令的位移量。 例:CALL 0120H ;子程序偏移地址由指令给出

33 位移量由汇编程序在汇编时进行计算,如下例:
CS:0102 CALL 0120H ;3字节 CS: …… 则位移量为: H=001BH 于是CALL 0120H的机器码为E8 1B 00 CS:0102 E8 CS:0103 1B CALL 0120H CS: CS:0105 ……

34 CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP得到新IP’跳转。
②段内间接调用 子程序的偏移地址在寄存器或存储器中。 格式:CALL mem16/reg16 ;近调用 CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP得到新IP’跳转。 例: CALL BX ;子程序地址由BX给出 CALL WORD PTR[SI] ;子程序地址在存储器中

35 CALL WORD PTR [SI]指令的操作图示: 假定:(DS) = 8000H,(SI) = 1200H
代码段 IPH IPL 81200H 81201H 数据段

36 ③段间直接调用 例:CALL 2000H:1000H CALL TIMER ;TIMER为远过程
格式:CALL far_proc ;far_proc为远过程的地址 ;远调用 指令的操作为:  CS内容压栈  IP内容压栈  CS’←段地址  IP’←偏移地址 例:CALL 2000H:1000H CALL TIMER ;TIMER为远过程 保护断点 跳转

37 ④段间间接调用 子程序的段和偏移地址为存储器的连续4个单元中的内容。 格式:CALL mem32 ;远调用
指令的操作为:(含保护断点和跳转两步) SP←(SP)-2 ((SP)+1,(SP))←(CS) ;CS压栈 CS’←(mem32+2) ((SP)+1,(SP))←(IP) ;IP压栈 IP’←(mem32) 例:CALL DWORD PTR[DI] 调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。

38 CALL DWORD PTR[DI] CALL IPH IPL CSH CSL 段间间接调用示意图 代码段 [DI] [DI]+1
数据段 [DI]+3 CSH CSL 段间间接调用示意图

39 例:下面的程序执行后,(AX)=? (DX)=? CS:2000H MOV AX, 2012H
2003H MOV CX, 200CH(无此指令) 2006H PUSH CX 2007H CALL H 200AH ADD AX, BX 200CH ADD AX, DX 200EH HLT … … CS:4000H MOV BX, 200AH POP DX RET

40 (2)返回指令 RET 段内返回指令RET的操作为: 恢复子程序执行前IP的内容。---相当于POP IP 段间返回指令RET的操作为:
恢复子程序执行前IP和CS的内容。---相当于POP CS:IP 另有一种带立即数的返回指令 “ RET n ”,其中n为偶数,表示从栈顶弹出地址后另外丢弃的字节数。 例:RET 4 ;返回后再丢弃栈顶的4个字节

41 4.中断指令 中断的定义: CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(称为中断服务程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。 中断源分类:外部中断、内部中断 内部中断(软件中断):CPU内部执行程序(INT n或INTO)时自身产生的中断。 外部中断(硬件中断):CPU以外的设备、部件产生的中断。用于处理外设与CPU间的通信。

42 中断指令用于产生软件中断,以执行一段特殊的中断处理过程(即中断服务子程序)。
中断指令的主要作用: (1)调用操作系统(OS)提供的特殊子程序(系统功能调用) (2)实现一些特殊功能,如调试程序时单步运行、断点等。 (3)调用基本I/O系统(BIOS)提供的硬件低层服务。 8086/8088 CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫内部中断,或叫软中断。被中断的指令地址处称为“断点”。有关中断的详细情况将在第六章讨论。 中断指令共有三条: (1)INT n 执行类型n的中断服务程序,n=0~255 (2)INTO 执行溢出(OF)中断的中断服务程序,=INT 4 (3)IRET 从中断服务程序返回调用程序

43 中断INT n与过程CALL 段间间接调用:
中断是随机事件或异常事件引起,调用则是事先已在程序中安排好 ; 响应中断请求不仅要保护断点地址,还要保护FLAGS内容; 调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码n,入口地址则在向量码n指向的内存单元中。 CALL RET INT IRET

44 (1) INT n 中断类型码 n = 0〜255 格式: INT n 说明: n×4 = 中断向量地址。该向量地址中的内容即为中断服务程序入口地址(段:偏移),入口地址也称为“中断向量”。 内存 0000 : n×4 中断向量地址= XXH XXH 中断服务程序入口的偏移地址(IP) YYH 中断向量 YYH 中断服务程序入口的段地址(CS)

45 INT指令的操作: 将FLAGS压入堆栈;--相当于 PUSH FLAGS 将INT指令下一条指令的地址压栈(即把CS和IP的内容压栈); 相当于 PUSH CS:IP 取中断服务程序入口地址送入CS’和IP’。 --相当于 JMP CS’:IP’ INT指令只影响IF和TF, 对其余标志位无影响 INT指令可用于调用系统服务程序,如INT 21H

46 INT指令的操作例: INT 21H(软中断) (1)先做: 保护标志FLAGS和 保护断点地址CS:IP 保护断点 堆栈 SP=11FA
IPL IPH 执行INT 21H指令后 CSL CSH FLAGSL FLAGSH SP=1200 执行INT 21H指令前

47 (2)再做:跳转到子程序(入口地址CS’:IP’)
执行INT 21H指令后, CS=? IP=? 因为n=21H,所以n×4=84H。 下图中,(0:0084H)=2000H:1123H 所以: CS=2000H IP=1123H 0000:0084H 23H 0000 : 21H×4 11H IP 00H CS 20H

48 (2)溢出中断 INTO INTO检查溢出标志OF,如果OF=1,则启动一个类型4的中断过程;如果OF=0,不做任何操作。
格式: INTO INTO检查溢出标志OF,如果OF=1,则启动一个类型4的中断过程;如果OF=0,不做任何操作。 通常INTO指令安排在有符号数算术运算指令后面。如 IMUL DX INTO ;若溢出,则启动INT 4, 否则往下执行 MOV RESULT,AX MOV RESULT+2,DX …… 相当于 INT 4

49 (3)中断返回指令 IRET 用于从中断服务程序返回被中断的程序。IRET负责恢复断点(CS和IP)和恢复标志寄存器FLAGS内容。

50 3.3.6 处理器控制指令 表 4- 7 处理器控制类指令 类别 名称 操作码 标志位操作 (CF/DF/IF) (无TF) 进位标志置1
表 处理器控制类指令 类别 名称 操作码 标志位操作 (CF/DF/IF) (无TF) 进位标志置1 STC 进位标志复位 CLC 进位标志取反 CMC 方向标志置1 STD 方向标志复位 CLD 中断标志置1 中断标志复位 STI CLI

51 续表(2) 类别 名称 操作码 外同步 停机 HLT 等待 WAIT 交权 ESC 封锁总线 LOCK 空操作 NOP

52 3.3.6 处理器控制指令 1.标志操作指令 用来设置标志位的状态。 (1)CF设置指令 (2)DF设置指令 (3)IF设置指令
CLC 0→CF STC 1→CF CMC CF变反 (2)DF设置指令 CLD 0→DF (串操作的指针移动方向从低到高) STD 1→DF (串操作的指针移动方向从高到低) (3)IF设置指令 CLI 0→IF (禁止INTR中断) STI 1→IF (开放INTR中断)

53 2. 外部同步指令 (1) 暂停指令 HLT 执行HLT指令时,CPU进入暂停状态,设置该指令通常是为了等待中断。
这类指令都不影响Flags标志位 (1) 暂停指令 HLT 执行HLT指令时,CPU进入暂停状态,设置该指令通常是为了等待中断。 外部中断(包括IF=1时的可屏蔽中断请求INTR及非屏蔽中断请求NMI)或复位信号可让CPU退出暂停状态。 该指令常用来等待中断的产生。

54 (2)空操作指令 NOP NOP指令不做任何实质性的操作,但占用3个时钟周期,然后执行下一条指令。 它多用于:(1)程序的延时;
(2)预留存储空间(占位子)。

55 (3) 等待指令 WAIT CPU每隔5个时钟周期就要检查一次 ,WAIT指令可以使CPU进入等待状态,等待状态期间( 变为无效)CPU可被中断。当它为有效时, CPU会停止执行WAIT,退出等待状态。 WAIT主要用于: (1)CPU (8086)与协处理器(8087/8089)和外部设备 的同步; (2)也可用来等待被允许的外部中断的到来,但中断 任务执行完后仍返回WAIT指令,继续等待。

56 (4) 换码或协处理器指令 ESC ESC指令主处理器可向协处理器提供一条可执行的指令及相应的操作数。 当执行ESC指令时,协处理器监视系统总线, 并可取得操作码。由于8087协处理器无寻址能力,当取得操作需要存储器访问时,8086主处理器将指定存储单元的内容送到数据总线上,否则不需要8086做任何事情。 指令一般格式: ESC OPRD OPRD为存储器操作数。指令执行时,把一个指定的存储单元的内容送到DB上,由协处理器获取后,完成相应的操作。

57 (5) 封锁指令 LOCK LOCK是一个可用在有关指令前面的前缀,使用了这个指令前缀的指令,可在指令执行期间封锁局部总线,以保证在多处理器及多任务下的数据安全。  LOCK指令前缀可使CPU的LOCK 引脚产生一个有效电平,以实现总线封锁,此过程一直持续到该指令执行结束。

58 作业: P152 3.2~3.7, 3.10~3.12, 3.15~3.16


Download ppt "3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令."

Similar presentations


Ads by Google