子程序的调用课件

上传人:我*** 文档编号:147980777 上传时间:2020-10-15 格式:PPT 页数:46 大小:97.50KB
返回 下载 相关 举报
子程序的调用课件_第1页
第1页 / 共46页
子程序的调用课件_第2页
第2页 / 共46页
子程序的调用课件_第3页
第3页 / 共46页
子程序的调用课件_第4页
第4页 / 共46页
子程序的调用课件_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《子程序的调用课件》由会员分享,可在线阅读,更多相关《子程序的调用课件(46页珍藏版)》请在金锄头文库上搜索。

1、子程序的调用,子程序的结构,子程序的定义 子程序的调用与返回指令 子程序的编程原则 参数的传递,子程序的定义,1.基本概念 功能相对独立的一段程序. 输入输出处理过程均可编写为相应的子程序. 使程序的模块化,便于代码复用、简化编程。 2.子程序的定义 过程定义伪指令 过程名 PROC NEAR/FAR ;过程的开始,FAR、NEAR 过程的属性 过程体 RET 过程名 ENDP ;过程结束,3.注意问题 1)过程体内必须有一条RET指令被执行 proc1 proc mov ax,0 proc1 endp proc2 proc mov bx,-1 ret proc endp,子程序的定义,2)调

2、用程序和过程在同一程序段时,属性选择NEAR,当调用程序和过程不在同一程序段时,应选择FAR 3)在调用时,NEAR 和FAR 可以强制改变 CALL FAR PTR NEARPROC CALL NEAR PTR FARPROC,子程序的定义,子过程的调用与返回指令,子过程的调用是个”有去有回”的过程,子程序执行完后必须返回CALL指令的下一条指令处,因此必须对CALL指令的下条指令的地址进行保存.保存地址的操作是通过堆栈来完成.不是采用PUSH POP指令来实现,而是用CALLRET指令隐含完成.,1.子程序的调用指令 指令格式: CALL DST DST 是子程序的子程序名或子程序的首地址

3、.可以采用与转移指令有关的四种转移的寻址方式之一,即:段内直接调用段内间接调用段间直接调用段间间接调用. 段内、段间:调用程序和子程序在同一段内,为段内调 用;否则 段间调用; 直接、间接:DST为子程序名(子程序首地址),是转移 地址,该有效地址直接出现在CALL指中; 若有效地址出现在寄存器中间接得到,则为间 接调用,子过程的调用与返回指令,1)段内直接调用 SP=SP-2;SS:SP CALL下一条指令的IP IP =IP+D16 (DST为16位) 2)段内间接调用 SP=SP-2;SS:SP CALL下一条指令的IP IP =DST中的有效地址EA( DST为16位),子过程的调用与

4、返回指令,3)段间直接调用 SP=SP-2 ;SS:SP 返回地址的段地址 SP=SP-2; SS:SP 返回地址的偏移值 IP=DST的偏移地址 CS=DST的段地址 4)段间间接调用 SP=SP-2 ;SS:SP 返回地址的段地址 SP=SP-2; SS:SP 返回地址的偏移值 IP=EA的低16位 CS=EA的高16位,子过程的调用与返回指令,例题:判断下列CALL指令的寻址方式: 1)PRO1 为过程名,属性为NEAR CALL PRO1 2)PRO2 为过程名,属性为FAR CALL PRO2 3)设过程的偏移地址在BX中,则有指令: CALL BX 4)设过程的偏移地址在BX中,则

5、有指令: CALL BX,子过程的调用与返回指令,5)设过程地址在数据段addi所指的单元中,则有 指令: CALL DWORD PTR addi 6)设过程地址在BX中,则有指令: CALL DWORD PTR BX,子过程的调用与返回指令,2. 子程序的返回指令 指令格式:RET/RET N/RETF 指令功能: RET:返回地址出栈IP(段内) RETF:返回地址出栈IP(段内 段间)和CS寄存器(段间) RET N:返回地址出栈IP(段内 段间)和CS寄存器(段间) 再将N个(必须是偶数)字节数据弹出来,保持栈 的平衡。,子过程的调用与返回指令,3 .注意: 1)CALL 和RET均不

6、影响标志 2)NEAR属性的过程,RET是段内返回,汇编后仍为RET;如果是FAR属性的过程,RET是段间返回,汇编后RET 为 RETF. 3)段内调用返回只需设置IP 4)段间调用返回需设置IP和CS,多模块采用此设计方法,子过程的调用与返回指令,4.子程序调用方式举例 分析下面程序段,说明各种调用子程序的方法和寻址方式: data segment nproc dw nearp fproc dd farp data ends code1 segment assume cs:code1,cs:data Main proc far,子过程的调用与返回指令,mov ax,data mov ds,

7、ax call nearp lea ax,nearp call ax call nproc lea bx,nproc call word ptr bx call farp call fproc lea bx,fproc call dword ptr bx mov ah,4ch int 21h Main endp,Nearp proc near ret Nearp endp Code1 ends end main code2 segment assume cs:code2 Farp proc far . ret Farp ends Code2 ends,子程序的编程原则,1.分析题意,进行模块分

