3.3.5 程序控制指令

41
1 3.3.5 3.3.5 程程程程程程 程程程程程程 程程程程程程程程程程程程程程程程程程程程 程程程程 程程程程程程 程程程程程程 程程程程程程程 程程程程程程程 程程程程 程程程程

Upload: keegan-morrow

Post on 01-Jan-2016

109 views

Category:

Documents


8 download

DESCRIPTION

3.3.5 程序控制指令. 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令. 转移指令的实质:改变 IP( 或 CS) 的内容。 所有转移指令不会影响标志位。 分为 无条件转移 和 条件转移 两种。. 1.转移指令. (1) 无条件转移指令 - JMP 本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置 CS 、 IP 的方法, JMP 指令分成 4种情况 。 ① 段内 直接转移: JMP disp 指令中给出的 8/16 位的位移量 加到 IP 。 CS 保持不变。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 3.3.5 程序控制指令

11

3.3.5 3.3.5 程序控制指令程序控制指令

控制转移指令分为:控制转移指令分为:– 转移指令转移指令– 循环控制指令循环控制指令– 调用和返回指令调用和返回指令– 中断指令中断指令

Page 2: 3.3.5 程序控制指令

22

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

1.1. 转移指令转移指令

Page 3: 3.3.5 程序控制指令

33

(1) (1) 无条件转移指令 无条件转移指令 - - JMPJMP

本指令无条件转移到指定的目标地址本指令无条件转移到指定的目标地址 ,, 以执行以执行从该地址开始的程序段。根据设置从该地址开始的程序段。根据设置 CSCS 、、 IPIP 的的方法,方法, JMPJMP 指令分成指令分成 44 种情况种情况。。 ① ① 段内段内直接转移: 直接转移: JMP dispJMP disp

指令中给出的指令中给出的 8/168/16 位的位移量位的位移量加到加到 IPIP 。。 CSCS 保持不保持不变。变。 ② ② 段内段内间接转移: 间接转移: JMP reg/memJMP reg/mem

reg/memreg/mem 中的中的 1616 位偏移地址位偏移地址送送 IPIP 。。 CSCS 保持不变保持不变。。 ③ ③ 段间段间直接转移 直接转移 JMP segment:offsetJMP segment:offset

指令中给出的指令中给出的 1616 位的段和位的段和 1616 位的偏移地址位的偏移地址送到送到 CSCS 和和IPIP 。。

④ ④ 段间段间间接转移 间接转移 JMP mem32JMP mem32

mem32mem32 中中的的 1616 位的段和位的段和 1616 位的偏移地址位的偏移地址送到送到 CSCS 和和IPIP 。。

Page 4: 3.3.5 程序控制指令

44

转移的目标地址由指令直接给出。指令中给出转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个的目标地址实际上是一个相对于相对于 IPIP 的位移量的位移量:: 位移量 转移范围 汇编语言中格式位移量 转移范围 汇编语言中格式 88 位 位 -128-128 ~~ +127+127 JMP SHORT OPRDJMP SHORT OPRD

1616 位 位 --3276832768 ~~ ++3276732767 JMP NEAR PTR OPRD JMP NEAR PTR OPRD

例:例: JMPJMP 0120H0120H ;;直接转向直接转向 01200120HH

JMPJMP SHORT LPSHORT LP ;;转向转向 LPLP

JMPJMP NEAR PTR BBBNEAR PTR BBB ;;转向转向 BBBBBB

由于是由于是段内段内转移转移 ,, 故转移后故转移后 CSCS 内容保持不变内容保持不变

① ① 段内直接转移段内直接转移

Page 5: 3.3.5 程序控制指令

55

②② 段内间接转移段内间接转移转移的目标地址由转移的目标地址由寄存器寄存器或或存储单元存储单元的内容的内容给出。给出。 例例 11 :: JMP SIJMP SI

若若 ((SI)=1200HSI)=1200H ,则指令执行后,则指令执行后 ,,((IP)=1200H,IP)=1200H, 于是转向代码段的偏移地址于是转向代码段的偏移地址1200H1200H 处开始执行。处开始执行。

注意:目标地址以段内偏移的形式给出,而不是相对于注意:目标地址以段内偏移的形式给出,而不是相对于 IPIP的位移量,所以它是一个的位移量,所以它是一个 1616 位的操作数。位的操作数。

