lec10 转移控制类指令(2)_第1页
lec10 转移控制类指令(2)_第2页
lec10 转移控制类指令(2)_第3页
lec10 转移控制类指令(2)_第4页
lec10 转移控制类指令(2)_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第 10 讲讲 转移控制类指令(转移控制类指令(2)循环指令循环指令&子程序指令子程序指令&中断指令中断指令 控制转移指令:控制转移指令: 无条件转移指令无条件转移指令 JMP 条件转移指令条件转移指令JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、JLE / JNLE、 JCXZ 循环指令循环指令 LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE 子程序调用和返回指令子程序调用和返回指令 CALL、RET 中断与中断返回指令中断与中断返回指令

2、 INT、IRET1. 循环指令:循环指令:注意:注意:* CX 中存放循环次数中存放循环次数* 只能使用段内直接寻址的只能使用段内直接寻址的8 位位移量位位移量LOOPLOOPZ / LOOPELOOPNZ / LOOPNE 执行步骤:执行步骤: (1) (CX) (CX) - 1 (2) 检查是否满足测试条件,如满足则检查是否满足测试条件,如满足则 (IP) (IP) + 8位位移量,实行循环;位位移量,实行循环; 不满足则不满足则 退出循环,顺序执行。退出循环,顺序执行。循环指令:循环指令:LOOP OPR测试条件测试条件:(CX) 0为零或相等时循环指令:为零或相等时循环指令:LOOP

3、Z(LOOPE) OPR测试条件测试条件:ZF=1 且且 (CX) 0不为零或不相等时循环指令:不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR测试条件测试条件:ZF=0 且且 (CX) 0LOOP AGAIN DEC CX JNZ AGAIN如果将上面的程序写成如下的情形:如果将上面的程序写成如下的情形:L1: MOVCX, 10 . ; 重复执行的若干条指令重复执行的若干条指令 LOOPL1这个程序将无限制地运行下去,称为这个程序将无限制地运行下去,称为“死循环死循环”。 MOVCX, 10L1: . ; 需要重复执行的若干条指令需要重复执行的若干条指令 LOOPL1上面的程

4、序将上面的程序将L1到到LOOP指令之间的一段程序重复执行指令之间的一段程序重复执行10次。指令次。指令“MOV CX, 10”称为称为“装载循环计数器装载循环计数器”, 在循环之前完成。在循环之前完成。【例例 2-31】编程计算编程计算1+2+3+100=? 结果保存到字变量结果保存到字变量SUM中。中。XOR AX,AX XOR AX,AX ; ;累加器清零累加器清零 MOV BX,0001H MOV BX,0001H ;BX1;BX1 MOV CX,100 MOV CX,100 ;CX;CX循环次数循环次数100100AGAIN:AGAIN:ADD AX,BX ADD AX,BX ;AX

5、(AX)+(BX);AX(AX)+(BX) INC BXINC BX ;BX(BX)+1;BX(BX)+1 LOOP AGAINLOOP AGAIN ; ;未循环结束,则继续未循环结束,则继续 MOV SUM,AX MOV SUM,AX ; ;循环结束,保存结果循环结束,保存结果(1)循环准备阶段循环准备阶段:累加器、计数器、指针赋初值,在循环开始:累加器、计数器、指针赋初值,在循环开始之前,每条指令只执行一次;之前,每条指令只执行一次;(2)循环阶段循环阶段:包括数据累加、修改指针、循环计数和控制三项:包括数据累加、修改指针、循环计数和控制三项操作。每条指令重复执行操作。每条指令重复执行CX

6、次。这部分的程序称为次。这部分的程序称为“循环体循环体”。(3)循环结束处理阶段循环结束处理阶段:保存数据的累加和。这条指令在循环结:保存数据的累加和。这条指令在循环结束后执行,只执行一次。束后执行,只执行一次。程序的主体部分分为三段:程序的主体部分分为三段:循环总结循环总结【例例 2 32】 数据段中分别以数据段中分别以STRING1 和和STRING2为首地址存放着为首地址存放着100 个字符,个字符,比较两字符串,找出其中第一个不相同的字符分别送至比较两字符串,找出其中第一个不相同的字符分别送至AL和和BL寄存器,若两串寄存器,若两串完全相同,则令完全相同,则令AL=BL=0。LEA S

7、I,STRING1 ;SI字符串字符串STRING1首地址首地址 LEA DI,STRING2 ;DI字符串字符串STRING2首地址首地址 MOV CX,100 ;CX循环次数循环次数 CYCLE: MOV AL,SI ;AL串串1 中的字符中的字符 MOV BL,DI ;BL串串2 中的字符中的字符 INC SI ;SI(SI)+1 INC DI ;DI(DI)+1 CMP AL,BL ;(AL)(BL) LOOPE CYCLE ;若若(CX)0,且,且ZF=1,则转向,则转向CYCLE JNZ DONE ;若相应两个单元的内容不等,则转向若相应两个单元的内容不等,则转向DONE MOV

8、AL,0 ;若两串完全相同,则若两串完全相同,则AL0 MOV BL,0 ;若两串完全相同,则若两串完全相同,则BL0 DONE: . n程序使用程序使用LOOPE指令来控制循环,既有计数(指令来控制循环,既有计数(CX)控制,又有条件()控制,又有条件(ZF)控制。循环结束有两种可)控制。循环结束有两种可能性:能性:q字符串比较找出了第一个不相同的字符:循环结束时字符串比较找出了第一个不相同的字符:循环结束时ZF=0,AL和和BL寄存器内是第一个不相同的字符;寄存器内是第一个不相同的字符;q比较字符串没有找到不相同的字符:循环结束时比较字符串没有找到不相同的字符:循环结束时ZF=1。n对于对

9、于LOOPZ/LOOPE,LOOPNZ/LOOPNE控制的控制的循环,一般应在循环结束后用条件转移指令分开这循环,一般应在循环结束后用条件转移指令分开这两种情况,分别处理。两种情况,分别处理。 子程序结构程序的优点子程序结构程序的优点:1.1.每个子程序就是一个具有特定功能的独立的程序,每个子程序就是一个具有特定功能的独立的程序,提高程提高程序的序的“可重用性可重用性”,提高了软件开发效率。,提高了软件开发效率。2.2.每个子程序可以独立地进行调试,由于子程序规模较小,每个子程序可以独立地进行调试,由于子程序规模较小,降低了调试难度。降低了调试难度。3.3.程序结构清晰,程序结构清晰,提高了程

10、序的可阅读性和可维护性提高了程序的可阅读性和可维护性。2. 子程序调用与返回指令子程序调用与返回指令n子程序是完成特定功能的一段程序子程序是完成特定功能的一段程序n当主程序(调用程序)需要执行这个功能时,采用当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行调用指令转移到该子程序的起始处执行n当运行完子程序功能后,采用当运行完子程序功能后,采用RET返回指令回到主返回指令回到主程序继续执行程序继续执行演示演示 转移指令转移指令有去无回有去无回 子程序子程序调用需要返回调用需要返回,其中利用堆栈保存返回地址其中利用堆栈保存返回地址主程序与子程序主程序与子程序C

11、ALL labelMOV AX,0主程序主程序RET子程序子程序回到回到CALL指令后的指令指令后的指令处处返回地址返回地址子程序定义子程序定义n子程序定义伪操作子程序定义伪操作 子程序名子程序名 PROC 属属 性性 ; 子程序体子程序体子程序子程序名名 ENDPn子程序名:子程序名: 子程序入口的符号地址。子程序名应为合法的子程序入口的符号地址。子程序名应为合法的标识符,标识符,子程序名不能与同一个源程序中的标号、变量名、子程序名不能与同一个源程序中的标号、变量名、其它子程序名相同其它子程序名相同。n属属 性:类型性:类型 属属 性(性(NEAR、FAR)qNEAR: 调用程序和子程序在调

12、用程序和子程序在同一个代码段同一个代码段中(段内调用),缺省中(段内调用),缺省为为NEAR属性,可以省略。属性,可以省略。qFAR:调用程序和子程序:调用程序和子程序不在同一个代码段不在同一个代码段中(段间调用)中(段间调用)n只能被同一个代码段里的程序调用只能被同一个代码段里的程序调用的子程序。的子程序。n由于主程序和子程序处于同一个代码段,调用和返回时由于主程序和子程序处于同一个代码段,调用和返回时只只需要改变需要改变IPIP寄存器的值寄存器的值,CSCS寄存器的值保持不变。寄存器的值保持不变。n近程子程序的近程子程序的入口地址用入口地址用1616位段内偏移地址表示位段内偏移地址表示。

13、近程子程序(属性为近程子程序(属性为NEAR 型)型)远程子程序远程子程序: (属性为(属性为FAR 型)型)n能够被不同代码段的程序调用能够被不同代码段的程序调用,也能被同一代码段的程序也能被同一代码段的程序调用的子程序调用的子程序。n调用这样的子程序时,调用这样的子程序时,需要同时改变需要同时改变CSCS和和IPIP寄存器的值寄存器的值,返回时,需要从堆栈里弹出返回时,需要从堆栈里弹出3232位的返回地址送入位的返回地址送入IPIP,CSCS寄寄存器。存器。n远程子程序的入口地址远程子程序的入口地址用用1616位段基址和位段基址和1616位段内偏移地址位段内偏移地址表示表示。子程序调用和返

14、回指令:子程序调用和返回指令:code1 segmentcode1 segmentmain proc main proc farfar callcall far ptr subp far ptr subp ret retmain endpmain endpcode1 endscode1 endscode2 segmentcode2 segmentsubp proc subp proc farfar retretsubp endpsubp endpcode2 endscode2 ends 段间调用和返回段间调用和返回code segmentcode segmentmain proc main p

15、roc farfar call call subp subp ret retmain endpmain endpsubp proc subp proc nearnear retretsubp endpsubp endpcode endscode ends 段内调用和返回段内调用和返回(1)段内调用与返回)段内调用与返回n段内直接调用段内直接调用qCALL 符号地址(子程序名)符号地址(子程序名);NEAR属性属性n(SP) (SP)- 2 ;入栈保护返回地址入栈保护返回地址n(SS:SP) (IP)n(IP) 符号地址的偏址符号地址的偏址 ;转到子程序去执行转到子程序去执行n段内返回段内返回q

16、RET;按按NEAR属性返回属性返回n(IP) (SS:SP);从堆栈中取出返回地址从堆栈中取出返回地址n(SP) (SP)+ 2段内调用与返回举例段内调用与返回举例code SEGMENT 、 、 CALL subp 2000:200H 、 、 、 、 subp PROC NEAR2000:300H 、 、 、 RET subp ENDP code ENDS A450调用后调用后 (IP)=300H1000:1006SS:SP 返回后返回后 (IP)=200H1000:1006SS:SP 0002A4501000:1004SS:SP 1000:1004SS:SP 0002(2)段间调用与返回

17、)段间调用与返回n段间调用段间调用qCALL 符号地址(过程名)符号地址(过程名) ;FAR属属 性性n(SP) (SP)- 2 ;先保存段地址先保存段地址n(SS:SP) (CS) n(SP) (SP)- 2 ;后保存偏移地址后保存偏移地址n(SS:SP) (IP) n(IP) 符号地址的偏址符号地址的偏址n(CS) 符号地址的段址符号地址的段址 注意压栈的顺序,先段后偏移注意压栈的顺序,先段后偏移(2)段间调用与返回(续)段间调用与返回(续)n段间返回段间返回qRET ;按按FAR属属 性返回性返回q (IP) (SS:SP);先取出偏移地址先取出偏移地址q (SP) (SP)+ 2q (

18、CS) (SS:SP) ;后取出段地址后取出段地址q (SP) (SP)+ 2调用后调用后 (IP)=200H (CS)=3000H1000:1006SS:SP A450 返回后返回后 (IP)=100H, (CS)=2000H1000:1006SS:SP 1000:1002SS:SP 00010020A450 code1 SEGMENT 、 、 CALL far ptr subp 2000:100H 、 、 code1 ENDS code2 SEGMENT 、 subp PROC FAR3000:200H 、 、 、 RET subp ENDP code2 ENDS 1000:1002SS:

