第4章_4 循环 子程序 DOS中断调用_第1页
第4章_4 循环 子程序 DOS中断调用_第2页
第4章_4 循环 子程序 DOS中断调用_第3页
第4章_4 循环 子程序 DOS中断调用_第4页
第4章_4 循环 子程序 DOS中断调用_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、12 在程序中重复执行相同功能的一段代码,可用循环程序实现。循环程序在程序中重复执行相同功能的一段代码,可用循环程序实现。循环程序通常由五部分组成:通常由五部分组成:初始化部分初始化部分为程序操作、地址指针、循环计数、结束条件等设为程序操作、地址指针、循环计数、结束条件等设置初始值。置初始值。循环工作部分循环工作部分循环程序主体,完成基本操作。循环程序主体,完成基本操作。循环修改部分循环修改部分修改循环工作部分的变量,为重复操作做准备。修改循环工作部分的变量,为重复操作做准备。循环控制部分循环控制部分修改计数器或判断循环结束条件,决定是否终止循环。修改计数器或判断循环结束条件,决定是否终止循环

2、。循循环环体体循环结束部分循环结束部分循环终止后,对循环结果的处理部分。循环终止后,对循环结果的处理部分。程序概述程序概述3终终 止止起起 始始初始化初始化循环工作循环工作循环修改循环修改循环控制循环控制完完未完未完终终 止止起起 始始初始化初始化循环工作循环工作循环修改循环修改循环控制循环控制完完未完未完先执行后判断先执行后判断先判断后执行先判断后执行程序基本结构程序基本结构未完未完终终 止止起起 始始初始化初始化循环工作循环工作循环修改循环修改循环控循环控制制完完4计数循环计数循环重复次数已知,用计数值控制循环的开始与终止。重复次数已知,用计数值控制循环的开始与终止。条件控制循环条件控制循

3、环重复次数未知或不确定,需找出循环控制的条件。重复次数未知或不确定,需找出循环控制的条件。解:解: 已知循环次数,采用计数循环控制。程序段如下:已知循环次数,采用计数循环控制。程序段如下:MOV CX,100;确定循环计数器值确定循环计数器值MOV BX,1;确定循环初值确定循环初值MOV AX,0;和的初值和的初值LOP: ADD AX,BX INC BXLOOP LOP;循环控制循环控制【例例】 编写程序计算编写程序计算C=1+2+3+4+100控制方式控制方式567计数循环的常见方法:计数循环的常见方法: 减减1循环循环MOVCX,NL :DECCXJNZL 加加1循环循环MOVCX,N

4、L: INCCXJNZL LOOP 短标号短标号MOVCX,NL: LOOP L 8解:无法确定循环次数,采用条件循环控制。程序段如下:解:无法确定循环次数,采用条件循环控制。程序段如下:MOV SI,OFFSET ORGSTRIN;读源串地址读源串地址 MOV DI,OFFSET DESSTRIN;读目的串地址读目的串地址LOP: MOV AL,SI MOV DI,AL INC SI;循环修改循环修改 INC DI CMP AL,$ JNZ LOP;循环控制循环控制【例例】 将一个字符串拷贝到另一个存储区中,直到拷贝到字符将一个字符串拷贝到另一个存储区中,直到拷贝到字符“$”$”结束。结束。

5、9 循环体中又有循环称多重循环。在多重循环程序设计时,应分别考虑每循环体中又有循环称多重循环。在多重循环程序设计时,应分别考虑每重循环的控制条件。通常内层循环要受外层循环的控制。重循环的控制条件。通常内层循环要受外层循环的控制。 解解:采用冒泡排序法,从第一个数开始依次对相邻的两个数进行比较,如:采用冒泡排序法,从第一个数开始依次对相邻的两个数进行比较,如果次序正确则不做任何操作,如果次序不正确则将此两个数交换位置。果次序正确则不做任何操作,如果次序不正确则将此两个数交换位置。 【例例】 在首地址为在首地址为Addr的存储单元中有的存储单元中有N个数,编程序将此个数,编程序将此N个数按照从个数