Page 6: 3.3.5 程序控制指令

66

例例 22 :: JMP [BX+DI]JMP [BX+DI]

设指令执行前设指令执行前 :: ((DS)=3000H,(BX)=1300H,DS)=3000H,(BX)=1300H,

(DI)=1200H,(32500H)=2350H(DI)=1200H,(32500H)=2350H ; ; 则指令执行后则指令执行后 :(:(IP)=2350HIP)=2350H

在汇编语言中在汇编语言中 ,, 段内间接寻址通常写成:段内间接寻址通常写成:JMPJMP WORD PTRWORD PTR[BX+DI][BX+DI]

表示所取得的目标地址是一个字。表示所取得的目标地址是一个字。

Page 7: 3.3.5 程序控制指令

77

③③ 段间直接转移段间直接转移在指令中直接给出要转移到的目的段地址和在指令中直接给出要转移到的目的段地址和偏移地址。偏移地址。 例:例: JMPJMP 2000H:1000H2000H:1000H

执行时执行时 ,(,(IP)←1000H,(CS)←2000HIP)←1000H,(CS)←2000H

注:直接地址为符号地址时,段间直接转移注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符指令中的符号地址前应加操作符 FAR PTRFAR PTR 。。 例:例: JMP JMP FAR PTRFAR PTR far_label far_label

其中的其中的 far_labelfar_label 为远类型的标号。为远类型的标号。

Page 8: 3.3.5 程序控制指令

88

转移的目的地址转移的目的地址 (( 段和偏移段和偏移 )) 在两个相邻的在两个相邻的字字存储单元存储单元中。例如:中。例如:

JMPJMP DWORD PTR[SI]DWORD PTR[SI]

设指令执行前设指令执行前 :(:(DS)=4000H,(SI)=1212H,DS)=4000H,(SI)=1212H,

(41212H)=1000H,(41214H)=4A00H(41212H)=1000H,(41214H)=4A00H

则指令执行后则指令执行后 :(:(IP)=1000H,(CS)=4A00HIP)=1000H,(CS)=4A00H

于是转到于是转到 44B000HB000H 处开始执行指令。处开始执行指令。例中的例中的 DWORD PTRDWORD PTR 表示转移地址是一个表示转移地址是一个双字。双字。

④④ 段间间接转移段间间接转移

Page 9: 3.3.5 程序控制指令

99

40001212+)

41212

DSSI

001000

4A

41212412134121441215

1000

4A00

IP

CS

段间间接转移操作示意图

1111111111101100

JMP DWORD PTR [SI] 的机器码

DS:[SI]

Page 10: 3.3.5 程序控制指令

1010

条件转移指令可实现程序的条件分支。条件转移指令可实现程序的条件分支。条件转移指令根据标志位的状态来决定是否条件转移指令根据标志位的状态来决定是否

进行分支转移。进行分支转移。格式:格式:

JJXX XX labellabel ;; xxxx 为条件名称缩写为条件名称缩写指令的转移范围为指令的转移范围为 -128-128 ~~ +127+127 字节。字节。主要的条件转移指令参见主要的条件转移指令参见 p142p142 表表 3-73-7 。。

(2)(2) 条件转移指令 条件转移指令 - J- JXXXX

Page 11: 3.3.5 程序控制指令

1111

① ① 根据单个标志位设置的条件转移指令根据单个标志位设置的条件转移指令JB/JC JB/JC ;;低于低于 ,, 或或 CF=1CF=1,, 则转移则转移JNB/JNC/JAE JNB/JNC/JAE ;;高于或等于高于或等于 ,, 或或 CF=0CF=0,, 则转移则转移JP/JPE JP/JPE ;;奇偶标志奇偶标志 PF=1PF=1(( 偶偶 ),), 则转移则转移JNP/JPO JNP/JPO ;;奇偶标志奇偶标志 PF=0PF=0(( 奇奇 ),), 则转移则转移JZ/JE JZ/JE ;;结果为零结果为零 ((ZF=1ZF=1),), 则转移则转移JNZ/JNE JNZ/JNE ;;结果不为零结果不为零 ((ZF=0ZF=0),), 则转移则转移JS JS ;; SF=1SF=1,, 则转移则转移JNS JNS ;; SF=0SF=0,, 则转移则转移JOJO ;; OF=1OF=1,, 则转移则转移JNOJNO ;; OF=0OF=0,, 则转移则转移