19、SP 00010020段间调用与返回举例段间调用与返回举例ZEROBYTESPROC; 定义一个子程序定义一个子程序PUSH AXPUSH CXXORAX, AX; AX清零清零MOVCX, 128; 循环次数送循环次数送CXZEROLOOP:MOV BX, AX; 将一个字存储单元清零将一个字存储单元清零ADDBX, 2; 修改地址修改地址LOOP ZEROLOOP; 循环控制循环控制POP CXPOP AXRET; 返回主程序返回主程序ZEROBYTESENDP; 子程序结束子程序结束 思考思考:该子程序完成了什么功能?调用该子程序时,:该子程序完成了什么功能?调用该子程序时, 应该先做什

20、么准备工作?应该先做什么准备工作?子程序定义举例子程序定义举例简写形式简写形式ZEROBYTES:PUSH AXPUSH CXXOR AX, AX; AX寄存器清零寄存器清零MOVCX, 128 ; 计数器计数器CX置初值置初值ZEROLOOP:MOVBX, AX; 一个字单元清零一个字单元清零ADDBX, 2 ; 修改地址指针,指向下一个字修改地址指针,指向下一个字LOOPZEROLOOP; 循环控制循环控制POP CXPOP AXRET ; 结束程序运行,返回主程序结束程序运行,返回主程序 缺点:边界不容易清晰地区分;只能定义缺点:边界不容易清晰地区分;只能定义“近程子程序近程子程序”;

