《汇编语言程序设计 第9章_子程序设计(精品).ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计 第9章_子程序设计(精品).ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计8086/80888086/8088和和ARMARM核核汇编语言程序设计汇编语言程序设计第第9 9章章 子程序设计子程序设计 2/7/20231第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.2 9.2 子程序的参数传递子程序的参数传递 9.3 9.3 子程序嵌套与递归子程序嵌套与递归 第第9 9章章 子程序设计子程序设计9.1 9.1 子程序设计方法子程序设计方法 9.4 9.4 子程序库子程序
2、库2/7/20232第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计 子子程程序序又又称称为为过过程程,是是能能完完成成特特定定功功能能有有一一定定通通用用性性的的程程序序段段,在在需需要要时时能能被被其其它它程程序序调调用用。调调用用子子程程序序的的程程序序常常称称为为主主程程序序。一一般般把把源源程程序序中中反反复复出出现现的的程程序序段段或或常常用用的的功功能独立的程序段设计成子程序供用户使用。能独立的程序段设计成子程序供用户使用。这这样样可可以以简简化化源源程程序序结结构构、节节省省目目标标程程
3、序序的的存存储储空空间间,提提高高程程序序设设计计的的效效率率。子子程程序序结结构构也也是是模模块块化化程程序序设设计计的的基基础础。本本章章主主要要介介绍绍子子程程序序的的定定义义、子子程程序序调调用用和和返返回回、子子程程序的序的参数传递参数传递以及以及子程序库子程序库等知识。等知识。9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 2/7/20233第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计 9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法
4、子程序设计方法子程序设计方法 9.1.1 9.1.1 子程序的定义子程序的定义子程序的定义是由过程定义伪指令子程序的定义是由过程定义伪指令PROCPROC和和ENDPENDP实现,格式如下:实现,格式如下:过程名过程名 PROCPROCNEAR|FARNEAR|FAR;过程体;过程体过程名过程名 ENDPENDPNEARNEAR属性的过程只能被相同代码段的其他程序调用,属性的过程只能被相同代码段的其他程序调用,FARFAR属性的过程可以属性的过程可以被不同代码段的程序调用。被不同代码段的程序调用。(1 1)子程序和主程序子程序和主程序在同一个代码段在同一个代码段中,则子程序定义为中,则子程序定
5、义为NEARNEAR属性。属性。(2 2)子程序和主程序子程序和主程序不在同一个代码段不在同一个代码段中,则子程序定义为中,则子程序定义为FARFAR属性。属性。(3 3)主程序主程序通常定义为通常定义为FARFAR属性,这是因为主程序被看作属性,这是因为主程序被看作DOSDOS调用的一个调用的一个子程序,以便执行完返回子程序,以便执行完返回DOSDOS。2/7/20234第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计
6、方法 9.1.1 9.1.1 子程序的定义子程序的定义MAIN PROC FAR CALL SUBR1 RETMAIN ENDP;SUBR1 PROC NEAR RETSUBR1 ENDPMAIN PROC FAR CALL SUBR1 RETSUBR1 PROC NEAR RETSUBR1 ENDPMAIN ENDP段内定义段内定义子程序可以放在代码段主程序开始执行子程序可以放在代码段主程序开始执行之前的位置,也可放在代码段的末尾主之前的位置,也可放在代码段的末尾主程序执行终止后的位置。程序执行终止后的位置。P121 2/7/20235第第9章章 子程序的设计子程序的设计 计算机科学与技术系
7、计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计SEGX SEGMENT SUBT PROC FAR RETSUBT ENDP CALL SUBT SEGX ENDS;SEGY SEGMENT CALL SUBT SEGY ENDS9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.1 9.1.1 子程序的定义子程序的定义段间定义段间定义2/7/20236第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计 9.1 9.1 9
8、.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.1 9.1.1 子程序的定义子程序的定义 为了便于其他程序员能正确使用子程序,在编写子程序为了便于其他程序员能正确使用子程序,在编写子程序时,还要养成书写子程序说明信息的良好习惯。子程序说明时,还要养成书写子程序说明信息的良好习惯。子程序说明信息一般包括以下内容:信息一般包括以下内容:(1 1)子程序名子程序名(2 2)功能描述功能描述(3 3)入口和出口参数入口和出口参数(4 4)调用注意事项和说明等调用注意事项和说明等2/7/20237第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系
9、汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计 9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.1 9.1.1 子程序的定义子程序的定义例例9.19.1 编写一个子程序,从键盘输入一位十进制数。编写一个子程序,从键盘输入一位十进制数。;子程序名:;子程序名:stdinstdin;功能:完成从键盘输入一位十进制数;功能:完成从键盘输入一位十进制数;入口参数:等待键盘输入;入口参数:等待键盘输入;出口参数:;出口参数:alal中存放输入的数值中存放输入的数值stdinproc mov ah,1 int21h cmpal,30h j
10、l next cmp al,39h jg next and al,0fhnext:retstdin endp2/7/20238第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.2 9.1.2 子程序调用与返回子程序调用与返回 子程序调用与返回由子程序调用与返回由CALLCALL和和RETRET指令实现。指令实现。子程序调用指令首先把子程序调用指令首先把子程序的返回地址(即子程序的返回地址(即CALLCALL指
11、指令的下一条指令的地址)压入堆栈令的下一条指令的地址)压入堆栈,然后,然后转移到子程序转移到子程序的入口地址执行子程序的入口地址执行子程序。根据子程序和主程序是否在同。根据子程序和主程序是否在同一代码段,分为一代码段,分为段内调用段内调用和和段间调用段间调用。子程序和主程序子程序和主程序在同一个代码段中在同一个代码段中称为称为段内调用段内调用;子程序和主程序不在子程序和主程序不在同一个代码段中同一个代码段中,称为,称为段间调用段间调用。子程序返回指令负责。子程序返回指令负责把压入栈区的返回地址弹出送把压入栈区的返回地址弹出送IPIP或或CSIPCSIP,实现返回主,实现返回主程序继续往下执行。
12、与子程序的段内调用和段间调用相程序继续往下执行。与子程序的段内调用和段间调用相对应,子程序的返回也分为段内返回和段间返回。对应,子程序的返回也分为段内返回和段间返回。2/7/20239第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.2 9.1.2 子程序调用与返回子程序调用与返回 当子程序和主程序在同一个代码段中,子程序的定义和调用如下图当子程序和主程序在同一个代码段中,子程序的定义和调用如下图:code
13、segmentmain proc far call suba retmain endpsuba proc near retsuba endpcode ends2/7/202310第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.2 9.1.2 子程序调用与返回子程序调用与返回 当子程序和主程序不在同一个代码段中,子程序的定义和调用如下图当子程序和主程序不在同一个代码段中,子程序的定义和调用如下图:code1
14、segmentmain proc far call far ptr suba retmain endpcode1 endscode2 segmentsuba proc far retsuba endpcode2 ends2/7/202311第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.39.1.3寄存器内容的保护与恢复寄存器内容的保护与恢复 通常主程序和子程序是分别编制的,所以它们可能会使通常主程序和子程
15、序是分别编制的,所以它们可能会使用同一个寄存器。如果主程序中某个寄存器的内容在调用用同一个寄存器。如果主程序中某个寄存器的内容在调用子程序后还要用,而子程序又恰好使用了同一个寄存器,子程序后还要用,而子程序又恰好使用了同一个寄存器,当子程序修改了寄存器的内容后,返回到主程序时,该寄当子程序修改了寄存器的内容后,返回到主程序时,该寄存器的内容也就不会是调用子程序前的内容,这样,常常存器的内容也就不会是调用子程序前的内容,这样,常常会导致调用程序的出错。为此,编写子程序时,在一进入会导致调用程序的出错。为此,编写子程序时,在一进入子程序后,就把它所用到的寄存器内容压进栈,在返回前,子程序后,就把它
16、所用到的寄存器内容压进栈,在返回前,再把它们弹出栈。再把它们弹出栈。为什么寄存器需要保护与恢复?为什么寄存器需要保护与恢复?2/7/202312第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.1 9.1 9.1 9.1 子程序设计方法子程序设计方法子程序设计方法子程序设计方法 9.1.39.1.3寄存器内容的保护与恢复寄存器内容的保护与恢复例如:若子程序例如:若子程序例如:若子程序例如:若子程序PROGPROG中改变了寄存器中改变了寄存器中改变了寄存器中改变了寄存器AXAX,BXBX,CXCX,DX
17、DX的值,则的值,则的值,则的值,则 可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。PROGPROCPUSHPUSHAXAXPUSH PUSH BX BX PUSH PUSHCXCX;保护现场保护现场保护现场保护现场PUSHPUSHDXDX POPPOPDXDXPOPPOPCXCXPOPPOPBXBX;恢复现场恢复现场恢复现场恢复现场POPPOPAXAXRET;返回断点处返回断点处PROCENDP注意注意:堆栈堆栈“先进后先进后出出”的操作特点,恢的操作特点,恢复寄存器的顺序不能复寄存器的顺序不能搞错搞错。2/7/202
18、313第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.2 9.2 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.19.2.1用寄存器传递参数用寄存器传递参数优点:优点:直接、简便,只要把参数存放在约定的寄存器中就行了。直接、简便,只要把参数存放在约定的寄存器中就行了。缺点:缺点:适用于传递参数较少的情况。适用于传递参数较少的情况。例例9.39.3从键盘输入一组字符,直到从键盘输入一组字符,直到“0”0”为止。编一子程序,完为止。编一子程序,完成当输入是小写字母时,则修改为大写字母。输入的
19、字符存放成当输入是小写字母时,则修改为大写字母。输入的字符存放在在stringstring为首址的存储单元中。为首址的存储单元中。参数可以增加子程序的灵活性和通用性。调用程序传送参数可以增加子程序的灵活性和通用性。调用程序传送给子程序的参数称为入口参数,子程序返回给调用程序的结给子程序的参数称为入口参数,子程序返回给调用程序的结果称为出口参数。果称为出口参数。2/7/202314第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计 常用的常用的DOS系统功能调用系统功能调用1单字符输入(单字符输入(1号调用
20、)号调用)2单字符显示(单字符显示(2号调用)号调用)3打印输出(打印输出(5号调用)号调用)4结束调用(结束调用(4CH号调用)号调用)5显示字符串(显示字符串(9号调用)号调用)6字符串输入(字符串输入(10号调用)号调用)2/7/202315第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计1单字符输入(单字符输入(1号调用)号调用)格式:格式:MOVAH,1 INT 21H功能:从键盘输入字符的功能:从键盘输入字符的ASCII码送入寄存器码送入寄存器AL中,并中,并送显示器显示。送显示器显示。2单
21、字符显示(单字符显示(2号调用)号调用)格式:格式:MOV DL,待显示字符的待显示字符的ASCII码码 MOV AH,2 INT 21H功能:将功能:将DL寄存器中的字符送显示器显示寄存器中的字符送显示器显示.2/7/202316第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计3打印输出(打印输出(5号调用)号调用)格式格式:MOVDL,待打印字符的待打印字符的ASCII码码MOVAH,5INT21H功能:将功能:将DL寄存器中的字符送打印机打印。寄存器中的字符送打印机打印。4结束调用(结束调用(4C
22、H号调用)号调用)格式:格式:MOVAH,4CH INT21H功能:终止当前程序并返回调用程序。功能:终止当前程序并返回调用程序。2/7/202317第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计5显示字符串(显示字符串(9号调用)号调用)格式:格式:LEA DX,待显示字符串首偏移地址待显示字符串首偏移地址 MOV AH,9 INT21H功能:将当前数据区中以功能:将当前数据区中以结尾的字符串送显示器显示。结尾的字符串送显示器显示。6字符串输入(字符串输入(10号调用)号调用)格式:格式:LEA D
23、X,缓冲区首偏移地址缓冲区首偏移地址 MOV AH,10 INT21H功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。器显示。maxlen db 32 actlen db?string db 32 dup(?)lea dx,maxlen mov ah,0ah int 21h说明:缓冲区的第一个字节保存最大字符数,这个最说明:缓冲区的第一个字节保存最大字符数,这个最 大字符数由用户程序给出。如果键入的字符数大字符数由用户程序给出。如果键入的字符数 比此数大,机器发出嘟嘟声。第二个字节存放比此数大,机器发出嘟嘟声。第二
24、个字节存放 实际输入的字节数,这个不是由用户填入的而实际输入的字节数,这个不是由用户填入的而 由功能由功能A填入的。在这两个字节之后,才是我们填入的。在这两个字节之后,才是我们 输入的字符串输入的字符串。2/7/202318第第9章章 子程序的设计子程序的设计;主程序;主程序data segmentstring db 100 dup(?)data ends;-code segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov di,offset stringagain:mov ah,1int 21hcmp al,0je exitcal
25、l stobmov di,alinc dijmp againexit:mov ah,4chint 21h;子程序名:;子程序名:stob;功能:将小写字母修改为大写字母;功能:将小写字母修改为大写字母;入口参数:;入口参数:al存放输入的字符存放输入的字符;出口参数:;出口参数:al存放修改后的字符存放修改后的字符stob proc nearcmp al,61hjb nextcmp al,7ahja nextsub al,20hnext:retstob endpcode endsend start 2/7/202319第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系
26、汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.2 9.2 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.2 9.2.2 用存储单元传递参数用存储单元传递参数 这种方法是使用存储单元传递参数的,即主这种方法是使用存储单元传递参数的,即主程序在存储单元建立一个参数表,存放子程序所程序在存储单元建立一个参数表,存放子程序所要的参数,在主程序中将该参数表首地址传送给要的参数,在主程序中将该参数表首地址传送给子程序,子程序通过参数表取得所需参数,并把子程序,子程序通过参数表取得所需参数,并把结果也存放到指定存储单元中。结果也存放到指定存储单元中。优点:优点:适合于传递参
27、数较多的情况。适合于传递参数较多的情况。2/7/202320第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.2 9.2 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.2 9.2.2 用存储单元传递参数用存储单元传递参数 例例9.49.4使用存储单元传递参数的方法来实现例使用存储单元传递参数的方法来实现例9.39.3。;主程序主程序datasegmentstring db100 dup(?)Lentdw?dataendscodesegmentassumecs:code,ds:datamai
28、n proc farstart::push dsmov ax,,0push axmovax,datamovds,axmovcx,0movdi,offset string again:movah,1 int 21h cmpal,0 jenext movdi,alincdiinccx jmpagain next:mov lent,cx lea bx,string callstob1 ret 2/7/202321第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.2 9.2 9.2 9.2 子程序的参数传递子
29、程序的参数传递 9.2.2 9.2.2 用存储单元传递参数用存储单元传递参数;子程序名:;子程序名:stob1;功能:将小写字母修改为大写字母;功能:将小写字母修改为大写字母;入口参数:;入口参数:bx存放数据存储单元首址存放数据存储单元首址;出口参数:修改后的字符存回原存储单元中;出口参数:修改后的字符存回原存储单元中 stob1procmovcx,lent again1:moval,bxcmpal,61hjbnext1cmpal,7ahjanext1subal,20hmovbx,al next1:incbxdeccxjnzagain1ret stob1 endp main endp cod
30、eends end start2/7/202322第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.2 9.2 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.3 9.2.3 用堆栈传递参数用堆栈传递参数 用堆栈传递入口参数时,要在调用子程序前把有关参数依用堆栈传递入口参数时,要在调用子程序前把有关参数依次压栈,子程序从堆栈中取得入口参数;用堆栈传递出口参次压栈,子程序从堆栈中取得入口参数;用堆栈传递出口参数时,要在子程序返回前,把有关参数依次压栈,主程序就数时,要在子程序返回前,把有关参数
31、依次压栈,主程序就可以从堆栈中取到出口参数。可以从堆栈中取到出口参数。优点:优点:适合于传递参数较多的情况。适合于传递参数较多的情况。注意注意:避免因堆栈操作而造成子程序不能正确返回的错误。避免因堆栈操作而造成子程序不能正确返回的错误。2/7/202323第第9章章 子程序的设计子程序的设计例例9.5编一子程序:求有符号字数组编一子程序:求有符号字数组array中元素的最小值。数组元素的个数中元素的最小值。数组元素的个数存放在存放在cont字单元中。字单元中。Data segmentarray dw 100,66,-1,88,20cont dw5min dw?data endsstack se
32、gment stackdw 128 dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackstart:movax,datamov ds,axmov ax,offset array push ax;数组偏移地址进栈;数组偏移地址进栈movax,contpush ax;元素个数进栈;元素个数进栈callfindminmovmin,ax;保存出口参数;保存出口参数movah,4chint21h2/7/202324第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇
33、编语言程序设计9.2 9.2 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.3 9.2.3 用堆栈传递参数用堆栈传递参数 ;子程序名:;子程序名:findmin;功能:求有符号字数组中元素的最小值;功能:求有符号字数组中元素的最小值;入口参数:数组首地址和元素个数在堆栈中;入口参数:数组首地址和元素个数在堆栈中;出口参数:;出口参数:ax中存放最小值中存放最小值findminprocpushbpmovbp,sp;为取参数作准备;为取参数作准备pushbxpushcxmovbx,bp+6;从堆栈中取数组首地址送;从堆栈中取数组首地址送bxmovcx,bp+4;从堆栈中取元素个数送;从
34、堆栈中取元素个数送cxdeccxmovax,bx;取出第一个元素给;取出第一个元素给AXagain:addbx,2cmpbx,ax;与下一个数据比较;与下一个数据比较jgnextmovax,bxnext:loopagainpopcxpopbxpopbpretfminendpcodeendsendstart2/7/202325第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.3 9.3 9.3 9.3 子程序嵌套与递归子程序嵌套与递归 一个子程序也可以作为调用程序去调用另一个子程序,一个子程序也可以作为
35、调用程序去调用另一个子程序,称为子程序嵌套。称为子程序嵌套。递归子程序:如果一个子程序调用的是子程序的本身,就是递归递归子程序:如果一个子程序调用的是子程序的本身,就是递归子程序。子程序。例例9.69.6编程计算编程计算n!n!(设(设0n60n6)分析:求分析:求n!n!的递归定义为的递归定义为:1 n=0n!=n*(n-1)!n 02/7/202326第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.3 9.3 9.3 9.3 子程序嵌套与递归子程序嵌套与递归 Data segmentNum db
36、 3Result dw?Data endsStack segment para stack stack db 100 dup(?)Stack endsCode segment assume cs:code,ds:data,ss:stackMain proc farMain proc farBegin:push ds xor ax,ax push ax mov ax,data mov ds,ax2/7/202327第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.3 9.3 9.3 9.3 子程序嵌套与
37、递归子程序嵌套与递归 mov ah,0 mov al,num call factcall fact mov result,ax retMain Main endpendp;子程序名:;子程序名:fact;功能:求;功能:求n!;入口参数:;入口参数:ax=n(0n6);出口参数:;出口参数:dx=n!fact proc cmp ax,0jnz nextmov dl,1;0!retnext:push axdec alcall fact;递归调用递归调用pop axmul dl;n*(n-1)!mov dx,axretfact endpcode endsend start2/7/202328第第9
38、章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.4 9.4 子程序库子程序库 开发大型应用程序时,通常把复杂的程序分成很多功能独开发大型应用程序时,通常把复杂的程序分成很多功能独立的模块,分别编写成子程序,对各个子程序模块单独进行汇立的模块,分别编写成子程序,对各个子程序模块单独进行汇编产生相应的目标模块(编产生相应的目标模块(OBJOBJ文件),最后再用连接程序把它们文件),最后再用连接程序把它们连接起来,形成一个完整的可执行程序。采用这种模块化程序连接起来,形成一个完整的可执行程序。采用这种模块化程序
39、设计方法,程序不但结构清晰,也便于调试。设计方法,程序不但结构清晰,也便于调试。采用模块化程序设计,各模块之间会存在着采用模块化程序设计,各模块之间会存在着相互调用相互调用,即,即一个模块会引用在另一个模块中定义的一个模块会引用在另一个模块中定义的标识符标识符(包括变量、标(包括变量、标号、过程名等)。号、过程名等)。标识符标识符有两种:有两种:1 1)在本模块中定义,供本模块使用的标识符称为)在本模块中定义,供本模块使用的标识符称为局部标识符局部标识符;2 2)在一个模块中定义,而又在另一个模块中引用的标识符称为)在一个模块中定义,而又在另一个模块中引用的标识符称为外部标识符外部标识符。2/
40、7/202329第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.4 9.4 子程序库子程序库为了解决各模块间标识符的交叉访问,汇编语言提供了二条为了解决各模块间标识符的交叉访问,汇编语言提供了二条伪指令伪指令PUBLICPUBLIC和和EXTRNEXTRN。(1 1)伪指令)伪指令PUBLICPUBLIC说明:当前模块中哪些标识符是能被其它模块引用的外部标说明:当前模块中哪些标识符是能被其它模块引用的外部标识符。其格式如下:识符。其格式如下:PUBLICPUBLIC 标识符,标识符,标识符,标识符,
41、;定义标识符的模块使用;定义标识符的模块使用(2 2)伪指令)伪指令EXTRNEXTRN说明:在当前模块所使用的标识符中,哪些标识符是已在其说明:在当前模块所使用的标识符中,哪些标识符是已在其它模块中被定义为指定类型的标识符。它模块中被定义为指定类型的标识符。格式如下:格式如下:EXTRNEXTRN 标识符:类型,标识符:类型,标识符:类型,标识符:类型,;调用标识;调用标识符的模块使用符的模块使用2/7/202330第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.4 9.4 子程序库子程序库例例9
42、.79.7从键盘输入一个数从键盘输入一个数n n((0n6)(0n6),求,求n!n!,并输出结果。,并输出结果。把例把例9.19.1、例、例9.29.2例和例和9.69.6的子程序编写成子程序模块,供主程的子程序编写成子程序模块,供主程序调用。序调用。;子程序;子程序stdin.asmpublicstdincode segmentstdin procfar;例;例9.1中的输入子程序中的输入子程序stdinstdin endpcode endsend;子程序;子程序dispax.asmpublicdispaxdata segmentdb4dup(?),0ah,0dh,$data endsco
43、de segmentdispaxprocfar;例;例9.2中的输出子程序中的输出子程序dispaxdispaxendpcode endsend2/7/202331第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.4 9.4 子程序库子程序库;子程序;子程序fact.asmpublicfactcode segmentfactprocfar;例例9.6中求中求n!子程序子程序factfactendpcode endsend;主程序;主程序main.asmextrn stdin:far,fact:far,
44、dispax:farStacksegmentDw128dup(0)StackendsCode segmentAssumecs:code,ss:stackStart:callstdinmov ah,0call factcall dispaxmov ah,4chInt 21hcode endsend start2/7/202332第第9章章 子程序的设计子程序的设计 计算机科学与技术系计算机科学与技术系 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计9.4 9.4 子程序库子程序库 用汇编程序把它们分别汇编成目标文件用汇编程序把它们分别汇编成目标文件stdin.objstdin.obj、dispax.objdispax.obj和和fact.objfact.obj。当子程序模块很多时,可以把它们统一管理起来,存入一个当子程序模块很多时,可以把它们统一管理起来,存入一个或多个子程序库中。库文件可以把它看成是子程序的集合。或多个子程序库中。库文件可以把它看成是子程序的集合。MASMMASM系统提供了库管理程序系统提供了库管理程序LIB.EXELIB.EXE,可以建立、组织和维护子,可以建立、组织和维护子程序库。程序库。2/7/202333第第9章章 子程序的设计子程序的设计