Page 12: 3.3.5 程序控制指令

1212

这类指令主要用来判断两个数的大小。一般这类指令主要用来判断两个数的大小。一般指令序列为:指令序列为: CMP distCMP dist ,, src src ;比较;比较 Jxx label Jxx label ;根据比较结果转移;根据比较结果转移 判断无符号数的大小判断无符号数的大小

JA JA 高于则转移(高于则转移( distdist >> srcsrc )) 转移条件为转移条件为 : : CF=0 ZF=0∧CF=0 ZF=0∧

JNA/JBE JNA/JBE 低于或等于则转移(低于或等于则转移( distdist≤≤srcsrc )) 转移条件为转移条件为 : : CF=1 ZF=1∨CF=1 ZF=1∨

② ② 根据组合条件设置的条件转移指令根据组合条件设置的条件转移指令

Page 13: 3.3.5 程序控制指令

1313

JG JG ;;大于则转移大于则转移 ((distdist >> srcsrc))

转移条件为转移条件为 : : (SF OF=0) ZF=0⊕ ∧(SF OF=0) ZF=0⊕ ∧ JGE JGE ;;大于或等于则转移大于或等于则转移 ((distdist≥≥srcsrc))

转移条件为转移条件为 : : (SF OF=0) ZF=1⊕ ∨(SF OF=0) ZF=1⊕ ∨ JL JL ;;小于则转移小于则转移 ((distdist << srcsrc))

转移条件为转移条件为 : : (SF OF=1) ZF=0⊕ ∧(SF OF=1) ZF=0⊕ ∧ JLE JLE ;;小于或等于则转移小于或等于则转移 ((distdist≤≤srcsrc))

转移条件为转移条件为 : : (SF OF=1) ZF=1⊕ ∨(SF OF=1) ZF=1⊕ ∨

判断有符号数的大小判断有符号数的大小

Page 14: 3.3.5 程序控制指令

1414

③③ 根据根据 CXCX 内容来决定是否转移的转移指令内容来决定是否转移的转移指令 JCXZ labelJCXZ label

若若 ((CX)=0,CX)=0, 则转移到则转移到 labellabel 处开始执行。处开始执行。

Page 15: 3.3.5 程序控制指令

1515

条件转移指令举例:以十六进制数形式显示条件转移指令举例:以十六进制数形式显示 BXBX 中的内容。中的内容。MOVMOV BX, 1234HBX, 1234HMOVMOV CH, 4CH, 4 ; CH; CH 做循环计数器做循环计数器

ROT: ROT: MOVMOV CL, 4CL, 4 ; CL; CL 做移位计数器做移位计数器 ROLROL BX, CLBX, CL ; ; 将最高将最高 44 位移到低位移到低 44 位位 MOVMOV AL, BLAL, BL ANDAND AL, 0FHAL, 0FH ; ; 取出低取出低 44 位位 ADDADD AL, 30HAL, 30H ; ; 转换为转换为 ASCIIASCII 码码 CMPCMP AL, 39HAL, 39H ; ; 与 与 ’’ 9’ 9’ 比较比较 JBE JBE DISPDISP ; ; 若若 ((AL)AL)≤≤‘9’, ‘9’, 则转显示则转显示 ADDADD AL, 7AL, 7 ; ; 若若 ((AL)AL) >’>’ 9’, 9’, 再加再加 77 转转为‘为‘ A’-‘F’A’-‘F’DISP: DISP: MOVMOV DL, ALDL, AL ; (DL)←; (DL)← 字符字符 MOVMOV AH, 2AH, 2 INTINT 21H21H ; ; 显示输出显示输出 DECDEC CHCH ; 4; 4 个十六进制数显示完否个十六进制数显示完否 ?? JNZJNZ ROTROT ; ; 没有没有 , , 循环循环 MOVMOV DL, 48HDL, 48H ; ‘H’; ‘H’ MOVMOV AH, 2AH, 2 INTINT 21H21H ; ; 最后显示’最后显示’ H’H’

Page 16: 3.3.5 程序控制指令

1616

2.2. 循环控制指令循环控制指令用在循环程序中以确定是否要继续循环。用在循环程序中以确定是否要继续循环。循环次数通常置于循环次数通常置于 CXCX 中。中。转移的目标应在距离本指令转移的目标应在距离本指令 -128-128 ~~ +127+127