21、只能被同一代码段内的程序调用只能被同一代码段内的程序调用 。子程序名子程序名PROCNEAR/FARPUSH; 保护现场(寄存器保护现场(寄存器/存储器)存储器)PUSH; 个数根据具体情况决定个数根据具体情况决定;子程序主体;子程序主体POP ;恢复现场,注意出栈次序;恢复现场,注意出栈次序POP ; 先进栈的寄存器后出栈先进栈的寄存器后出栈RET;返回;返回子程序名子程序名ENDP子程序的基本格式子程序的基本格式3. 中断指令和系统功能调用中断指令和系统功能调用n中断(中断(Interrupt)是又一种改变程序执行顺序的方法)是又一种改变程序执行顺序的方法n8086/8088 CPU支持支

22、持256个中断,每个中断用一个编号(中个中断,每个中断用一个编号(中断向量号)区别断向量号)区别n中断指令有中断指令有3条:条:INT IRET INTOn要求掌握中断调用指令要求掌握中断调用指令INT ,进而掌握,进而掌握系统功能调用系统功能调用 类型类型0的的(IP) 类型类型0的的(CS) 类型类型1的的(IP) 类型类型1的的(CS) 类型类型N的的(IP) 类型类型N的的(CS) 类型类型255的的(IP) 类型类型255的的(CS)0000000004 4*N003FC中断向量表中断向量表中断向量:中断向量:中断服务程序的入口地址,中断服务程序的入口地址,存放于中断向量表区。存放于

