欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第6章子程序结构.ppt

    • 资源ID:4784995       资源大小:179.52KB        全文页数:42页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第6章子程序结构.ppt

    2023/5/14,ch6,1,在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。,第6章 子程序结构,2023/5/14,ch6,2,子程序的基本结构包括以下几个部分:(1)子程序定义(2)保护现场和恢复现场(3)子程序体(4)子程序返回,子程序的结构,2023/5/14,ch6,3,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(NEAR 和 FAR)。,6.1.1 子程序的定义,6.1 子程序的设计方法,2023/5/14,ch6,4,如果调用程序和过程在同一代码段中,则使用NEAR属性;,MAIN PROC FAR CALL SUBR1 RETMAIN ENDP;SUBR1 PROC NEAR RETSUBR1 ENDP,MAIN PROC FAR CALL SUBR1 RETSUBR1 PROC NEAR RETSUBR1 ENDPMAIN ENDP,6.1.2 子程序的调用和返回,2023/5/14,ch6,5,如果调用程序和过程不在同一代码段中,则使用FAR属性;,SEGX SEGMENT SUBT PROC FAR RETSUBT ENDP CALL SUBT SEGX ENDS;SEGY SEGMENT CALL SUBT SEGY ENDS,2023/5/14,ch6,6,6.1.3 保护现场和恢复现场,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则 可采用如下方法保护和恢复现场。PROGPROCPUSHAXPUSH BX PUSHCX;保护现场PUSHDX POPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROCENDP,2023/5/14,ch6,7,6.1.4 主程序与子程序参数传递方式,1 通过寄存器传送参数 这是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。例:十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来。,开始,调用DECIBIN,调用CRLF,调用BINIHEX,调用CRLF,结束,从键盘取得十进制数,保存到BX中,显示回车和换行,用十六进制形式显示BX中的数,2023/5/14,ch6,8,Decihex segment assume cs:DecihexMain proc farRepeat:push ds xor ax,ax push ax call decibin call crlf call binihex call crlf retMain endp,Decibin proc near mov bx,0Newchar:mov ah,1 int 21h sub al,30h jl exit cmp al,9 jg exit cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx;每次乘的 add bx,ax;结果在BX中 jmp newchar Exit:retDecibin endp,2023/5/14,ch6,9,Binihex proc near mov ch,4Rotate:mov cl,4 rol bx,cl mov dl,bl and dl,0fh add dl,30h cmp dl,3ah jl print add dl,7h Print:mov ah,2 int 21h dec ch jnz rotate ret Binihex endp,Crlf proc near mov ah,2 mov dl,odh int 21h mov dl,oah int 21h retCrlf endpDecihex ends end repeat,2023/5/14,ch6,10,如果过程和调用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。例 6.4 主程序MAIN和过程PROADD在同一源文件中,要求用过程PROADD累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中去,2023/5/14,ch6,11,DATA SEGMENT ARY DW 100 DUP(?)COUNT DW 100 SUM DW?DATA ENDSCODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATASTART:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA CALL NEAR PTR PROADD RETMAIN ENDP,PROADD PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI LEA SI,ARY MOV CX,COUNT XOR AX,AXNEXT:ADD AX,SI ADD SI,2 LOOP NEXT MOV SUM,AX POP DI POP SI POP CX POP AX RETPROADD ENDPCODE ENDS END START,2023/5/14,ch6,12,CODE SEGMENTARY DW 100 DUP(?)COUNT DW 100SUM DW?NUM DW 100 DUP(?)N DW 100TOTAL DW?;MOV TABLE,OFFSET ARYMOV TABLE+2,OFFSET COUNTMOV TABLE+4,OFFSET SUNMOV BX,OFFSET TABLECALL PROADD;计算SUM,PROADD PROC NEAR PUSH AX PUSH CX PUSH SI MOV SI,MOV CX,MOV DI,XOR AX,AXNEXT:ADD AX,SI ADD SI,2 LOOP NEXT MOV,AX POP SI POP CX POP AX RETPROADD ENDPCODE ENDS END START,BX,BX+2,BX+4,DI,3 通过地址表传递参数,2023/5/14,ch6,13,例:把内存中字变量num的值,转换为4个用ASC码表示的16进制数码,串的起始地址为string。,Data segmentNum dw 25afhString db 4 dup(?),$,0dh,0ahData endsStack segment para stack stack db 100 dup(?)Stack endsCode segment assume cs:code,ds:data,ss:stackMain proc farBegin:push ds xor ax,ax push ax mov ax,data mov ds,ax lea bx,string push bx push num call binhex lea dx,string mov ah,9 int 21h retMain endp,2000:00002000:0002,3000:00003000:00013000:00033000:00043000:00073000:00093000:000d3000:000e3000:00123000:00153000:0019,1500,af250200,sp,string地址,Num,Lea dx,string地址(IP),4 通过堆栈传递地址或参数,2023/5/14,ch6,14,Binhex proc near push bp mov bp,sp push ax push di push bx push cx pushf mov ax,bp+4;ax=25afh mov di,bp+6;di=0002 mov ch,4 mov cl,4 roat:rol ax,cl mov bl,al and bl,0fh add bl,30h cmp bl,39h jle next add bl,7h,0015,25af0002,sp,string地址,Num,Lea dx,string地址(IP),flagcxbxdiaxbp,(Sp)bp,bp+2bp+4bp+6,Bp-6Bp-4Bp-2,2023/5/14,ch6,15,Next:mov di,bl inc di dec ch jnz rota popf pop cx pop bx pop di pop ax pop bp ret 4Binhex endpCode ends end begin,0015,25af0002,sp,string地址,Num,Lea dx,string地址(IP),flagcxbxdiaxbp,sp,2023/5/14,ch6,16,例3:求10个数的累加值.-远调用,Data segmentAry db 10 dup(?)Count db 10Sum db?Data endsStack segment para stack stack db 100 dup(?)Stack endsCode1 segment assume cs:code1,ds:data,ss;stackMain proc farStart:push ds xor ax,ax push ax mov ax,data mov ds,ax,2023/5/14,ch6,17,Mov bx,offset ary Push bx Mov bx,offset count Push bx Mov bx,offset sum Push bx Call far ptr proadd mov al,sum mov dl,al mov ah,2 int 21h retMain endpCode1 ends,Sum地址Count地址Ary地址,MOV AL,SUM 地址,sp,IPCS,2023/5/14,ch6,18,Sum地址Count地址Ary地址,sp,MOV AL,SUM 地址,disicxaxbp,(Sp)bp,IPCS,Code2 segment assume cs:code2Proadd proc far push bp mov bp,sp push ax push cx push si push di mov si,bp+0ah mov di,bp+08h mov cl,di mov di,bp+06h xor al,alAgain:add al,si inc si dec cl jnz again mov di,al pop di pop si pop cx,pop ax pop bp ret 6Proadd endpCode2 ends end start,bp+0ah,bp+08h,bp+06h,2023/5/14,ch6,19,(1)PUBLIC伪指令 格式:PUBLIC 符号,符号 功能:说明其后的符号是全局符号。全局符号能被其他模块引用。(局部符号)(2)EXTRN伪指令 格式:EXTRN 符号:类型,符号:类型 功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。,5 多个模块之间的参数传送问题,2023/5/14,ch6,20,source module 1 extrn a:word Data1 segment b dw?Data1 ends code1 segment assume cs:code1,ds:data1Main proc far start:mov ax,data1 mov ds,ax mov ah,4ch int 21hMain endpCode1 ends End start,source module 2 public a Data2 segment a dw?Data2 ends code2 segment assume cs:code2,ds:data2Main proc far start:mov ax,data2 mov ds,ax mov ah,4ch int 21hMain endpCode2 ends End start,注意:应先有public 定义,然后才有extrn说明,2023/5/14,ch6,21,NAMEMOD1EXTRNDISP:FARPUBLICSTR1,N,BUFDATA1SEGMENTSTR1DBHOW DO YOU DO?N=$-STR1BUFDBTHIS IS AN EXAMPLE OF MODULES PROGRAM DATAENDSSTACKSEGMENT STACKDB 200 DUP(0)STACKENDSCODE1SEGMENTASSUME CS:CODE1,DS:DATA1,SS:STACKSTART:MOVAX,DATAMOVDS,AXCALLDISPMOVAH,4CHINT21HCODE1ENDS ENDSTART,例:用模块化程序设计方法建立两个模块MOD1 ASM和MOD2 ASM的数据通讯。,2023/5/14,ch6,22,NAMEMOD2EXTRNSTR1:BYTE,STR2:BYTE,N:ABSPUBCICDISPDATA2SEGMENTSTR2DB 81 DUP(0)DATA2ENDSCODE2SEGMENTASSUME CS:CODE2,ES:DATA2DISPPROCFARMOVAX,DATA2MOVES,AXLEABX,STR1MOVCX,NLEASI,STR2NEXT:MOVAL,BXMOVES:SI,ALINCBXINCSI LOOPNEXT,LEADX,BUFMOVAH,9INT21HRET DISPENDPCODE2ENDSEND,2023/5/14,ch6,23,6.1.5 增强功能的过程定义伪操作,Procname PROC attributes field USER register list,parameter field Procname ENDPAttributes field(属性字段)包括:Distance:near、far Language type:说明是那种高级语言的子程序 如pascal、c 等。Visibility:说明程序的可见性 是private 或是public。Prologue:是一个宏的名字,允许用宏来控制过程的入口或出口有关的代码USER:该字段用来指定用户所需保存和恢复的寄存器表。Parameter field:参数字段,允许用户指定该过程所用的参数。标识符:类型,标识符:类型,2023/5/14,ch6,24,Data segmentAry db 10 dup(?)Count db 10Sum db?Data endsStack segment para stack stack db 100 dup(?)Stack endsCode1 segment assume cs:code1,ds:data,ss:stackMain proc farStart:push ds xor ax,ax push ax mov ax,data mov ds,ax,Mov bx,offset ary Push bx Mov bx,offset count Push bx Mov bx,offset sum Push bx Call far ptr proadd mov al,sum mov dl,al mov ah,2 int 21h retMain endpCode1 ends,例6.4 用增强功能过程定义伪操作实现,2023/5/14,ch6,25,Code2 segment assume cs:code2Proadd proc far push bp mov bp,sp push ax push cx push si push di mov si,bp+0ah mov di,bp+08h mov cl,di mov di,bp+06h xor al,alAgain:add al,si inc si dec cl jnz again mov di,al pop di pop si pop cx pop ax pop bp ret 6Proadd endpCode2 ends end start,Code2 segment assume cs:code2Proadd proc pascal user ax cx si di,para:word,parc:word,pars:word mov si,para mov di,parc mov cl,di mov di,pars xor al,alAgain:add al,si inc si dec cl jnz again mov di,al ret Proadd endpCode2 ends end start,Sum地址Count地址Ary地址,(bp),IPCS,(bp+2),(bp+4),(bp+6),(bp+8),(bp+a),原始bp,mov al,sum,para,pars,parc,局部变量,disicxax,(bp-2),2023/5/14,ch6,26,增强功能的过程定义伪操作除了以上功能外,还可以在过程中定义局部变量。局部变量是在过程内部使用的变量,他是在过程调用是在堆栈中建立的,在退出过程是被释放。可以用 LOCAL 定义 LOCAL 变量:类型,变量:类型,Sum地址Count地址Ary地址,(bp),IPCS,(bp+2),(bp+4),(bp+6),(bp+8),(bp+a),原始bp,(bp-2),(bp-4),局部变量,2023/5/14,ch6,27,6.2 子程序的嵌套 一个子程序可以作为调用程序去掉用另一个子程序,这种情况称为子程序的嵌套。嵌套深度不限。但应注意什么问题?堆栈溢出:上溢、下溢递归子程序:如果一个子程序调用的是子程序的本身,就是递 归子程序。,2023/5/14,ch6,28,例5:计算 N!=N*(N-1)*(N-2)*1-递归子程序,Data segmentNum db 3Result dw?Data endsStack segment para stack stack db 100 dup(?)Stack endsCode segment assume cs:code,ds:data,ss:stackMain proc farBegin:push ds xor ax,ax push ax mov ax,data mov ds,ax,2023/5/14,ch6,29,mov ah,0 mov al,num call factor mov result,ax retMain endp,Factor proc push ax sub ax,1 jne f_cont pop ax jmp returnf_cont:call factor pop cx mul clreturn:retfactor endpCode ends end begin,IP1,Mov result,ax 地址,3,IP2,Pop cx 地址,2,IP3,Pop cx 地址,1,ax=1,IP POP CX 地址,cx=2,ax*cx=1*2,IP POP CX 地址,cx=3,ax*cx=1*2*3,IP Mov result,ax 地址,2023/5/14,ch6,30,常用的DOS系统功能调用,1单字符输入(1号调用)2单字符显示(2号调用)3打印输出(5号调用)4结束调用(4CH号调用)5显示字符串(9号调用)6字符串输入(10号调用),2023/5/14,ch6,31,1单字符输入(1号调用)格式:MOVAH,1 INT21H功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。2单字符显示(2号调用)格式:MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H功能:将DL寄存器中的字符送显示器显示.,2023/5/14,ch6,32,3打印输出(5号调用)格式:MOVDL,待打印字符的ASCII码MOVAH,5INT21H功能:将DL寄存器中的字符送打印机打印。4结束调用(4CH号调用)格式:MOVAH,4CH INT21H功能:终止当前程序并返回调用程序。,2023/5/14,ch6,33,5显示字符串(9号调用)格式:LEADX,待显示字符串首偏移地址 MOVAH,9 INT21H功能:将当前数据区中以结尾的字符串送显示器显示。6字符串输入(10号调用)格式:LEADX,缓冲区首偏移地址 MOVAH,10 INT21H功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。,maxlen db 32 actlen db?string db 32 dup(?),lea dx,maxlen mov ah,0ah int 21h,说明:缓冲区的第一个字节保存最大字符数,这个最 大字符数由用户程序给出。如果键入的字符数 比此数大,机器发出嘟嘟声。第二个字节存放 实际输入的字节数,这个不是由用户填入的而 由功能A填入的。在这两个字节之后,才是我们 输入的字符串。,2023/5/14,ch6,34,6.3 子程序举例,例1:HEXIDEX是一个十六进制数转换成十进制数的程序。要求把从键盘输入的0 FFFFH的十六进制正数转换为十进制数并在屏幕上显示出来。,Display equ 2hKey equ 1hDoscall equ 21hHexidec segmentMain proc far assume cs:hexidecStart:push ds sub ax,ax push ax call hexidec call crlf call binidec call crlf jmp main ret main endp,Crlf proc near mov dl,0ah mov ah,display int boscall mov dl,0dh mov ah,display int doscall ret crlf endpHexidec ends end start,2023/5/14,ch6,35,Hexidec proc near mov bx,0Newchar:mov key_in int doscall sub al,30h jl exit cmp al,10d jl add_to sub al,27h cmp al,0ah jl exit cmp ah,10h jge exitAdd_to:mov cl,4 shl bx,cl mov ah,0 add bx,ax jmpExit:RetHexidec endp,Binidec proc near mov cx,10000d call dec_div mov cx,1000d call dec_div mov cx,100d call dec_div mov cx,10d call dec_div mov cx,1d call dec_div retDec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al add dl,30h mov ah,display int doscall,retdec_div endpBinidec endp,2023/5/14,ch6,36,例2:一个简单的信息检索系统。在数据区里,有10个不同的信息,编号为09,每个信息包括30个字符。现在要编制一个程序:从键盘接收09之间的一个编号,然后在屏幕上显示相应编号的信息的内容。,Datarea segment thirty db 30 msg0 db 0 I like my IBM-PC-msg1 db 1 I like my IBM-PC-msg2 db 2 I like my IBM-PC-msg3 db 3 I like my IBM-PC-msg4 db 4 I like my IBM-PC-msg5 db 5 I like my IBM-PC-msg6 db 6 I like my IBM-PC-msg7 db 7 I like my IBM-PC-msg8 db 8 I like my IBM-PC-msg9 db 9 I like my IBM-PC-errmsg db error!Invalid praameterDatarea ends,2023/5/14,ch6,37,Stack segment db 256 dup(0)tos lable wordStack endsPrognam segment assume cs:prognam,ds:datarea,ss:stackStart:push ds xor ax,ax push ax mov ax,stack mov ss,ax mov ax,datarea mov ds,ax mov sp,offset tosBegin:mov ah,1 int 21h sub al,0 jc error cmp al,9 ja error,Mov bx,offset msg0 Mul thirty Add bx,ax Call display Jmp beginError:mov bx,offset errmsg call display retDisplay proc near mov cx,30 mov dl,bx call dispchar inc bx loop disp1 mov dl,0dh call dispchar mov dl,0ah call dispchar retDispchar endp,Dispchar proc naer mov ah,2 int 21h retDispchar endpMain endpPrognam endsEnd start,2023/5/14,ch6,38,例3:人名排序程序。先从终端键入最多30个人名,当所有人名都进入后,按字母上升的次序将人名排序,并在屏幕上显示已经排好的人名。,2023/5/14,ch6,39,Data segment namepar label byte maxnlen db 21 namelen db?namefld db 21 dup(?)crlf db 13,10,$endaddr dw?messg1 db name?,$”messg2 db sorted names,13,10,$namectr db 0 nametab db 30 dup(20 dup()namesav db 20 dup(?),13,10,$swapped db 0Data endsCode segment main proc far assume cs:code,ds:data,es:data start:push ds mov ax,0 push ax,mov ax,data mov ds,ax mov es,ax cld lea di,nametab a20loop:call b10read cmp namelen,0 jz a30 cmp namectr,30 je a30 call d10stor jmp a20loop a30:cmp namectr,1 jbe a40 call g10sort call k10disp a40:mov ah,4ch Int 21hMain endp,2023/5/14,ch6,40,b10read proc near mov ah,09 lea dx,messg1 int 21h mov ah,0ah lea dx,namepar int 21h mov ah,09h lea dx crlf Int 21h mov bx,0 mov bl,namelen mov cx,21 sub cx,bx b20:mov namefldbx,20h inc bx loop b20 ret b10read endp,d10stor proc near inc namectr cld lea si,namectr mov cx,10 rep movsw ret p10stor endp g10sort proc near sub di,40 mov endaddr,di g20:mov swapped,0 lea si,nametab g30:mov cx,20 mov di,si add di,20 add ax,di mov ax,di mov bx,si repe cmpsb,jbe g40 call h10 xchg g40:mov si,ax cmp swapped,0 jnz g20 retG10sort endp,2023/5/14,ch6,41,h10 xchg proc near mov cx,10 lea di,namesav mov si,bx rep movsw mov cx,10 mov di,bx rep movsw mov cx,10 lea si,namesav rep movsw mov swapped,1 ret h10 xchg endp,k10disp proc near mov ah,09 lea dx,messg2 int 21h lea si,nametab lea di,namesav mov cx,10 rep movsw mov ah,09 lea dx,namesav int 21h dec namectr jnz k20 retK10disp endp end start,2023/5/14,ch6,42,第六章 作业,6.16.26.36.7,

    注意事项

    本文(第6章子程序结构.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开