的范围之内。的范围之内。循环控制指令不影响标志位。循环控制指令不影响标志位。

Page 17: 3.3.5 程序控制指令

1717

(1)(1)LOOPLOOP格式:格式: LOOP LOOP labellabel

操作:操作: ((CX)-1→CXCX)-1→CX ;; 若若 ((CX)≠0,CX)≠0, 则转至则转至 labellabel 处执行处执行;; 否则退出循环否则退出循环 ,, 执行执行 LOOPLOOP 后面的指令。后面的指令。

注:注: LOOPLOOP 指令与下面的指令段等价:指令与下面的指令段等价: DEC CXDEC CX JNZ labelJNZ label

Page 18: 3.3.5 程序控制指令

1818

(2)LOOPZ (LOOPE)(2)LOOPZ (LOOPE)格式:格式: LOOPZLOOPZ labellabel

操作:操作: ((CX)-1→CXCX)-1→CX ;; 若若 (CX)≠0∧ZF=1(CX)≠0∧ZF=1,, 则转至则转至 labellabel 处执行处执行;; 否则退出循环否则退出循环 ,, 执行执行 LOOPLOOP 后面的指令。后面的指令。

(3)(3)LOOPNZ (LOOPNE)LOOPNZ (LOOPNE)格式:格式: LOOPNZ LOOPNZ labellabel

操作:操作: ((CX)-1→CXCX)-1→CX ;; 若若 ((CX)≠0∧ZF=0,CX)≠0∧ZF=0, 则转至则转至 labellabel 处执行处执行;; 否则退出循环否则退出循环 ,, 执行执行 LOOPLOOP 后面的指令。后面的指令。

Page 19: 3.3.5 程序控制指令

1919

例例 11 :给:给 1A000H1A000H 开始的开始的 256256 个内存单元均减去个内存单元均减去 11 ,,若 发现某个单元减为若 发现某个单元减为 00 则立即退出循环,其后的则立即退出循环,其后的单元不再减单元不再减 11 。程序段如下:(逻辑地址为。程序段如下:(逻辑地址为1A00:0H1A00:0H ))

MOV AX, 1A00HMOV AX, 1A00H

MOV DS, AX ; 1A00HMOV DS, AX ; 1A00H 段段 MOV DI, -1MOV DI, -1

MOV CX, 256 MOV CX, 256

GOON: INC DIGOON: INC DI

DEC BYTE PTR[DI]DEC BYTE PTR[DI]

LOOPNZLOOPNZ GOON GOON

HLT HLT

Page 20: 3.3.5 程序控制指令

2020

例例 22 :在:在 8000H8000H 开始的长度为开始的长度为 10001000 字节的字符串字节的字符串中 查找中 查找’’ SS’’ ,若找到,把其偏移地址记录在,若找到,把其偏移地址记录在ADDRADDR 中,否则中,否则 ADDRADDR 单元置为单元置为 0FFFFH0FFFFH 。。

MOV DI, 8000HMOV DI, 8000H MOV CX, 1000MOV CX, 1000 MOV AL, ’SMOV AL, ’S’’ MOV ADDR, 0FFFFH MOV ADDR, 0FFFFH GOON: SCASBGOON: SCASB LOOPNZLOOPNZ GOONGOON JNZ DONE JNZ DONE DEC DIDEC DI MOV ADDR,DIMOV ADDR,DI DONE: HLT DONE: HLT

Page 21: 3.3.5 程序控制指令

2121

3. 3. 过程调用和返回指令过程调用和返回指令过程过程 (( 子程序子程序 )) 一段具有特定功能的,供其它程序调用的公用程序。一段具有特定功能的,供其它程序调用的公用程序。特点特点

调用子程序时,调用子程序时, IP(CS)IP(CS) 的内容被压入堆栈栈顶。从子的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到程序返回时,栈顶的内容又被弹出到 IP(CS)IP(CS) 。。

子程序执行结束后一般均要返回调用程序。子程序执行结束后一般均要返回调用程序。 一次定义,多次调用;一次定义,多次调用; 可带参数调用,以完成不同的功能。可带参数调用,以完成不同的功能。

优点优点 程序代码短程序代码短 ,, 结构清晰结构清晰 ,, 便于编程、调试、修改和阅读。 便于编程、调试、修改和阅读。 两条相关指令:两条相关指令: 子程序调用指令 子程序调用指令 CALLCALL 子程序返回指令 子程序返回指令 RETRET

