




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-3-61子程序设计子程序设计2022-3-62课前思考课前思考p子程序调用和返回时需要保护与恢复哪些寄存子程序调用和返回时需要保护与恢复哪些寄存器?器?p子程序的参数传送有几种方法?子程序的参数传送有几种方法?p如何采用增强功能的过程定义伪操作编制子程如何采用增强功能的过程定义伪操作编制子程序?序?p子程序嵌套与递归的区别?子程序嵌套与递归的区别?2022-3-63学习目标学习目标p了解子程序的构成了解子程序的构成p学会运用多种方法在调用程序与子程序之间传学会运用多种方法在调用程序与子程序之间传递参数。递参数。p掌握递归子程序的编程技巧。掌握递归子程序的编程技巧。2022-3-64学
2、习指南和难重点学习指南和难重点【学习指南】【学习指南】熟悉堆栈的运行过程对学习这一章至关重熟悉堆栈的运行过程对学习这一章至关重要。要。【难重点】【难重点】子程序的调用和返回。保护与恢复寄存器。子程序的调用和返回。保护与恢复寄存器。子程序的参数传送。嵌套与递归子程序。子程序的参数传送。嵌套与递归子程序。DOS系统功能调用。系统功能调用。2022-3-65子程序的设计方法子程序的设计方法 子程序又称为过程,相当于高级语言中的过子程序又称为过程,相当于高级语言中的过程和函数。程和函数。2022-3-66过程定义伪操作过程定义伪操作 过程定义伪操作用在过程(子程序)的前后,使过程定义伪操作用在过程(子
3、程序)的前后,使整个过程形成清晰的、具有特定功能的代码块。其格整个过程形成清晰的、具有特定功能的代码块。其格式为:式为:过程名过程名 PROC PROC near|farnear|far 过程名过程名 ENDPENDP其中过程名为标识符,它又是子程序入口的符号其中过程名为标识符,它又是子程序入口的符号地址,与标号的作用相同。地址,与标号的作用相同。属性(属性(AttributeAttribute)是指类型属性,可以是)是指类型属性,可以是NEARNEAR或或FARFAR。2022-3-67过程定义伪操作(续)过程定义伪操作(续) 用户对过程属性的确定原则很简单,即:用户对过程属性的确定原则很简
4、单,即:(1 1)如果调用程序和过程在)如果调用程序和过程在同一个代码段中同一个代码段中,则使用则使用NEARNEAR属性。属性。(2 2)如果调用程序和过程)如果调用程序和过程不在同一个代码段不在同一个代码段中,中,则使用则使用FARFAR属性。属性。2022-3-68过程定义伪操作(续)过程定义伪操作(续)过程的属性为过程的属性为near的情况:的情况: ;SampleB.ASMstack segment stackdw 512 dup(?)stack endsdata segment.;在数据段定义数据在数据段定义数据data endscode segment codeassume cs
5、:code,ds:data,ss:stackstart: mov ax,datamov ds,ax.;在代码段填入指令序列在代码段填入指令序列mov ax,4c00hint 21h.;子程序代码子程序代码code endsend start;SampleC.ASM.model small.stack.data.;在数据段定义数据在数据段定义数据.codestart:mov ax,datamov ds,ax.;在代码段填入指令序列在代码段填入指令序列mov ax,4c00hint 21h.;子程序代码子程序代码end start2022-3-611过程定义伪操作(续)过程定义伪操作(续)过程的属
6、性为过程的属性为far的情况:的情况:2022-3-612子程序的调用和返回子程序的调用和返回 子程序的正确调用和正子程序的正确调用和正确返回可以保证过程的正确确返回可以保证过程的正确执行,这一功能由执行,这一功能由80868086的的CALLCALL和和RETRET指令完成。指令完成。为保证其正确性,除为保证其正确性,除PROCPROC的属性要正确选择外,的属性要正确选择外,还应该注意子程序运行期间还应该注意子程序运行期间的的堆栈状态堆栈状态。例如:例如:SUBT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPOP DXPOP CXPOP BXPOP AX RE
7、TSUBT ENDP 2022-3-613保存与恢复寄存器保存与恢复寄存器p如果主程序在调用子程序之前的某个寄存器内容在如果主程序在调用子程序之前的某个寄存器内容在从子程序返回后还有用,而子程序又恰好使用了同从子程序返回后还有用,而子程序又恰好使用了同一个寄存器,这就破坏了该寄存器的原有内容,因一个寄存器,这就破坏了该寄存器的原有内容,因而会造成程序运行错误,这是不允许的。而会造成程序运行错误,这是不允许的。p如果使用寄存器在主程序和子程序之间传送参数的如果使用寄存器在主程序和子程序之间传送参数的话,则这种寄存器就不一定需要保存,特别是用来话,则这种寄存器就不一定需要保存,特别是用来向主程序回
8、送结果的寄存器,就更不应该因保存和向主程序回送结果的寄存器,就更不应该因保存和恢复寄存器而破坏了应该向主程序传送的信息。恢复寄存器而破坏了应该向主程序传送的信息。 2022-3-614子程序的参数传送子程序的参数传送1. 通过通过寄存器寄存器传送参数传送参数主程序往子程序传参数主程序往子程序传参数子程序返回值子程序返回值特点:方便,但参数不能太多。特点:方便,但参数不能太多。求求Count个元素的和个元素的和入口参数:入口参数:CXCX元素个数,元素个数,DS:BXDS:BX数组的段地址:偏移地址数组的段地址:偏移地址出口参数:出口参数:ALAL校验和校验和2022-3-615;求;求Coun
9、tCount个元素的和个元素的和; ;设置入口参数(含有设置入口参数(含有DSDS数组的段地址)数组的段地址)mov mov bxbx,offset array,offset array;BX;BX数组的偏移地址数组的偏移地址mov mov cxcx,count,count ;CX;CX数组的元素个数数组的元素个数call checksumacall checksuma; ;调用求和过程调用求和过程mov result,mov result,alal; ;处理出口参数处理出口参数2022-3-616checksumachecksumaproc nearproc nearxor al,alxor
10、 al,al; ;累加器清累加器清0 0suma:suma:add add alal,bxbx ; ;求和求和inc inc bxbx; ;指向下一个字节指向下一个字节looploop suma sumaretretchecksumachecksumaendpendpendend2022-3-617子程序的参数传送(续)子程序的参数传送(续)2. 2. 若子程序和调用程序在同一源文件若子程序和调用程序在同一源文件( (同一同一程序模块程序模块) )中,则子程序可直接访问模块中的中,则子程序可直接访问模块中的变量。即通过变量。即通过存储单元传存储单元传递参数。递参数。求求Count个元素的和个元
11、素的和入口参数:入口参数:count元素个数,元素个数,array数组名(含段地址:偏移地址)数组名(含段地址:偏移地址)出口参数:出口参数:result校验和校验和2022-3-618例例2 通过通过存储单元传存储单元传递参数递参数; ;主程序主程序call checksumbcall checksumb; ;子程序子程序checksumbchecksumbprocproc near nearpush axpush axpush bxpush bxpush cxpush cxxor al,alxor al,al; ;累加器清累加器清0 0mov bx,offset mov bx,offset
12、 arrayarray; ;BXBX数组的偏移地址数组的偏移地址mov cx,mov cx,countcount; ;CXCX数组的元素个数数组的元素个数2022-3-619例例2 通过通过存储单元传存储单元传递参数递参数sumb:sumb:add al,bxadd al,bx; ;求和求和inc bxinc bxloop sumbloop sumbmov mov resultresult,al,al; ;保存校验和保存校验和pop cxpop cxpop bxpop bxpop axpop axretretchecksumbchecksumbendpendp2022-3-620子程序的参数传
13、送(续)子程序的参数传送(续)3.3.通过通过堆栈表堆栈表传送参数或参数地址。高级语言常采传送参数或参数地址。高级语言常采用这种方法。用这种方法。求求Count个元素的和个元素的和入口参数:入口参数:顺序压入偏移地址和元素个数顺序压入偏移地址和元素个数出口参数:出口参数:ALAL校验和校验和2022-3-621例例3 主程序主程序mov ax,offset arraymov ax,offset arraypush axpush axmov ax,countmov ax,countpush axpush axcall checksumccall checksumcadd sp,4add sp,4
14、mov result,almov result,alchecksumcchecksumc proc nearproc nearpush bppush bpmov bp,spmov bp,sp; ;利用利用BPBP间接寻址存取参数间接寻址存取参数push bxpush bxpush cxpush cxmov bx,mov bx,bp+6bp+6 ;SS:BP+6;SS:BP+6指向偏移地址指向偏移地址mov cx,mov cx,bp+4bp+4 ;SS:BP+4;SS:BP+4指向元素个数指向元素个数xor al,alxor al,alsumc:sumc:add al,bx add al,bx
15、inc bxinc bxloop sumcloop sumcpop cxpop cxpop bxpop bxpop bppop bpretretchecksumcchecksumc endpendp2022-3-623子程序的参数传送(续)子程序的参数传送(续)4.多个模块之间的参数传送问题多个模块之间的参数传送问题要点:要点:(1)(1)多个模块使用同一变量,只能分配一次内存。多个模块使用同一变量,只能分配一次内存。(2)(2)若要将变量定义成允许别的模块访问,则变量若要将变量定义成允许别的模块访问,则变量用用public public 定义成外部符号。如:定义成外部符号。如:PUBLIC
16、PUBLIC Var1Var1,Var2Var2,(3)(3)若在本模块中使用另一个模块中定义的变量,若在本模块中使用另一个模块中定义的变量,则在本模块中用则在本模块中用extrnextrn 定义。如:定义。如:EXTRNEXTRNVar1Var1:bytebyte,Var2Var2:bytebyte,2022-3-624子程序的嵌套与递归调用子程序的嵌套与递归调用子程序的嵌套调用是指在子程序中再调用其它子程序。子程序的嵌套调用是指在子程序中再调用其它子程序。 递归调用和高级语言中的一致,子程序直接或间接递归调用和高级语言中的一致,子程序直接或间接的调用自己,实际上是嵌套调用的一种特例。的调用
17、自己,实际上是嵌套调用的一种特例。 大量使用嵌套调用和递归调用会耗费大量的堆栈空大量使用嵌套调用和递归调用会耗费大量的堆栈空间,特别是递归调用。所以,在程序设计中需要估计程间,特别是递归调用。所以,在程序设计中需要估计程序执行时所需要的最大堆栈空间,序执行时所需要的最大堆栈空间,把堆栈段设置得足够把堆栈段设置得足够大,避免堆栈溢出大,避免堆栈溢出的情况。的情况。ALdispALdispprocprocpush axpush axpush cxpush cx; ;实现实现alal内容的显示内容的显示push dxpush dxpush axpush ax; ;暂存暂存axaxmov dl,alm
18、ov dl,al; ;转换转换alal的高的高4 4位位mov cl,4mov cl,4shr dl,clshr dl,clcall dldispcall dldisp; ;调用子程序显示调用子程序显示alal高高4 4位位pop dxpop dxand dl,0fhand dl,0fhcall dldispcall dldisp; ;调用子程序显示调用子程序显示alal低低4 4位位pop dxpop dxpop cxpop cxpop axpop axretretALdispALdispendpendp; ;显示显示dldl低低4 4位中一位十六进制数位中一位十六进制数dldispdldi
19、spprocprocor dl,30hor dl,30hcmp dl,39hcmp dl,39hjbe dldisp1jbe dldisp1add dl,7add dl,7dldisp1:dldisp1: mov ah,2mov ah,2int 21hint 21hretretdldispdldispendpendp.model small.model small.stack 256.stack 256.data.dataN Ndw 5dw 5resultresultdw ?dw ?.code.codestart:start:mov ax,datamov ax,datamov ds,axmov
20、 ds,axmov ax,nmov ax,ncall factcall factmov ax,resultmov ax,resultmov ah,4chmov ah,4chint 21hint 21h求阶乘求阶乘; ;计算计算N!N!的近过程的近过程; ;入口参数:入口参数:AXAX; ;出口参数:出口参数:resultresultfact fact procproccmp ax,0cmp ax,0;N=0?;N=0?jne l1jne l1mov result,1mov result,1; ;是,是, N!N!1 1retretl1:l1:push axpush axdec axdec ax
21、call factcall factpop axpop axmul resultmul resultmov result,axmov result,axretretfact fact endpendpend startend start求阶乘求阶乘2022-3-629子程序举例子程序举例例例6 HEXIDEC6 HEXIDEC是一个把十六进制数转换成十进制数是一个把十六进制数转换成十进制数的程序。要求把从键盘输入的的程序。要求把从键盘输入的0 00FFFFH0FFFFH的十六进的十六进制正数转换为十进制数并在屏幕上显示出来。制正数转换为十进制数并在屏幕上显示出来。子程序之间的参数传送,采用寄存
22、器传送的方式子程序之间的参数传送,采用寄存器传送的方式DisplayDisplayequ equ 2h2h; ; 显示单个字符的功能号是显示单个字符的功能号是2 2key_in key_in equ equ 1h 1h ; ; 键盘输入单个字符的功能号是键盘输入单个字符的功能号是1 1doscall doscall equequ21h21h; DOS; DOS中断号中断号hexidec hexidec segment segment main proc far main proc far assume assume cs:hexideccs:hexidecstart: start: pushp
23、ush ds ds subsubax,ax ax,ax push ax push ax call call hexibinhexibin; ; 十六进制转换成二进制十六进制转换成二进制call call crlf crlf ; ; 显示回车和换行显示回车和换行call call binidecbinidec ; ; 二进制转换成十进制二进制转换成十进制call call crlfcrlf ret ret main endp main endp 这是主程序这是主程序; ; 定义子程序定义子程序hexibinhexibin( (十六进制转换成二进制十六进制转换成二进制, ,结果在结果在bxbx中中
24、) )hexibin hexibin proc nearproc nearmovmovbx,0bx,0newchar:newchar:mov ah,key_in mov ah,key_in int int doscall doscall ; ; 键盘输入单个字符键盘输入单个字符sub sub al,30h al,30h jl jl exit exit cmp cmp al,10d al,10d jl jl add_to add_to ; 0; 09 9之间转之间转add_toadd_to; ; 判断是否判断是否a af f之间之间(a(a的的ASCIIASCII码为码为61h)61h)sub
25、sub al,27h al,27h cmp cmp al,0ah al,0ah jl jl exit exit cmp cmp al,10h al,10h jge jge exit exit (待续)(待续)(续)(续); 0; 09 9或或a af fadd_to:add_to:mov cl,4 mov cl,4 shl bx,cl shl bx,cl ; (bx); (bx)* *1616mov ah,0 mov ah,0 add bx,ax add bx,ax jmp newchar jmp newchar exit:exit:ret ret hexibin hexibin endpen
26、dp ; ; 定义子程序定义子程序binidecbinidec( (二进制转换成十进制二进制转换成十进制) ) binidec proc nearbinidec proc nearmov mov cx,10000d cx,10000d callcall dec_div dec_div ; bx; bx被被1000010000除除mov mov cx,1000d cx,1000d call dec_div call dec_div ; bx; bx被被10001000除除movmovcx,100d cx,100d callcall dec_div dec_div ; bx; bx被被100100
27、除除movmovcx,10d cx,10d callcall dec_div dec_div ; bx; bx被被1010除除mov mov cx,1d cx,1d callcall dec_div dec_div ; bx; bx被被1 1除除ret ret ; ; 定义子程序定义子程序dec_divdec_div( (十进制除十进制除) ) dec_div dec_div proc nearproc nearmov mov ax,bx ax,bx mov mov dx,0 dx,0 ; ; 被除数在被除数在dx:axdx:ax中中div div cx cx mov mov bx,dx bx
28、,dx ; ; 余数送余数送bxbxmov mov dl,al dl,al ; ; 商送商送dldladd add dl,30h dl,30h mov mov ah,display ah,display int int doscall doscall ; ; 显示单个字符显示单个字符ret ret dec_div dec_div endpendpbinidec binidec endpendp; 定义子程序定义子程序crlf crlf crlf proc nearcrlf proc nearmov mov dl,0ah dl,0ah mov mov ah,display ah,display
29、int int doscall doscall mov mov dl,0dh dl,0dh mov mov ah,display ah,display int int doscall doscall ret ret crlf endpcrlf endphexidec ends hexidec ends end start end start 2022-3-636例例7 7 本例为一个简单的信息检索系统。在数据区本例为一个简单的信息检索系统。在数据区里,有里,有1010个不同的信息,编号为个不同的信息,编号为0 09 9,每个信息包,每个信息包括括3030个字符。现在要求编制一个程序:从键盘接收
30、个字符。现在要求编制一个程序:从键盘接收0 09 9之间的一个编号,然后在屏幕上显示出相应编之间的一个编号,然后在屏幕上显示出相应编号的信息内容。号的信息内容。 datarea segment thirty db 30 ; 信息表信息表 msg0 db I like my IBM-PC- msg1 db 8088 programming is fun- msg2 db Time to buy more diskettes- msg3 db This program works- msg4 db Turn off that printer- msg5 db I have more memory
31、than you- msg6 db The PSP can be useful- msg7 db BASIC was easier than this- msg8 db DOS is indispensable- msg9 db Last massage of the day- ; 错误信息错误信息 errmsg db error! invalid parameter! datarea ends stack stack segmentsegmentdb 256 dup(0) db 256 dup(0) tostoslabel wordlabel wordstack stack endsendsprognam segment prognam segment main proc main proc far far assumecs:prognam,ds:datarea,ss:stackassumecs:prognam,ds:datarea,ss:stackstart: start: mov mov ax,stackax,stackmovmovss,axss,axmov mov sp,offset tossp,offset tospush ds push ds sub sub ax,ax ax,ax pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省日照市莒县一中2025届高考历史试题终极仿真预测试卷含解析
- 石家庄理工职业学院《统计软件R语言》2023-2024学年第二学期期末试卷
- 2025年网络安全与信息法考试试卷及答案
- 江西省上饶市信州区2024-2025学年五年级数学第二学期期末达标检测模拟试题含答案
- 天津美术学院《肿瘤免疫治疗学》2023-2024学年第二学期期末试卷
- 江苏省兴化市安丰初级中学2024-2025学年学业水平模拟考试化学试题仿真模拟试题B卷含解析
- 2025年职称外语考试专项测试卷及答案
- 2025年注册会计师考试试卷及答案
- 无锡工艺职业技术学院《基础医学实验(二)》2023-2024学年第二学期期末试卷
- 西安建筑科技大学华清学院《房地产项目投资与融资》2023-2024学年第二学期期末试卷
- DB37-T 5061-2024 住宅小区供配电设施建设标准
- GB/T 45135-2024钛合金板材超塑成形和扩散连接件通用技术规范
- (2025)时事政治题库(含参考答案)
- 【含听力9英一模】合肥市蜀山区2024年中考一模英语
- 保利拍卖行合同模板
- 2025年中国融通农发社会招聘笔试参考题库含答案解析
- 养老院护理员培训制度
- 无人机组装与调试 课件 项目一 多旋翼无人机组装调试
- 公司安全生产事故隐患内部报告奖励工作制度
- 建行金融生态圈
- 安全评估标准
评论
0/150
提交评论