8、解,画出流程图. 2.对子程序做说明.说明内容:子程序名,功能,入口参数,出口参数,执行时间等 3.主程序中的寄存器信息内容的保存和恢复 主程序调用和返回时断点信息的保存和恢复 4.注意堆栈的使用.压入与弹出的内容必须对应.,1.切分子程序 根据程序的功能、结构和重复使用的程序段等特性完成子程序的切分。 1)显示一个字符的子程序 display proc push ax mov ah,2 int 21h pop ax ret displsy endp,子程序的编程原则,在主程序中调用子程序 mov dl,a call display mov dl,0dh call display .,子程序的

9、编程原则,2)通过键盘获取一个字符的子程序 inputchar proc push ax mov ah,1 int 21h mov char ,al pop ax ret intputchar endp,子程序的编程原则,3)显示回车换行子程序 dispodoa proc push ax push dx mov ah,2h mov dl,0dh int 21h mov ah,2h mov dl,0ah int 21h Pop dx Pop ax Ret Dis0doa endp,子程序的编程原则,2.确定接口参数及参数传递方法 入口参数:把子程序执行前准备的值或地址称为入口参数。是调用者提供给

10、子程序的信息。 出口参数:把子程序返回值或地址称为出口参数。是子程序运行后,返回调用者的信息。 保存入口参数和出口参数的方法:利用堆栈或寄存器,子程序的编程原则,3.保存环境信息 子程序是可共享的,可被不同的程序调用.所以子程序中用到的寄存器的内容要保存,在子程序退出前要恢复寄存器中的内容. 4.堆栈平衡 堆栈使用主要在:保存转移指令的返回断点、保存子程序中用到的寄存器的内容、参数传递和子程序本身用到的堆栈操作。保存堆栈平衡确保数据弹出的准确性,使程序正确执行。,子程序的编程原则,参数的传递,1 参数传递: 当子程序被调用时,一般需要向子程序传递若干参数,由子程序来对这些参数完成特定功能处理;

11、当子程序处理后,需要向调用它的主程序传递结果。这种主程序和子程序之间的信息的传递称为参数的传递。 向子程序传递的参数称为子程序的入口参数,子程序向调用它的程序传递的参数为子程序的出口参数。编程时必须确定要处理数据和返回结果是采用何种方式来实现参数传递。参数传递方式有四种:寄存器、存储器、地址表、堆栈。,2 参数传递方法: 寄存器传递参数 存储器传递参数 地址表传递变量地址 堆栈传递参数,参数的传递,寄存器传递参数 传递数据和地址。常用AL,AX,DX传递数据,SI,DI,BX传递地址 用于入口参数较少的情况 举例:求带符号的字数组ARRAY的元素的最大值,元素的个数由变量COUNT定义,最大值

12、放在MAX 中 (1)分析: 定义一个查找最大值的子程序FINDMAX,通过主程序调用程序。 子程序的功能:将带符号的字数组 ARRAY 的首地址送寄存器SI。元素的个数COUNT 送寄存器CX。 调用后,AX中结果送MAX中。,参数的传递,(2)流程图,主程序,初始化DS,数组首地址送SI 数组个数送CX,调用子程序FINDMAX 找出数组的最大值,最大值送MAX,END,子程序开始,保护现场,设置地址指针, 取第一个数如AX,AX与下一数比较 AX大吗?,修改地址,CX=CX-1 ,CX=0?,恢复现场,子程序结束,数据交换,Y,N,N,Y,DATA SEGMENT count dw 5

13、Array dw -1 ,8,9 ,-2,4 Max dw ? Data ends Code segment assume cs:code ,ds:data Main proc far mov ax,data mov ds,ax lea si,array mov cx,count dec cx call findmax mov max,ax mov ah,4ch int 21h Main endp,Findmax proc mov ax,si Lp1: cmp ax,si+2 jg next xchg ax,si+2 next: add si,2 loop lp1 ret findmax en

14、dp Code ends end main,举例2 从键盘输入一个十进制数(065535),将它转换成16进制输出. 分析 1)该程序定义三个子程序 子程序DECBIN 功能:从键盘输入的十进制数转换成二进制数放在BX中 子程序CRLF完成回车换行的功能 子程序BINHE能:二进制转换成16进制. 2)该程序采用寄存器传送参数 3)在DECBIN子程序中,当键入”*”时,将寄存器SI设置1,然后退出该子程序,继续执行其它子程序,最后判断SI的值是否为1,为1则结束,否则执行循环.,参数的传递,主程序流程图,开始,调用子程序DECBIN,从键盘 接受一个十进制并转化为对应的二进制,调用子程序CR

15、LF实现回车换行,调用子程序BINHEX,把二进制数转换成 16进制并显示,调用子程序CRLF实现回车换行,是否退出,接收下一次键盘输入,END,Y,N,decbin PROC NEAR push ax push cx mov bx,0 mov si,0 Newchar: mov ah,1 int 21h cmp al,* je ext1 sub al,30h jl ext2 cmp al,9 jg ext2 cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx add ax,bx jmp newchar,xchg ax,bx add ax,bx jmp newchar Ext1: mov si,1 Ext2: pop cx pop ax ret Decbin endp,Binhex proc near push cx push dx mov ch,4 Lp: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp a

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号