Page 22: 3.3.5 程序控制指令

2222

一般格式:一般格式: CALL CALL subsub ;;subsub 为子程序的入口为子程序的入口根据子程序入口的寻址方式,子程序调用有四类。根据子程序入口的寻址方式,子程序调用有四类。

①① 段内直接调用段内直接调用子程序的偏移地址直接由子程序的偏移地址直接由 CALLCALL 指令给出。 指令给出。 格式:格式: CALL CALL near_procnear_proc CALLCALL 执行时,它首先将执行时,它首先将 IPIP 内容压栈,然后把指令内容压栈,然后把指令中给出的位移量加到中给出的位移量加到 IPIP 上。上。 注:汇编以后的调用地址是相对于注:汇编以后的调用地址是相对于 CALLCALL 的下一条指令的位的下一条指令的位移量。移量。例:例: CALL 0120H ;CALL 0120H ; 子程序偏移地址由指令给子程序偏移地址由指令给出出

(1)(1) 调用指令调用指令 CALLCALL

Page 23: 3.3.5 程序控制指令

2323

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

Page 24: 3.3.5 程序控制指令

2424

子程序的偏移地址在寄存器或存储器中子程序的偏移地址在寄存器或存储器中。 。 格式:格式: CALL CALL mem16/reg16mem16/reg16

CALLCALL 执行时,它首先将执行时,它首先将 IPIP 内容压栈,然内容压栈,然后把指定的寄存器后把指定的寄存器 //存储器的内容送入存储器的内容送入 IPIP 。。

例:例: CALLCALL BX ;BX ; 子程序地址由子程序地址由 BXBX 给出给出 CALLCALL WORD PTR[SI] ;WORD PTR[SI] ; 子程序地址在存储器子程序地址在存储器中中

②② 段内间接调用段内间接调用

Page 25: 3.3.5 程序控制指令

2525

CALL

IPH IPL

代码段代码段

数据段数据段

CALL WORD PTR [SI]CALL WORD PTR [SI] 指令的指令的操作图示:假定:假定: (DS) = 8000H(DS) = 8000H ,, (SI) = 1200H(SI) = 1200H

81200H

81201H

Page 26: 3.3.5 程序控制指令

2626

子程序的段地址和偏移地址直接由子程序的段地址和偏移地址直接由 CALLCALL 指令给出。指令给出。 格式:格式: CALL CALL far_procfar_proc ;far_proc ;far_proc 为远过程的地址为远过程的地址指令的操作为:指令的操作为: CSCS 内容压栈内容压栈 IPIP 内容压栈内容压栈 CS←CS← 段地址段地址 IP←IP← 偏移地址偏移地址

例:例: CALL 2000H:1000HCALL 2000H:1000H CALL TIMER ;TIMERCALL TIMER ;TIMER 为远过程为远过程

③③ 段间直接调用段间直接调用

Page 27: 3.3.5 程序控制指令

2727

子程序的段和偏移地址为存储器的连续子程序的段和偏移地址为存储器的连续 44 个单元中的内容。个单元中的内容。 格式:格式: CALL CALL mem32mem32指令的操作为:指令的操作为: SP←(SP)-2SP←(SP)-2 ((((SP)+1,(SP))←(CS) ;CSSP)+1,(SP))←(CS) ;CS 压栈压栈 CS←CS←(mem32+2)(mem32+2)

SP←(SP)-2SP←(SP)-2 ((((SP)+1,(SP))←(IP) ;IPSP)+1,(SP))←(IP) ;IP 压栈压栈 IP←IP←(mem32)(mem32)

例:例: CALL DWORDCALL DWORD PTR[DI]PTR[DI]调用地址在调用地址在 [DI][DI] ,, [DI]+1[DI]+1 ,, [DI]+2[DI]+2 ,, [DI]+3[DI]+3四个存四个存储单元中。低字内容为偏移地址储单元中。低字内容为偏移地址 ,, 高字内容为段地址高字内容为段地址。。

④④ 段间间接调用段间间接调用

Page 28: 3.3.5 程序控制指令

2828

CALL

代码段代码段

数据段数据段

IPH IPL

CSH CSL

[DI]

[DI]+1

[DI]+2

[DI]+3

段间间接调用示意图