23、中断向量表区。 中断指令:中断指令: INT TYPE执行操作:执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (FLAGS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (TYPE*4) (CS) (TYPE*4+2) 注意:注意: * TYPE (0255) 是中断类型号。是中断类型号。根据根据TYPE ,在中断向量表中找到它所,在中断向量表中找到它所对应的中断向量,即得到所要执行的程序段的段基地址:段偏移地址对应的中断向量,即得到所要执行的程序段的段基地址:段

24、偏移地址* INT 指令还把指令还把 IF 和和 TF 置置0,但不影响其它标志位,但不影响其它标志位 中断返回指令:中断返回指令:IRET执行操作:执行操作: (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2 (CS) ( (SP)+1,(SP) ) (SP) (SP) + 2 (FLAGS) ( (SP)+1,(SP) ) (SP) (SP) + 2 注意:注意:* IRET 指令执行完,标志位由堆栈中取出的值确定指令执行完,标志位由堆栈中取出的值确定4. 处理器控制类指令处理器控制类指令 标志处理指令标志处理指令 CLC、 STC、 CMC、 CLD、STD、 CLI

25、、STI 处理器控制指令处理器控制指令 NOP、HLT标志处理指令:标志处理指令: CLC ;CF 0 CMC ;CF CF STC ;CF 1 CLD ;DF 0 STD ;DF 1 CLI ;IF 0 STI ;IF 1注意注意: * 只影响本指令指定的标志只影响本指令指定的标志处理器控制指令:处理器控制指令: NOP 无操作无操作 ( (机器码占一个字节机器码占一个字节) )HLT 暂停暂停 ( (等待一次外中断,之后继续执行程序等待一次外中断,之后继续执行程序) )注意注意: * 不影响条件标志不影响条件标志 5. 基本基本I/O功能调用功能调用nDOS系统功能调用系统功能调用qDOS

26、利用利用21H号中断号中断提供给用户近百个系统功能,主要包括设提供给用户近百个系统功能,主要包括设备管理、目录管理和文件管理三个方面的功能备管理、目录管理和文件管理三个方面的功能nROM-BIOS系统功能调用系统功能调用qROM-BIOSROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入也以中断服务程序的形式,向程序员提供系统的基本输入输出程序输出程序qROM-BIOSROM-BIOS功能更加基本,且与操作系统无关功能更加基本,且与操作系统无关q当当DOSDOS没有启动或不允许使用没有启动或不允许使用DOSDOS功能调用时,可以使用功能调用时,可以使用ROM-BIOSROM-B

27、IOS功功能调用能调用 BIOS和和DOS基本调用基本调用调用方法:调用方法:1. 将将调用参数调用参数装入装入指定的指定的寄存器中;寄存器中;2. BIOS或或DOS功能号功能号装入装入AH;3. 如需如需子功能号子功能号,把它装入,把它装入AL;4. 按中断号按中断号调用调用DOS或或BIOS中断中断(INT);5. 检查或取得检查或取得返回参数返回参数。子程序调用子程序调用 主程序主程序 CALL SUBP 子程序子程序 RETDOS/BIOS调用调用 源程序源程序 INT n DOS/BIOS 例行程序例行程序 IRETDOS常用输出功能调用常用输出功能调用( AH 功功 能能 调调

28、用用 参参 数数 2 显示一个字符显示一个字符(检验检验Ctrl-Break) DL = 字符字符ASCII码码 光标跟随字符移动光标跟随字符移动 9 显示字符串显示字符串 DS:DX=串地址串地址,光标跟随串移动,光标跟随串移动 功功 能能 调用参数调用参数 返回参数返回参数 从键盘输入一个字符并回显在屏幕上从键盘输入一个字符并回显在屏幕上 AL=字符字符ASCII码码DOS常用输入功能调用常用输入功能调用(例例:下面的程序在显示器上输出数字字符:下面的程序在显示器上输出数字字符“9”:MOVAH, 2;功能号;功能号02HMOVDL, 39H;字符;字符“9”的的ASCII代码代码INT2

29、1H;调用;调用21H号系统服务程序号系统服务程序 字符字符“9”显示在显示在光标光标(Cursor)位置,光标向右移动一个字符位置。位置,光标向右移动一个字符位置。 DL 待输出字符的待输出字符的ASCII代码代码 AH 02H INT 21HX为为DB定义的一个变量,下面的程序能够输出定义的一个变量,下面的程序能够输出X的值吗?的值吗? MOVAH, 2;功能号;功能号02H装入装入AH寄存器寄存器MOVDL, X;变量;变量X的值装入的值装入DL寄存器寄存器INT21H;调用;调用21H号系统服务程序号系统服务程序(1)输出单个字符显示)输出单个字符显示CODESEGMENTASSUME

30、 CS: CODESTART:LEABX, STRINGMOVCX, 7ONE:MOVDL, CS: BX;取出一个字符的;取出一个字符的ASCII代码代码MOVAH, 2;单个字符输出的功能号;单个字符输出的功能号INT21H;调用系统服务,输出一个字符;调用系统服务,输出一个字符INCBX;修改指针;修改指针LOOP ONE;计数与循环控制;计数与循环控制MOVAX, 4C00HINT21HSTRINGDB“Hello !”CODEENDSENDSTART例例 在显示器上输出文字在显示器上输出文字“Hello !” STRING在代码段里定义,取字符需要增加在代码段里定义,取字符需要增加段跨越前缀段跨越前缀“CS: BX”,否则会到,否则会到“DS: BX”处取字符,输出不确定的内容。处取字符,输出不确定的内容。 代码为代码为0DH的字符称为的字符称为“回车回车(Carriage

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论