《微机接口ppt课件第4章8086指令系统(下).ppt》由会员分享,可在线阅读,更多相关《微机接口ppt课件第4章8086指令系统(下).ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、微机原理与接口技术微机原理与接口技术作者:徐建平作者:徐建平 成贵学成贵学第第4 4章章 80868086指令系统(下)指令系统(下)【本章内容提要本章内容提要】n掌握字符串操作指令的功能与用法掌握字符串操作指令的功能与用法n掌握处理器控制类指令的功能与用法掌握处理器控制类指令的功能与用法n掌握程序控制类指令的功能与用法掌握程序控制类指令的功能与用法4.1 字符串操作指令字符串操作指令n存储器中若干个连续地址存储的字符称为存储器中若干个连续地址存储的字符称为字符串,一个字符串可能包含若干个字节字符串,一个字符串可能包含若干个字节或字。或字。n字符串操作指令用于对存储器中的字节串字符串操作指令用
2、于对存储器中的字节串或字串进行处理。或字串进行处理。n字符串操作指令可以在两组存储单元之间字符串操作指令可以在两组存储单元之间进行操作。进行操作。n源串(源操作数)一般存放在当前数据段中,即源串(源操作数)一般存放在当前数据段中,即寄存器寄存器DSDS中的内容为其段地址,寄存器中的内容为其段地址,寄存器SISI中的内中的内容为其偏移地址,因此,容为其偏移地址,因此,源串地址为源串地址为DSDS:SISI;n目的串(目的操作数)一般存放在附加数据段目的串(目的操作数)一般存放在附加数据段ESES中,即寄存器中,即寄存器ESES中的内容为其段地址,寄存器中的内容为其段地址,寄存器DIDI中的内容为
3、其偏移地址,因此,中的内容为其偏移地址,因此,目的串地址为目的串地址为ESES:DIDI。n另外,若要使用重复前缀指令时,另外,若要使用重复前缀指令时,字符串的长度字符串的长度必须存放在必须存放在CXCX寄存器中寄存器中。n每次执行字符串操作后,每次执行字符串操作后,SISI和和DIDI中的内容中的内容会自动修改,从而指向下一个字节或字。会自动修改,从而指向下一个字节或字。nSISI和和DIDI的修改方式取决于标志位的修改方式取决于标志位DFDF的值:的值:n如果如果DFDF0 0,则字符串操作由低地址向高地,则字符串操作由低地址向高地址进行,址进行,SISI和和DIDI的值自动增加;的值自动
4、增加;n如果如果DFDF1 1,则字符串操作由高地址向低地,则字符串操作由高地址向低地址进行,址进行,SISI和和DIDI的值自动减少。的值自动减少。n增减量的大小取决于操作数类型:字节操作增减量的大小取决于操作数类型:字节操作时,增减量为时,增减量为1 1;字操作时,增减量为;字操作时,增减量为2 2。n字节型和字型数据对应的指令的助记符为字节型和字型数据对应的指令的助记符为B B和和W W。4.1.1 基本串操作指令基本串操作指令 1串传送指令串传送指令n格式:格式:MOVSBMOVSB(字节串传送)(字节串传送)或或MOVSWMOVSW(字串传送)(字串传送)或或MOVS DSTMOVS
5、 DST,SRCSRCn功能:将功能:将SISI所指向的源串中的一个字节或所指向的源串中的一个字节或字传送到字传送到DIDI所指向的目的串中。所指向的目的串中。n注意:该指令对标志位无影响。注意:该指令对标志位无影响。n在执行串传送指令前,一般要预先设置在执行串传送指令前,一般要预先设置源串地址源串地址DSDS:SISI、目的串地址、目的串地址ESES:DIDI和和方向标志位方向标志位DFDF的值。的值。n方向标志位方向标志位DFDF的设置方法为:的设置方法为:CLDCLD指令可指令可将将DFDF的设置为的设置为0 0;STDSTD指令可将指令可将DFDF的值设的值设置为置为1 1。2串比较指
6、令串比较指令n格式:格式:CMPSBCMPSB(字节串比较)(字节串比较)或或CMPSWCMPSW(字串比较)(字串比较)或或CMPS DSTCMPS DST,SRCSRCn功能:将功能:将SISI所指向的源串中的一个字节或字所指向的源串中的一个字节或字与与DIDI所指向的目的串中的一个字节或字相减,所指向的目的串中的一个字节或字相减,不保存结果,只是根据结果设置标志位。不保存结果,只是根据结果设置标志位。n注意:受影响的标志位有:注意:受影响的标志位有:OFOF、SFSF、ZFZF、AFAF、PFPF和和CFCF。n在执行串比较指令前,一般要预先设置在执行串比较指令前,一般要预先设置源串地址
7、源串地址DSDS:SISI、目的串地址、目的串地址ESES:DIDI和和方向标志位方向标志位DFDF的值,方法同上。的值,方法同上。3串扫描指令串扫描指令n格式:格式:SCASBSCASB(字节串扫描)(字节串扫描)或或SCASWSCASW(字串扫描)(字串扫描)或或SCAS DSTSCAS DSTn功能:将寄存器功能:将寄存器ALAL(字节操作)或(字节操作)或AXAX(字操作)中(字操作)中的内容与的内容与DIDI所指向的目的串中的一个字节或字相减,所指向的目的串中的一个字节或字相减,不保存结果,只是根据结果设置标志位。不保存结果,只是根据结果设置标志位。n注意:受影响的标志位有:注意:受
8、影响的标志位有:OFOF、SFSF、ZFZF、AFAF、PFPF和和CFCF。n在执行串扫描指令前,一般要预先设置寄存在执行串扫描指令前,一般要预先设置寄存器器ALAL(或(或AXAX)、目的串地址)、目的串地址ESES:DIDI和方向标和方向标志位志位DFDF的值。的值。4 4串装入指令串装入指令n格式:格式:LODSBLODSB(字节串装入)(字节串装入)或或LODSWLODSW(字串装入)(字串装入)或或LODS SRCLODS SRCn功能:将功能:将SISI所指向的源串中的一个字节或字所指向的源串中的一个字节或字送入寄存器送入寄存器ALAL(字节操作)或(字节操作)或AXAX(字操作
9、)(字操作)中。中。n注意:此指令对标志位无影响。注意:此指令对标志位无影响。n在执行串装入指令前,一般要预先设置在执行串装入指令前,一般要预先设置源串地址源串地址DSDS:SISI和方向标志位和方向标志位DFDF的值。的值。此指令一般不使用重复前缀。此指令一般不使用重复前缀。5 5串存储指令串存储指令n格式:格式:STOSBSTOSB(字节存储)(字节存储)或或STOSWSTOSW(字存储)(字存储)或或STOS DSTSTOS DSTn功能:将寄存器功能:将寄存器ALAL(字节操作)或(字节操作)或AXAX(字操(字操作)中的一个字节或字存入作)中的一个字节或字存入DIDI所指向的目的所指
10、向的目的串中。串中。n注意:此指令对标志位无影响。注意:此指令对标志位无影响。n在执行串存储指令前,一般要预先设置寄在执行串存储指令前,一般要预先设置寄存器存器ALAL(或(或AXAX)、目的串地址)、目的串地址ESES:DIDI和方和方向标志位向标志位DFDF的值。的值。4.1.2 4.1.2 重复前缀指令重复前缀指令n基本串操作指令每完成一次操作后,只能对基本串操作指令每完成一次操作后,只能对字符串中的一个字节或字进行操作,字符串中的一个字节或字进行操作,n若要对一个字节串或字串进行操作,就要在若要对一个字节串或字串进行操作,就要在这些指令的前面加一个重复前缀,使该指令这些指令的前面加一个
11、重复前缀,使该指令能重复执行。能重复执行。n使用重复前缀指令前,先要将字符串的长度使用重复前缀指令前,先要将字符串的长度装入装入CXCX寄存器,每执行一次基本串操作指令寄存器,每执行一次基本串操作指令后,后,CXCX的值自动减的值自动减1 1,直到,直到CXCX0 0。1REP前缀前缀n格式:格式:REP REP 串操作指令串操作指令n功能:重复执行串操作指令,直到功能:重复执行串操作指令,直到CXCX中的值中的值为为0 0时结束操作。时结束操作。n串传送指令与串传送指令与REPREP连用,常用于从存储器到连用,常用于从存储器到存储器的字符串成块传送,可简化程序,提存储器的字符串成块传送,可简
12、化程序,提高程序运行速度。高程序运行速度。n串存储指令与串存储指令与REPREP连用,常用于对某一存储连用,常用于对某一存储区域进行初始化。区域进行初始化。2REPE/REPZ前缀前缀n格式:格式:REPE/REPZ REPE/REPZ 串比较或串扫描指令串比较或串扫描指令n功能:在执行串比较或串扫描指令时,若功能:在执行串比较或串扫描指令时,若CX0CX0且且ZFZF1 1(要比较的两个字节或字相等或(要比较的两个字节或字相等或相减为零)时重复执行串比较或串扫描指令;相减为零)时重复执行串比较或串扫描指令;否则,结束操作。否则,结束操作。3REPNE/REPNZ前缀前缀n格式:格式:REPN
13、E/REPNZ REPNE/REPNZ 串比较或串扫描指令串比较或串扫描指令n功能:在执行串比较或串扫描指令时,若功能:在执行串比较或串扫描指令时,若CX0CX0且且ZFZF0 0(要比较的两个字节或字不相(要比较的两个字节或字不相等或相减不为零)时重复执行串比较或串扫等或相减不为零)时重复执行串比较或串扫描指令;否则,结束操作。描指令;否则,结束操作。n串比较指令与串比较指令与REPE/REPZREPE/REPZ或或REPNE/REPNZREPNE/REPNZ连用,连用,常用于判断两个字符串是否相等。常用于判断两个字符串是否相等。n串扫描指令与串扫描指令与REPE/REPZREPE/REPZ
14、或或REPNE/REPNZREPNE/REPNZ连用,连用,常用于搜索字符串中是否存在某个特定的字常用于搜索字符串中是否存在某个特定的字符。符。注意:注意:n重复前缀指令不能单独使用,后面必须跟基重复前缀指令不能单独使用,后面必须跟基本串操作指令。本串操作指令。n重复前缀指令不影响标志位。重复前缀指令不影响标志位。【例例4-1】n将将1000H1000H:0200H0200H地址开始的地址开始的100100个字节传送个字节传送到到2000H:1000H2000H:1000H开始的存储单元中。程序段开始的存储单元中。程序段如下:如下:MOV AXMOV AX,1000H 1000H MOV DS
15、MOV DS,AXAX ;设置源串段地址设置源串段地址MOV AXMOV AX,2000H 2000H MOV ESMOV ES,AXAX ;设置目的串段地址设置目的串段地址MOV SIMOV SI,0200H0200H;设置源串偏移地址设置源串偏移地址MOV DIMOV DI,1000H1000H;设置目的串偏移地址设置目的串偏移地址MOV CXMOV CX,100100 ;将串的长度送入将串的长度送入CXCXCLDCLD ;将将DFDF置为置为0 0,地址自动递增,地址自动递增REP MOVSBREP MOVSB;重复执行串传送指令,每次重复执行串传送指令,每次传送一个字节传送一个字节n【
16、例例4-2】对附加段中从对附加段中从BUFF开始的开始的100个连续的内存单元进行清个连续的内存单元进行清0操作。程操作。程序段如下:序段如下:LEA DILEA DI,BUFFBUFF;将目的串的偏移地址送入将目的串的偏移地址送入DIDIMOV ALMOV AL,00H00H;将将0 0送入送入ALALMOV CXMOV CX,100100;将串的长度送入将串的长度送入CXCXCLDCLD ;将将DFDF置为置为0 0,地址自动递增,地址自动递增REP STOSBREP STOSB;重复执行串存储指令,将重复执行串存储指令,将100100 ;个连续的内存单元清个连续的内存单元清0 04.2
17、4.2 处理器控制类指令处理器控制类指令n处理器控制类指令用于对处理器控制类指令用于对CPUCPU进行控制。进行控制。4.2.1 4.2.1 标志位操作指令标志位操作指令n标志位操作指令共标志位操作指令共7 7条,用于设置标志位条,用于设置标志位CFCF、DFDF和和IFIF的值,对其他标志位无影响,如表的值,对其他标志位无影响,如表4-14-1所示。所示。4.2.2 外部同步指令外部同步指令n外部同步指令共外部同步指令共5 5条,用于控制处理器的状条,用于控制处理器的状态,它们的操作不影响标志位,如表态,它们的操作不影响标志位,如表4-24-2所所示。示。实训实训4-1 4-1 寻找字符串中
18、指定字符寻找字符串中指定字符n【算法分析算法分析】n在文章的每一段开头,一般要缩进几个空格。在文章的每一段开头,一般要缩进几个空格。现有一个以空格开头的字符串,找出其中第现有一个以空格开头的字符串,找出其中第一个非空格字符,并把其偏移地址存入指定一个非空格字符,并把其偏移地址存入指定内存单元内存单元ADDRADDR中。中。n首先,将字符串首地址送入首先,将字符串首地址送入DIDI,设置字符串,设置字符串操作方向,将字符串长度送入操作方向,将字符串长度送入CXCX,并为,并为ADDRADDR设置初值。设置初值。n重复执行传扫描指令,直到找到第一个非空重复执行传扫描指令,直到找到第一个非空格字符,
19、使格字符,使DIDI指向第一个非空格字符,并将指向第一个非空格字符,并将其偏移地址存入其偏移地址存入ADDRADDR。n若未找到非空格字符,则程序结束。若未找到非空格字符,则程序结束。【源程序】DSEG SEGMENT;DSEG SEGMENT;数据段,给变量指定数据,分配存储空间数据段,给变量指定数据,分配存储空间 STR DB This is a string!$STR DB This is a string!$;定义源字符串定义源字符串 NUM EQU$-STRNUM EQU$-STR;NUM;NUM为字符串为字符串STRSTR的长度的长度DSEG ENDSDSEG ENDSESEG S
20、EGMENT ESEG SEGMENT ;附加段附加段 DB NUM DUP(?)DB NUM DUP(?)ESEG ENDSESEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACK;堆栈段堆栈段 DB 100 DUP(?)DB 100 DUP(?)SSEG ENDSSSEG ENDSCSEG SEGMENTCSEG SEGMENT;代码段代码段ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:ESEGASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:ESEGSTART:START:MOV AX,DSEG MOV AX,DS
21、EG;将源串的段地址送入数据段寄存器将源串的段地址送入数据段寄存器MOV DS,AXMOV DS,AXLEA DI,STRLEA DI,STR;将字符串的首地址送入将字符串的首地址送入DIDICLDCLD ;设置方向标志,使设置方向标志,使DFDF0 0MOV CX,NUMMOV CX,NUM;将字符串长度将字符串长度NUMNUM送入送入CXCX MOV AL,20H MOV AL,20H;将空格字符的将空格字符的ASCIIASCII码送入码送入ALAL MOV ADDR,0FFFFH MOV ADDR,0FFFFH;将将ADDRADDR的初始值设为的初始值设为0FFFFH0FFFFHREPZ
22、 SCASB ;REPZ SCASB ;若当前字符是空格,若当前字符是空格,;则重复执行串扫描指令则重复执行串扫描指令 JZ EXITJZ EXIT ;若全部是空格,则程序转移至若全部是空格,则程序转移至EXITEXIT DEC DI DEC DI ;使使DIDI指向第一个非空格字符指向第一个非空格字符 MOV ADDR,DIMOV ADDR,DI;将第一个非空格字符的偏移地址存入将第一个非空格字符的偏移地址存入ADDRADDREXIT:MOV AH,4CH;系统功能调用,;结束程序返回DOS INT 21H CSEG ENDSEND START4.3 程序控制类指令程序控制类指令n一般情况下
23、,一般情况下,CPUCPU执行程序是按照指令的顺执行程序是按照指令的顺序逐条执行的,但实际上很多时候都需要改序逐条执行的,但实际上很多时候都需要改变程序的执行顺序,使程序直接转移到目标变程序的执行顺序,使程序直接转移到目标位置去执行,这时就要使用程序控制类指令位置去执行,这时就要使用程序控制类指令来控制程序的转向。来控制程序的转向。4.3.1 无条件转移指令无条件转移指令n无条件转移指令是指,不需要判断条件,程序直接无条件转移指令是指,不需要判断条件,程序直接跳转到目标地址处去执行。跳转到目标地址处去执行。n无条件转移指令可分为段内转移和段间转移两大类。无条件转移指令可分为段内转移和段间转移两
24、大类。n段内转移是指程序在当前代码段内进行转移,这时段内转移是指程序在当前代码段内进行转移,这时只需改变只需改变IPIP寄存器中的内容,寄存器中的内容,CSCS寄存器中的内容不寄存器中的内容不变,即可指定目标地址;变,即可指定目标地址;n段间转移是指程序由当前代码段转移到另一个代码段间转移是指程序由当前代码段转移到另一个代码段去执行,这时需要指定新的段地址和偏移地址,段去执行,这时需要指定新的段地址和偏移地址,即即CSCS寄存器和寄存器和IPIP寄存器中的内容都将改变。寄存器中的内容都将改变。1 1段内直接短转移段内直接短转移n格式:格式:JMP SHORT OPRJMP SHORT OPRn
25、功能:功能:SHORTSHORT表明程序转移的目标地址与表明程序转移的目标地址与JMPJMP指令在同一个代码段内,操作数可以是目标指令在同一个代码段内,操作数可以是目标地址的标号或指定一个地址的标号或指定一个8 8位的偏移量,转移范位的偏移量,转移范围为围为-128127-128127字节。字节。SHORTSHORT可省略。可省略。n指令执行后,指令执行后,CSCS的内容不变,的内容不变,IPIP的值(即的值(即JMPJMP指令的下一条指令)与指令的下一条指令)与8 8位偏移量之和被赋于位偏移量之和被赋于当前的当前的IPIP。【例例4-3】JMP SHORT NEXT JMP SHORT NE
26、XT L:MOV AL,12H L:MOV AL,12H NEXT:MOV CX,1234HNEXT:MOV CX,1234H n分析:分析:JMPJMP指令中的指令中的NEXTNEXT是一个段内指令标号,它代表了标是一个段内指令标号,它代表了标号号L L和和NEXTNEXT之间的偏移量,设此偏移量为之间的偏移量,设此偏移量为08H08H。n执行执行JMPJMP指令时,如果当前指令时,如果当前IPIP的内容为的内容为1000H1000H(此时(此时IPIP已指已指向标号向标号L L处),标号处),标号NEXTNEXT的偏移地址为的偏移地址为1000H1000H08H=1008H08H=1008
27、H,即即IPIP的内容更新为的内容更新为1008H1008H。2 2段内直接近转移段内直接近转移n格式:格式:JMP NEAR PTR OPRJMP NEAR PTR OPRn功能:功能:NEAR PTRNEAR PTR表明程序转移的目标地址与表明程序转移的目标地址与JMPJMP指指令在同一个代码段内,操作数可以是目标地址的标令在同一个代码段内,操作数可以是目标地址的标号或指定一个号或指定一个1616位的偏移量,转移范围为位的偏移量,转移范围为-32768327673276832767字节。字节。NEAR PTRNEAR PTR可省略。可省略。n指令执行后,指令执行后,CSCS的内容不变,的内
28、容不变,IPIP的值(即的值(即JMPJMP指令指令的下一条指令)与的下一条指令)与1616位偏移量之和被赋于当前的位偏移量之和被赋于当前的IPIP。3 3段内间接转移段内间接转移n格式:格式:JMP WORD PTR OPRJMP WORD PTR OPRn功能:程序转移的目标地址与功能:程序转移的目标地址与JMPJMP指令在同一个代指令在同一个代码段内,指令中的操作数是码段内,指令中的操作数是1616位寄存器或存储器单位寄存器或存储器单元元n段内转移的偏移地址存放在段内转移的偏移地址存放在1616位寄存器或存储器中位寄存器或存储器中连续两个字节的存储单元中。使用寄存器作为操作连续两个字节的
29、存储单元中。使用寄存器作为操作数时,数时,WORD PTRWORD PTR省略,如省略,如JMP BXJMP BX。n指令执行后,指令执行后,CSCS的内容不变,寄存器中的内容或存的内容不变,寄存器中的内容或存储器中指定地址开始的连续两个字节单元的内容被储器中指定地址开始的连续两个字节单元的内容被赋于当前的赋于当前的IPIP。4 4段间直接转移段间直接转移n格式:格式:JMP FAR PTR OPRJMP FAR PTR OPRn功能:功能:FAR PTRFAR PTR表明程序转移的目标地址与表明程序转移的目标地址与JMPJMP指令指令不在同一个代码段内不在同一个代码段内n操作数可以是目标地址
30、的标号,指令操作码后的连操作数可以是目标地址的标号,指令操作码后的连续两个字给出转移后的偏移地址(低续两个字给出转移后的偏移地址(低1616位)和段地位)和段地址(高址(高1616位)。位)。FAR PTRFAR PTR可省略。可省略。n指令执行后,段地址和偏移地址分别被赋于当前的指令执行后,段地址和偏移地址分别被赋于当前的CSCS和和IPIP,程序转移到另一个代码段中相应位置去执,程序转移到另一个代码段中相应位置去执行。行。5 5段间间接转移段间间接转移n格式:格式:JMP DWORD PTR OPRJMP DWORD PTR OPRn功能:功能:DWORD PTRDWORD PTR表明程序
31、转移的目标地址与表明程序转移的目标地址与JMPJMP指令不在同一个代码段内指令不在同一个代码段内n指令中的操作数是一个双字存储器单元,偏移地指令中的操作数是一个双字存储器单元,偏移地址和段地址分别存放在连续两个字的存储单元中。址和段地址分别存放在连续两个字的存储单元中。n指令执行后,段地址(高指令执行后,段地址(高1616位)和偏移地址(低位)和偏移地址(低1616位)分别被赋于当前的位)分别被赋于当前的CSCS和和IPIP,程序转移到另,程序转移到另一个代码段中相应位置去执行。例如:一个代码段中相应位置去执行。例如:JMP DWORD PTR BXSIJMP DWORD PTR BXSI 就
32、是实现段间间接转移的指令。就是实现段间间接转移的指令。注意:注意:n无条件转移指令对标志位无影响。无条件转移指令对标志位无影响。4.3.2 4.3.2 条件转移指令条件转移指令n条件转移指令是指,根据当前标志位的状态条件转移指令是指,根据当前标志位的状态来决定程序是否转移来决定程序是否转移n若满足指令的转移条件,则程序转移到目标若满足指令的转移条件,则程序转移到目标地址处执行;地址处执行;n若不满足条件,则继续执行下一条指令。若不满足条件,则继续执行下一条指令。注意:注意:n所有的条件转移指令都是短转移,即转移的所有的条件转移指令都是短转移,即转移的目标地址必须在当前代码段内,偏移量的范目标地
33、址必须在当前代码段内,偏移量的范围为围为128127字节。字节。n条件转移指令对标志位无影响。条件转移指令对标志位无影响。【例例4-4】n比较两个带符号数比较两个带符号数A A和和B B的大小,把大数存入的大小,把大数存入MAXMAX单元。实现这个过程的程序段如下:单元。实现这个过程的程序段如下:MOV AX,A MOV AX,A;将将A A存入存入AXAX MOV BX,B MOV BX,B;将将B B存入存入BXBX CMP AX,BX CMP AX,BX;比较比较AXAX和和BXBX的大小的大小 JG NEXTJG NEXT;AX;AX大于大于BXBX时程序转移至时程序转移至NEXTNE
34、XT MOV MAX,BX MOV MAX,BX;AX;AX小于或等于小于或等于BXBX时,时,;将将BXBX的内容送入的内容送入MAXMAX单元单元 JMP EXITJMP EXIT;程序转移至程序转移至EXITEXITNEXT:MOV MAX,AX ;AXNEXT:MOV MAX,AX ;AX大于大于BXBX时,时,;将将AXAX的内容送入的内容送入MAXMAX单元单元EXIT:EXIT:4.3.3 循环控制指令循环控制指令n循环控制指令是在循环程序中用来控制循环的。循环控制指令是在循环程序中用来控制循环的。n循环控制指令使用循环控制指令使用CXCX寄存器作为循环计数器,因此,寄存器作为循
35、环计数器,因此,在使用循环指令前,必须先将循环次数存入在使用循环指令前,必须先将循环次数存入CXCX中。中。n每执行一次循环控制指令,每执行一次循环控制指令,CXCX中的值自动减中的值自动减1 1,然,然后对循环条件进行判断。后对循环条件进行判断。n若满足条件,则程序转移至目标地址处继续循环;若满足条件,则程序转移至目标地址处继续循环;n否则,退出循环,执行下一条指令。否则,退出循环,执行下一条指令。注意:注意:n循环控制指令是短转移,即转移的目标地址循环控制指令是短转移,即转移的目标地址必须在当前代码段内,偏移量的范围为必须在当前代码段内,偏移量的范围为128128到到127127字节。字节
36、。n循环指令对标志位无影响。循环指令对标志位无影响。【例4-5】将以将以BUFFERBUFFER开始的开始的100100个内存单元都减去个内存单元都减去1 1,如果,如果某个单元减某个单元减1 1后为后为0 0则不再执行此操作。程序段如下:则不再执行此操作。程序段如下:MOV DI,0MOV DI,0 ;将将DIDI的初始值设为的初始值设为0 0 MOV CX,100 MOV CX,100;将字节数(循环次数)送入将字节数(循环次数)送入CXCXLOP:INC DILOP:INC DI;地址指针加地址指针加1 1 DEC BUFFERDI DEC BUFFERDI;将当前内存单元中的内容减将当
37、前内存单元中的内容减1 1 LOOPNZ LOP LOOPNZ LOP;结果不为结果不为0 0时执行循环时执行循环4.3.4 子程序调用子程序调用n为节省存储空间,在程序中常常要将某为节省存储空间,在程序中常常要将某些具有独立功能的程序段单独作为一个些具有独立功能的程序段单独作为一个模块,这样的程序模块称为模块,这样的程序模块称为子程序子程序。n当程序中需要这些功能时,可使用当程序中需要这些功能时,可使用子程子程序调用指令序调用指令随时调用这些子程序。随时调用这些子程序。n调用子程序的程序称为调用子程序的程序称为主程序主程序。1段内直接调用段内直接调用n格式:格式:CALL NEAR PTR
38、OPRn功能:主程序和子程序在同一个代码段功能:主程序和子程序在同一个代码段内,操作数为子程序名,指令中直接给内,操作数为子程序名,指令中直接给出要调用的子程序的入口偏移地址。出要调用的子程序的入口偏移地址。NEAR PTR可省略。可省略。【例【例4-6】n已知:已知:(CS)1000H,(IP)0100H,子,子程序程序SUM的入口地址为的入口地址为1000H:0200H,执行指令:执行指令:CALL SUM。n指令执行过程如图指令执行过程如图4-1所示。所示。2段内间接调用段内间接调用n格式:格式:CALL WORD PTR OPRn功能:主程序和子程序在同一个代码段内,功能:主程序和子程
39、序在同一个代码段内,操作数为操作数为16位寄存器或位寄存器或16位存储器单元,位存储器单元,其内容为要调用的子程序的入口偏移地址。其内容为要调用的子程序的入口偏移地址。n使用寄存器作为操作数时,使用寄存器作为操作数时,WORD PTR省省略。略。【例【例4-7】n已知:已知:(CS)1000H,(IP)0100H,(DS)2000H,(BX)0200H,(20200H)34H,(20201H)12H,n执行指令:执行指令:CALL WORD PTR BX。n指令执行过程如图指令执行过程如图4-2所示。所示。3段间直接调用段间直接调用n格式:格式:CALL FAR PTR OPRn功能:主程序和
40、子程序不在同一个代码功能:主程序和子程序不在同一个代码段内,操作数为子程序名,指令中直接段内,操作数为子程序名,指令中直接给出要调用的子程序的入口给出要调用的子程序的入口段地址段地址和和偏偏移地址移地址。【例4-8】n已知:主程序所在代码段的段地址为已知:主程序所在代码段的段地址为1000H,(IP)0100H,n子程序子程序SUM的入口地址为的入口地址为2000H:0200H,n执行指令:执行指令:CALL FAR PTR SUM。n指令执行过程如图指令执行过程如图4-3所示。所示。4段间间接调用段间间接调用n格式:格式:CALL DWORD PTR OPRn功能:主程序和子程序不在同一个代
41、码功能:主程序和子程序不在同一个代码段内,操作数为一个段内,操作数为一个32位存储器单元,位存储器单元,n其内容为要调用的子程序的入口偏移地其内容为要调用的子程序的入口偏移地址(低址(低16位)和段地址(高位)和段地址(高16位)。位)。【例【例4-9】n已知:主程序所在代码段的段地址为已知:主程序所在代码段的段地址为1000H,(IP)0100H,n(DS)2000H,(BX)0200H,n(20200H)78H,(20201H)56H,(20202H)34H,(20203H)12H,n执行指令:执行指令:CALL DWORD PTR BX。4.3.5 返回指令返回指令n子程序执行完后,通过
42、返回指令返回主子程序执行完后,通过返回指令返回主程序继续执行。程序继续执行。n返回指令一般作为子程序的最后一条指返回指令一般作为子程序的最后一条指令,其作用是将令,其作用是将CALL指令压入堆栈顶部指令压入堆栈顶部的返回地址弹出,返回到主程序中,继的返回地址弹出,返回到主程序中,继续执行续执行CALL指令的下一条指令。指令的下一条指令。n注意:该指令对标志位无影响。注意:该指令对标志位无影响。4.3.6 中断指令中断指令n中断分为内部中断和外部中断两大类。中断分为内部中断和外部中断两大类。n内部中断又称为软件中断,主要是用来处理内部中断又称为软件中断,主要是用来处理程序中的某些异常情况;程序中
43、的某些异常情况;n外部中断又称为硬件中断,主要用于处理外外部中断又称为硬件中断,主要用于处理外部设备和部设备和CPU之间的信息交换。之间的信息交换。软件中断软件中断n在程序运行过程中,中断指令用于产生软件在程序运行过程中,中断指令用于产生软件中断,调用中断服务程序或异常处理程序,中断,调用中断服务程序或异常处理程序,完成对某些特殊情况的处理。完成对某些特殊情况的处理。n8086系统中有系统中有256种中断服务程序,并用种中断服务程序,并用0255对其进行编号,称为对其进行编号,称为中断类型号中断类型号。n中断服务程序的入口地址(包括段地址和偏移中断服务程序的入口地址(包括段地址和偏移地址)称为
44、地址)称为中断向量中断向量,包含,包含4个字节。个字节。n其中,低地址的两个字节存放该入口地址的偏其中,低地址的两个字节存放该入口地址的偏移地址,高地址的两个字节存放段地址。移地址,高地址的两个字节存放段地址。n中断向量按顺序存放在中断向量按顺序存放在00000H003FFH的的内存区域中,内存区域中,n其地址可由中断类型号获得,计算方法是:中其地址可由中断类型号获得,计算方法是:中断类型号断类型号4。1中断指令中断指令n格式:格式:INT nn功能:调用中断类型号为功能:调用中断类型号为n(0255)的中断)的中断服务程序。服务程序。n执行中断时,首先将标志位寄存器的内容、执行中断时,首先将
45、标志位寄存器的内容、INT指令的下一条指令的段地址和偏移地址分指令的下一条指令的段地址和偏移地址分别压入堆栈保存,将标志位别压入堆栈保存,将标志位IF和和TF清清0,n然后根据然后根据n的值计算出中断向量的存放地址,接的值计算出中断向量的存放地址,接着从该地址处取出中断向量分别送入着从该地址处取出中断向量分别送入IP和和CS。2溢出中断指令溢出中断指令n格式:格式:INTOn功能:程序运行过程中,如果运算结果产生功能:程序运行过程中,如果运算结果产生溢出,即溢出,即OF1,则调用溢出中断处理程序。,则调用溢出中断处理程序。n此指令相当于中断类型号为此指令相当于中断类型号为4的的INT指令。指令。3中断返回指令中断返回指令n格式:格式:IRETn功能:退出中断服务程序,返回被中断的程功能:退出中断服务程序,返回被中断的程序,一般作为中断服务程序的最后一条指令。序,一般作为中断服务程序的最后一条指令。n指令执行时,将堆栈顶部保存的内容依次弹指令执行时,将堆栈顶部保存的内容依次弹出,分别送入出,分别送入IP、CS和标志位寄存器。和标志位寄存器。n注意:注意:IRET指令将影响所有标志位的值。指令将影响所有标志位的值。
限制150内