CALL DWORDCALL DWORD PTR[DI]PTR[DI]

Page 29: 3.3.5 程序控制指令

2929

例:下面的程序执行后,例:下面的程序执行后, (AX)=? (DX)=?(AX)=? (DX)=?

CS:2000H MOV AX, 2012HCS:2000H MOV AX, 2012H

2003H MOV CX, 200CH2003H MOV CX, 200CH

2006H PUSH CX 2006H PUSH CX

2007H CALL 4000H2007H CALL 4000H

200AH ADD AX, BX200AH ADD AX, BX

200CH ADD AX, DX200CH ADD AX, DX

200EH HLT200EH HLT

… … … …

… … … …

CS:4000H MOV BX, 200AHCS:4000H MOV BX, 200AH

POP DXPOP DX

RETRET

Page 30: 3.3.5 程序控制指令

3030

段内段内返回指令返回指令 RETRET 的操作为:的操作为: 恢复子程序执行前恢复子程序执行前 IPIP 的内容。的内容。段间段间返回指令返回指令 RETRET 的操作为:的操作为: 恢复子程序执行前恢复子程序执行前 IPIP 和和 CSCS 的内容。的内容。 另有一种带立即数的返回指令 “ 另有一种带立即数的返回指令 “ RET n RET n ”” ,其,其中中 nn 为偶数,表示从栈顶弹出地址后另外丢弃的为偶数,表示从栈顶弹出地址后另外丢弃的字节数。字节数。例:例: RET 4 ;RET 4 ; 返回后再丢弃栈顶的返回后再丢弃栈顶的 44 个字节个字节

(2)(2) 返回指令返回指令 RETRET

Page 31: 3.3.5 程序控制指令

3131

4.4. 中断指令中断指令8086/8088 8086/8088 CPUCPU 在程序中允许安排一条中在程序中允许安排一条中断指令来引起一个中断过程断指令来引起一个中断过程 ,, 这种中断叫这种中断叫内内部中断部中断 ,, 或叫或叫软中断软中断。被中断的指令地址处。被中断的指令地址处称为“断点”。有关中断的详细情况将在称为“断点”。有关中断的详细情况将在第六章讨论。第六章讨论。 中断指令共有三条:中断指令共有三条: (1)(1)INT n INT n 执行类型执行类型 nn 的中断服务程序,的中断服务程序, N=0N=0 ~~255255

(2)INTO (2)INTO 执行溢出中断的中断服务程序执行溢出中断的中断服务程序

(3)IRET (3)IRET 从中断服务程序返回调用程序从中断服务程序返回调用程序

Page 32: 3.3.5 程序控制指令

3232

(( 11 ) ) INT nINT n

格式:格式: INT nINT n

说明:说明: nn×4×4 = = 向量地址。该向量地址中的内容即为中断服务程向量地址。该向量地址中的内容即为中断服务程

序入口地址序入口地址 (( 段段 :: 偏移偏移 )) ,入口地址也称为“中断向量,入口地址也称为“中断向量””。。

0000 : n×4 XXHXXHYYHYYH

中断服务程序入口的偏移地址(IP)中断服务程序入口的段地址(CS)

中断类型码n = 0 〜 255 内存

中断向量

Page 33: 3.3.5 程序控制指令

3333

INTINT 指令的操作:指令的操作:

将将 FLAGSFLAGS 压入堆栈;压入堆栈;将将 INTINT 指令下一条指令的地址压栈(即把指令下一条指令的地址压栈(即把 CSCS 和和 IPIP的内容压栈);的内容压栈);取中断服务程序入口地址送入取中断服务程序入口地址送入 CSCS 和和 IPIP 。 。

– INTINT 指令只影响指令只影响 IFIF 和和 TFTF, , 对其余标志位无影响对其余标志位无影响– INTINT 指令可用于调用系统服务程序,如指令可用于调用系统服务程序,如 INT INT

21H21H

Page 34: 3.3.5 程序控制指令

3434

INTINT 指令的操作例:指令的操作例:

INT 21HINT 21H

IPL

IPH

CSL

CSH

SP=1200

FLAGSL

FLAGSH

SP=11FA

执行 INT 21H 指令

保护断点堆栈

执行 INT 21H 指令

Page 35: 3.3.5 程序控制指令

3535

INTINT 指令的操作例(续):指令的操作例(续):

