大学ppt课件单片机原理与应用设计子程序结构

上传人:风*** 文档编号:241954970 上传时间:2024-08-07 格式:PPT 页数:30 大小:163.14KB
返回 下载 相关 举报
大学ppt课件单片机原理与应用设计子程序结构_第1页
第1页 / 共30页
大学ppt课件单片机原理与应用设计子程序结构_第2页
第2页 / 共30页
大学ppt课件单片机原理与应用设计子程序结构_第3页
第3页 / 共30页
点击查看更多>>
资源描述
单击此处编辑母版样式,单击此处编辑幻灯片母版样式,第二层,第三层,第四层,第五层,*,*,第6章 子程序结构,本章重点介绍子程序的调用与返回指令、子程序调用时参数传递方法和子程序的设计方法。,8/7/2024,1,第6章 子程序结构本章重点介绍子程序的调用与返回指令、子程,介绍,P139,子程序又叫过程,相当与高级语言的过程和函数。,子程序结构是模块化程序设计的基础。,结构:,procname PROC Attribute,.,procname ENDP,Attribute,为,NEAR(,段内调用),FAR(,段间调用),2,介绍 P139子程序又叫过程,相当与高级语言的过程,一.子程序的设计方法,3,一.子程序的设计方法3,1.子程序的调用和返回,P140,call,格式:CALL 目标地址,功能:暂停正在执行的程序,转去执行相应的子程序,目标地址给出调用于程序的入口地址。,在子程序执行完后,由子程序中的RET指令返回至CALL指令的下一条指令继续执行。为此,CALL指令同时需要把断点地址(即CALL指令的下条指令的CS和IP)入栈保护,CALL指令不影响标志位,但应特别注意在于程序中对相关寄存器的保护。,CALL指令实质上是一条特殊的、带返回的无条件转移指令。,4,1.子程序的调用和返回P1404,CALL指令目标地址的形成方式与JMP指令完全类似,即有段内直接调用、段内间接调用、段间直接调用与段间间接调用四种方式。直接调用其目标地址直接出现在CALL指令中,间接调用其目标地址存放在指令所指向的寄存器或内存单元中。,5,CALL指令目标地址的形成方式与JMP指令完全类似,即有段,(1)段内直接接调用,格式,:CALL NEAR PTR 标号,功能,:首先将断点的IP值压入推栈,再将从指令中得到的子程序相对偏移量加到IP,然后根据IP转相应子程序执行。,如:,CALL OUTPUT;段内直接调用子程序output,6,(1)段内直接接调用格式:CALL NEAR PTR 标号6,(2)段内间接调用,格式,:CALL REG|MEM,功能,:首先将断点的IP值压入堆栈,再将子程序的地址偏移量送入IP,然后根据IP转相应子程序执行。子程序的地址偏移量为指令中指定的16位通用寄存器或存储单元值。,如:,CALL BX,CALL WORD PTR BX,7,(2)段内间接调用格式:CALL REG|MEM7,(3)段间直接调用,格式,:CALL FAR PTR 标号,功能:,首先把断点的CS值压入堆栈,并将于程序的段地址送入CS再把断点的IP值压入堆栈,把子程序的地址偏移量送入IP。然后根据CS:IP转相应于程序执行。,如:,CALL FAR PTR OUTPUT;,段间直接调用子程序,OUTPUT,8,(3)段间直接调用格式:CALL FAR PTR 标号8,(4)段间间接调用,格式,:CALL DWORD PTR MEM,功能,:首先把断点的CS压入堆栈,并将指令中指定的双字存储器的第二个字的内容送入CS;再把断点的IP压入堆栈,再将双字指针的第一个字的内容送入IP。然后根据CS:IP转相应子程序执行。,如:,CALL DWORD PTR BX,CALL DWROD PTR MEM32,9,(4)段间间接调用格式:CALL DWORD PTR MEM,2返回指令RET,P141,返回指令RET通常作为一个子程序的最后一条指令,用以返回到调用这个于程序的主程序断点处继续执行。与调用指令相对应,返回指令RET也有段内返回与段间返回两种形式。是段内返回,还是段间返回,汇编程序能自动确定,并形成相应的返回指令。返回指令有两种格式:,10,2返回指令RETP141返回指令RET通常作为一个,格式一:RET,格式一为不带偏移量的返回。,若是段内的RET指令(机器码为C3HC2H),只返回主程序断点处的IP值。即从堆栈弹出一个字送入IP,且SP加2。然后返回CS:IP处继续执行程序。此时的返回也称近返回。,若为段间的RET指令(机器码为CBHCAH),则要返回主程序断点处的段地址和IP值。将从堆栈弹出一个字送CS,SP+2SP,再从堆栈弹出一个字送Cs,同时SP加2。然后返回CS:IP处继续执行程序。此时RET也称远返回。,11,格式一:RET11,格式二:RET n,格式二为带偏移量的返回,与格式一完全类似,只是在修改堆栈指针时需增加SPSP+n处理。n一般为偶数,格式二适合主程序向于程序利用堆栈传递参数的情况。在利用堆栈传递参数时,主程序先将参数压入堆栈,在于程序中将参数取出,为找到正确的返回地址,保持堆栈平衡,应将堆栈指针修正。,返回指令RET对标志位无影响。,12,格式二:RET n12,例7-3 求两个数的最大公约数,P144,用展转相除法 在我们编程中用的最多方法就是展转相除法了,展转相除法是古希腊求两个正整数的最大公约数的也叫欧几里德算法,用较大的数除以较小的数,结果的余数和被除数构成新的一对数,继续做上面的除法,直到大数被小数求尽。,13,例7-3 求两个数的最大公约数P144用展转相除法 在,GYSPROC,PUSHAX,PUSHBX,PUSHDX,G1:XORDX,DX,DIVBX,CMPDX,0,JZEXIT,MOVAX,BX,MOVBX,DX,JMPG1,EXIT:MOVCX,BX,POPDX,POPBX,POPAX,RET,GYSENDP,14,GYSPROC14,调用程序和子程序之间的信息传送叫参数传送。,a.通过寄存器传送参数(约定寄存器法),P104,例1:十进制到十六进制数的转换(BX)。,流程图,开始,调用DECIBIN,调用crlf,调用binihex,调用CRLF,结束,从键盘取得十进制,数,保存在BX中,显示回车和换行,用十六进制形式,显示BX中的数,3.子程序的参数传送,15,调用程序和子程序之间的信息传送叫参数传送。开始调用DEC,;从键盘输入十进制数,然后按十六进制显示,DATA SEGMENT,DATA ENDS ;同学们掌握各段的结构,STACK SEGMENT PARA STACK STACK,DB 100H DUP(?),STACK ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,SS:STACK,;分配段址,但不会给段寄存器付值,16,;从键盘输入十进制数,然后按十六进制显示16,START:,MOV AX,DATA,MOV DS,AX ;给段寄存器DS付值,call DECIBIN,call binihex;子程序调用,call crlf,MOV AH,4CH,INT 21H ;主程序的返回方式一(DOS功能调用返回),17,START:17,DECIBIN proc near,push ax,push cx,pushf,mov bx,0,newchar:,mov ah,1 ;键盘输入,int 21h,sub al,30h,jl exit ;9退出,cbw,xchg ax,bx,mov cx,10,mul cx,xchg ax,bx,add bx,ax,jmp newchar,exit:popf,pop cx,pop ax,ret,DECIBIN endp,18,DECIBIN proc near cbw18,binihex proc near,push ax,push cx,push dx,pushf,mov ch,4,rotate:,mov cl,4,rol bx,cl,mov al,bl,and al,0fh,add al,30h ;09,cmp al,3ah,jl printit,add al,7h ;AF,printit:,mov dl,al,mov ah,2,int 21h,dec ch,jnz rotate,mov dl,H,mov ah,2,int 21h,popf,pop dx,pop cx,pop ax,ret,binihex endp,19,binihex proc nearprintit:1,crlf PROC NEAR,push ax,push dx,pushf,mov dl,0dh,mov ah,2,int 21h,mov dl,0ah,mov ah,2,int 21h,popf,pop dx,pop ax,ret,crlf ENDP,CODE ENDS,END START,20,crlf PROC NEAR20,b.如果过程和调用程序在同一模块中,则过程可直接访问模块中的变量。(约定变量法),Data segment,ary dw 100 dup(?),count dw 100,sum dw?,Data ends,code segment,main proc far,assume cs:code,ds:data,start:push ds,sub ax,ax,push ax,mov ax,data,mov ds,ax,21,b.如果过程和调用程序在同一模块中,则过程可直接访问模块中的,call near ptr proadd,ret,main endp,Proadd proc near,push ax,.,Proadd endp,Code ends,end start,22,22,c.通过地址表传送参数地址(约定存储器法),建立一个地址表,把要传送的参数存在地址表中,然后把地址表的首地址通过寄存器BX传送到子程序。,mov table,offset num,mov table+2,offset n,mov table+4,offset total,mov bx,offset table,call proadd,23,c.通过地址表传送参数地址(约定存储器法)23,d.通过堆栈传送参数或参数地址(堆栈法),采用在主程序里把参数地址保存到堆栈中,在子程序里从堆栈中取出参数以达到传送参数的目的。,注:用BP保存原来的SP的值,以便取得堆栈中的地址.,24,d.通过堆栈传送参数或参数地址(堆栈法)24,e.多个模块之间的参数传送问题,(1)外部符号,PUBLIC symbol,在一个模块中定义的符号在提供给其他模块使用时,必须用PUBLIC定义.,EXTRN symbol name:type,在另一模块中定义而在本模块中使用的符号必须用EXTERN伪操作。如符号为变量,则类型为BYTE/WORD/DWORD;如符号为标号或过程名,则类型为NEAR/FAR,25,e.多个模块之间的参数传送问题25,二.子程序的嵌套,P153,主程序,CALL PROC-A,子程序A,Proc_a,Call proc_b,ret,子程序B,Proc-b,ret,26,二.子程序的嵌套P153主程序子程序A子程序B,三、子程序的结构,子程序的代码部分通常有如下结构:,(1)保护现场:,(2)根据入口参数,获取要处理的数据;,(3)进行数据的加工处理;,(4)根据出口参数,将处理后的数据送至指定区域;,(5)恢复现场;,(6)返回主程序。,27,三、子程序的结构子程序的代码部分通常有如下结构:27,子程序中往往还包含有该子程序调用的详细说明,用以向使用考提供足够的信息。子程序说明通常包括如下内容:,(1)子程序名称;,(2)子程序功能;,(3)入口参数:,(4)出口参数;,(5)使用的寄存器和存储单元:,(6)调用的其他子程序;,(7)子程序调用示范。,28,子程序中往往还包含有该子程序调用的详细说明,用以向使用考提,【例】,编写回车换行子程序。,在要求显示多个字符、数字的场合,常常要用到换行显示,将其定义为一子程序。子程序代码如下:,CRLF PROC NEAR,PUSH AX,PUSH DX,MOV AH,02H,MOV DL,0AH,INT 21H,MOV AH,02H,MOV DL,0DH,INT 21H,POP DX,POP AX,RET,CRLF ENDP,29,【例】编写回车换行子程序。29,作业,Page 168 13、14、15,30,作业Page 168 13、14、15 30,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!