6、按照从小到大的次序排列。小到大的次序排列。10开开 始始CX外循环次数外循环次数DI最后一个数的地址最后一个数的地址BX0取取BX位置上的数到位置上的数到AL与后一数比较与后一数比较大于大于小于小于交换两数位置交换两数位置BXBX1是否为最后的数是否为最后的数?NYCXCX1结结 束束CX=0?YN11DATA SEGMENT Addr DB N DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,N DEC CXLOOPl: MOV DI,CX;设置外循环次数设置外循环次数

7、MOV BX,0;设置内循环条件设置内循环条件LOOP2:MOV AL,AddrBX CMP AL,AddrBX+1 JL CONT XCHG AL,AddrBX+1;让大的数向地址高处移动让大的数向地址高处移动 MOV AddrBX,ALCONT:INC BX CMP BX,DI;内循环判断内循环判断 JB LOOP2 LOOP LOOP1 ;外循环控制条件外循环控制条件 MOV AH,4CH INT 21HCODE ENDS END START 12MOVAX,3578HMOVCL,0L:ORAX,AX ;判断判断AX是否为是否为0JZEXIT ;AX=0结束结束SHLAX,1 ;最高位进

8、最高位进CFJNCLINCCLJMPLEXIT: INT20H 【例】统计【例】统计AX中中 1 的个数。的个数。起起 始始AX3578HCL0AX 1终终 止止AX=0?YNCF=1?NYCLCL+113【例】【例】BUF中有中有N个有符号数,分离其中的正负数,分别送入个有符号数,分离其中的正负数,分别送入BUF1和和BUF2中中 DATASEGMENTBUF DB 12H, 34H, -56H, -98H, 096H, 68H, 56H, 80HN=$BUFBUF1DB N DUP(0)BUF2DB N DUP(?) DATAENDSCODESEGMENTASSUME CS:CODE,DS

9、:DATASTART: MOVDX,DATAMOVDS,AXLEASI,BUFLEADI,BUF1LEABX,BUF2MOVCX,NAA:MOVAL,SIINCSICMPAL,0JGEBBMOVBX,ALINCBXJMPCCBB:MOVDI,ALINCDICC:LOOPAA;DEC CX ;JNZ AAMOVAH,4CHINT21HCODEENDSENDSTART14 程序设计过程中常常把多次引用的相同程序段编成一个独立的程序段,当程序设计过程中常常把多次引用的相同程序段编成一个独立的程序段,当需要执行这个程序段时,用调用指令(需要执行这个程序段时,用调用指令(CALL)调用该程序段即可。具有

10、这)调用该程序段即可。具有这种独立功能的程序段称为过程或子程序。种独立功能的程序段称为过程或子程序。 适合编成子程序的程序有两种:适合编成子程序的程序有两种: 程序需要反复使用,这类程序编写成子程序可避免重复编写程序,并可程序需要反复使用,这类程序编写成子程序可避免重复编写程序,并可以节省存储空间。以节省存储空间。 程序具有通用性,这类程序大家都要用到,如键盘管理程序、磁盘读写程序具有通用性,这类程序大家都要用到,如键盘管理程序、磁盘读写程序、标准函数程序等,编成子程序后便于功能共享。程序、标准函数程序等,编成子程序后便于功能共享。 15 子程序必须有一个名称,方便其他程序调用;子程序出口是一

11、条返回指令子程序必须有一个名称,方便其他程序调用;子程序出口是一条返回指令RET。 NAME PROCNEAR (FAR)过程名过程名过程类型过程类型RETNAME ENDP必须用必须用RET结束结束PUSHAXPUSHBXPOPBXPOPAX现场保护现场保护程序部分程序部分现场恢复现场恢复16 主程序调用子程序通过主程序调用子程序通过CALL指令来实现,子程序执行结束后,通过指令来实现,子程序执行结束后,通过RET指令返回主程序,转到主程序中指令返回主程序,转到主程序中CALL指令的下一条指令继续执行主程序。指令的下一条指令继续执行主程序。 一个子程序可以由主程序在不同时刻多次调用。如果在子