执行执行 INT 21HINT 21H 指令后, 指令后, CS=CS= ?? IP=IP= ??

因为因为 n=21Hn=21H ,所以,所以 nn×4×4=84H=84H 。。

下图中,下图中, (0:0084H)=2000H:1123H(0:0084H)=2000H:1123H

所以: 所以: CS=2000H CS=2000H IP=1123HIP=1123H

0000:0084H 23H11H00H20H

IP

CS

0000 : 21H×4

Page 36: 3.3.5 程序控制指令

3636

INTOINTO 检查溢出标志检查溢出标志 OFOF,, 如果如果 OFOF=1,=1, 则启则启动一个类型动一个类型 44 的中断过程;如果的中断过程;如果 OFOF=0,=0, 不做不做任何操作。任何操作。

通常通常 INTOINTO 指令安排在有符号数算术运算指指令安排在有符号数算术运算指令后面。如令后面。如

IMULIMUL DXDXINTOINTO ;; 若溢出,则启动若溢出,则启动 INT 4, INT 4, 否则往下执否则往下执

行行MOVMOV RESULT,AXRESULT,AXMOVMOV RESULT+2,DXRESULT+2,DX

…… ……

(( 22 ))溢出中断溢出中断 INTOINTO

Page 37: 3.3.5 程序控制指令

3737

用于从中断服务程序返回被中断的用于从中断服务程序返回被中断的程序。程序。 IRETIRET负责恢复断点负责恢复断点 (CS(CS 和和 IP)IP) 和和恢复标志寄存器内容。恢复标志寄存器内容。任何中断服务程序不管是外部中断任何中断服务程序不管是外部中断

引起的引起的 ,,还是内部中断引起的还是内部中断引起的 ,, 最后都要最后都要用用 IRETIRET 返回。返回。 IRETIRET 指令执行的操作为:指令执行的操作为: 栈顶内容弹出到栈顶内容弹出到 IPIP 栈顶内容弹出到栈顶内容弹出到 CSCS 栈顶内容弹出到栈顶内容弹出到 FLAGFLAG

(3)(3) 中断返回指令中断返回指令 IRETIRET

Page 38: 3.3.5 程序控制指令

3838

3.3.6 3.3.6 处理器控制指令处理器控制指令11.. 标志操作指令标志操作指令 用来设置标志位的状态。用来设置标志位的状态。 (( 11 )) CFCF 设置指令设置指令 CLCCLC 0→CF0→CF STCSTC 1→CF1→CF CMCCMC CFCF 变反变反 (( 22 )) DFDF 设置指令设置指令 CLDCLD 0→DF (0→DF ( 串操作的指针移动方向从低到高串操作的指针移动方向从低到高 ))

STDSTD 1→DF (1→DF ( 串操作的指针移动方向从高到低串操作的指针移动方向从高到低 ))

(( 33 )) IFIF 设置指令设置指令CLICLI 0→IF (0→IF ( 禁止禁止 INTRINTR 中断中断 ))STISTI 1→IF (1→IF ( 开放开放 INTRINTR 中断中断 ) )

Page 39: 3.3.5 程序控制指令

3939

执行执行 HLTHLT 指令时指令时 ,,CPUCPU 进入暂停状态进入暂停状态 ,, 设设置该指令通常是为了等待中断。置该指令通常是为了等待中断。 外部中断外部中断 ((包括包括 IF=1IF=1 时的可屏蔽中断请时的可屏蔽中断请求求 INTRINTR 及非屏蔽中断请求及非屏蔽中断请求 NMI)NMI) 或复位信或复位信号可让号可让 CPUCPU 退出暂停状态。退出暂停状态。 HLTHLT 不影响标志位。不影响标志位。

2. 2. 外部同步指令外部同步指令(1)(1) 暂停指令暂停指令 HLTHLT

Page 40: 3.3.5 程序控制指令

4040

(2)(2)空操作指令空操作指令 NOPNOP

NOPNOP 指令不做任何实质性的操作指令不做任何实质性的操作 ,,但占但占用用 33 个时钟周期个时钟周期 ,,然后执行下一条指令。然后执行下一条指令。 多用于延时或预留存储空间多用于延时或预留存储空间 (( 占位子占位子 )) 。 。

Page 41: 3.3.5 程序控制指令

4141

作业:作业:

P152P1523.3, 3.6, 3.12, 3.153.3, 3.6, 3.12, 3.15