12、程序中又调用一个子程序可以由主程序在不同时刻多次调用。如果在子程序中又调用了其它的子程序,称为了其它的子程序,称为子程序嵌套子程序嵌套。特别当子程序又调用子程序本身时,。特别当子程序又调用子程序本身时,这种调用称为这种调用称为递归调用递归调用。 17 子程序通常应以独立的文件形式编写,形成模块。子程序文件由子程序通常应以独立的文件形式编写,形成模块。子程序文件由子程序子程序说明说明和和子程序体子程序体构成。构成。(1)子程序说明)子程序说明 功能描述,如子程序名、功能,性能指标等;功能描述,如子程序名、功能,性能指标等; 所用寄存器和存储单元;所用寄存器和存储单元; 子程序入口、出口参数;子程

13、序入口、出口参数; 子程序中调用的其它子程序;子程序中调用的其它子程序; 调用实例(可无)。调用实例(可无)。(2)子程序体)子程序体 子程序本身常以子程序本身常以“过程过程”形式存放在代码段中,以过程名开始,以形式存放在代码段中,以过程名开始,以RET指令结束。指令结束。 18(1)现场保护)现场保护 如果子程序中要临时修改某些寄存器或存储单元时,为了不破坏原有的如果子程序中要临时修改某些寄存器或存储单元时,为了不破坏原有的信息,要将寄存器或存储单元的原有内容压栈保护或存入子程序不用的寄信息,要将寄存器或存储单元的原有内容压栈保护或存入子程序不用的寄存器或存储单元中。存器或存储单元中。PUS

14、HAXPUSHBXPUSH SIPOPSIPOPBXPOPAXRET注意:现场保护的入栈和出栈顺注意:现场保护的入栈和出栈顺序正好相反序正好相反 19(2)参数传递)参数传递 主程序在调用子程序时一般需要传递参数给子程序,这些参数是子程序主程序在调用子程序时一般需要传递参数给子程序,这些参数是子程序运行时所需要的原始数据。常用的方法有:运行时所需要的原始数据。常用的方法有:u 寄寄 存存 器器 适用于参数少的情况,其特点是参数传递速度快适用于参数少的情况,其特点是参数传递速度快 。u 约定单元约定单元 适用于参数多的情况,要事先建立参数缓冲区。适用于参数多的情况,要事先建立参数缓冲区。u 堆堆

15、 栈栈 适用于参数较多、子程序嵌套或递归调用的情况。适用于参数较多、子程序嵌套或递归调用的情况。 20MOV BX,OFFSET M1MOV AX,BX;AH,AL作子程序的入口参数作子程序的入口参数CALL ADDROC;调用子程序调用子程序MOV BX+2,AL;AL作为子程序的返回参数作为子程序的返回参数MOV BX,OFFSET M2MOV AX,BX ;读第二组待处理数据读第二组待处理数据CALL ADDROC;再次调用子程序处理第二个数据再次调用子程序处理第二个数据ADDROC PROC NEAR;子程序定义子程序定义 ADD AL,AH;将将AL,AH中的参数相加,结果存中的参数

16、相加,结果存AL DAA RET;子程序返回子程序返回ADDROC ENDP【例例4.13】利用寄存器传递参数。利用寄存器传递参数。21MOVBX,OFFSET M1;待处理数据的地址用待处理数据的地址用BX传递传递CALL ADDROC2;调用子程序调用子程序MOV BX,OFFSET M2;将第二组数据地址放到将第二组数据地址放到BX中中CALL ADDROC2ADDROC2 PROC NEAR PUSHAXMOV AL,BX;BX中存放待处理数据的地址中存放待处理数据的地址 ADD AL,BX+1;直接对该地址中的数据做运算直接对该地址中的数据做运算 DAA MOV BX+2,AL;结果

17、存回到内存中结果存回到内存中POPAX RETADDPROC2 ENDP【例例4.14】利用存储器传递参数。利用存储器传递参数。22MOVAX,0MOV AH,BIN1PUSH AX;将待转换二进制数压入堆栈将待转换二进制数压入堆栈LEA DI,ASCBUFPUSH DI;将将ASCII码存放地址压入堆栈码存放地址压入堆栈MOV AX,8HPUSH AX;将二进制数的位数压入堆栈将二进制数的位数压入堆栈CALL BINTOASC;调用转换子程序调用转换子程序MOV AH,BIN2;开始对第二个数处理开始对第二个数处理PUSH AXADD DI,10HPUSH DIMOV AX,10HPUSH

18、AXCALL BINTOASC【例例4.15】利用堆栈传递参数到子程序,由子程序对参数进行处理。利用堆栈传递参数到子程序,由子程序对参数进行处理。将两个给定的二进制数将两个给定的二进制数BIN1、BIN2转换为对应的二进制数的转换为对应的二进制数的ASC码串码串。23BINTOASCPROC NEAR;转换子程序转换子程序 PUSH DI;保护现场保护现场 PUSH CX PUSH DX MOV BP,SP;获取堆栈地址获取堆栈地址 MOV DX,BP+12;取出堆栈中的数据取出堆栈中的数据 MOV DI,BP+10 MOV CX,BP+8 LOP: ROL DX,1;二进制数最高位放到二进制

19、数最高位放到DL中中MOV AL,DLAND AL,1ADD AL,0;转换为转换为ASC码码MOV DI,AL;存入相应内存存入相应内存INC DILOOP LOP POP DX POP CX POP DI RET 6BINTOASC ENDP2425 MS-DOS操作系统内置了几十个子程序(操作系统内置了几十个子程序(API),这些子程序能够完成大),这些子程序能够完成大量底层功能,用户程序可以通过软中断调用方式使用这些子程序(称为量底层功能,用户程序可以通过软中断调用方式使用这些子程序(称为DOS系统功能调用),软中断号为系统功能调用),软中断号为21H。 指令为:指令为:INT 21H

20、 DOS系统功能调用的基本过程如下:系统功能调用的基本过程如下: (1)传送入口参数到指定寄存器中;)传送入口参数到指定寄存器中; (2)调用子功能的功能编号放在)调用子功能的功能编号放在AH寄存器中;寄存器中; (3)执行)执行INT 21H指令。指令。 调用结束后返回相应结果,并由调用结束后返回相应结果,并由CF标志表示调用是否成功,当出现调用标志表示调用是否成功,当出现调用错误时错误时CF=1,AX返回出错编号。返回出错编号。26(1)MOVREG,XX;传送入口参数到指定寄存器中传送入口参数到指定寄存器中;(部分无入口参数)(部分无入口参数) (2)MOV AH,功能号,功能号;功能号

21、送入功能号送入AH寄存器中寄存器中(3)INT 21H;DOS功能调用功能调用(4)返回信息)返回信息CF= 1 表示有错误发生,表示有错误发生, AX=返回错误代码返回错误代码CF=表示调用成功,表示调用成功,AX返回参数返回参数271、键盘单字符输入(、键盘单字符输入(1号)号)MOVAH,1INT21H功能功能:等待从键盘输入一个字符。:等待从键盘输入一个字符。返回返回:(:(AL)=ASCII码,并回显在显示器上。码,并回显在显示器上。 DEBUG演示演示常用常用DOS功能调用介绍功能调用介绍2、键盘输入字符串(、键盘输入字符串(0AH号)号)MOV DX,OFFSET BUF;DS:

22、DX为键盘缓冲区为键盘缓冲区MOVAH,0AHINT21H功能功能:等待从键盘输入一串字符,回车结束。字符串存入键盘缓冲区。:等待从键盘输入一串字符,回车结束。字符串存入键盘缓冲区。键盘缓冲区定义键盘缓冲区定义(示例)(示例):BUFDB 81;缓冲区的大小缓冲区的大小DB ?;实际输入的字符个数实际输入的字符个数,不含不含0DHDB 80 DUP (?)(?) ;字符串存放区字符串存放区283、输出单字符(、输出单字符(2号)号)MOV DL,AMOVAH,02INT21H功能功能:将:将DL中字符从屏幕上输出。中字符从屏幕上输出。返回返回:无。:无。 DEBUG演示演示4、输出字符串(、输出字符串(09号)号)MOV DX,OFFSET BUFMOVAH,09INT21H功能功能:BUF中以中以“$”为结束标志的字符串显示在屏幕上。为结束标志的字符串显示在屏幕上。 DATASEGMENTBUFDB“80X86 CPU $”DATAENDS DEBUG演示演示295、控制台输入、控制台输入/输出单字符(输出单字符(06)MOVAH,06MOVDL,0FFH;DL为为0

温馨提示

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

评论

0/150

提交评论