汇编语言 第5章

上传人:ji****72 文档编号:56767247 上传时间:2018-10-15 格式:PPT 页数:45 大小:709.50KB
返回 下载 相关 举报
汇编语言 第5章_第1页
第1页 / 共45页
汇编语言 第5章_第2页
第2页 / 共45页
汇编语言 第5章_第3页
第3页 / 共45页
汇编语言 第5章_第4页
第4页 / 共45页
汇编语言 第5章_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《汇编语言 第5章》由会员分享,可在线阅读,更多相关《汇编语言 第5章(45页珍藏版)》请在金锄头文库上搜索。

1、第5章 子程序设计,作业:实验教程Page 63 3、5、8 11,子程序设计基本概念,把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序调用,就形成子程序 子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率,子程序设计要利用过程定义伪指令,参数传递是子程序设计的重点和难点,子程序可以嵌套; 一定条件下,还可以递归,5.1 子程序的调用与返回,子程序是完成特定功能的一段程序 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行 当运行完子程序功能后,采用RET返回指令回到主程序继续执行,演示,主程序与子程序,CALL label,

2、主程序,RET,子程序,回到CALL指令后的指令处返回地址,子程序定义伪指令,过程名 proc near|far. 过程名 endp,过程名(子程序名)为符合语法的标识符 NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用 FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用,对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为near;在中型、大型和巨型存储模式下,过程的缺省属性为far 对完整段定义格式,过程的缺省属性为near 用户可以在过程定义时用near或far改变缺省属性,子程序的常见格式,subname proc ;具有缺省属性的subname过

3、程push ax ;保护寄存器:顺序压入堆栈push bx ;ax/bx/cx仅是示例push cx ;过程体pop cx ;恢复寄存器:逆序弹出堆栈pop bxpop axret ;过程返回 subname endp ;过程结束,CS,IP,CS,IP,AX,BX,CX,CS,IP,SP,SP,SP,SP,SP,CALL之前,CALL之后,现场保护以后,现场恢复以后,RET以后,程序执行过程中,堆栈变化示意图,;子程序功能:实现光标回车换行 dpcrlf proc far ;过程开始push ax ;保护寄存器AX和ush dxmov dl,0dh ;显示“回车”mov ah,2int 21

4、hmov dl,0ah ;显示“换行”mov ah,2int 21hpop dx ;恢复寄存器DX和AXpop axret ;子程序返回 dpcrlf endp ;过程结束,例5.1 无参数传递的子程序,ALdisp proc far push ax ;过程中使用了AX、CX和ush cxpush ush ax ;暂存axmov dl,al ;转换al的高4位mov cl,4shr dl,clor dl,30h ;al高4位变成3cmp dl,39hjbe aldisp1add dl,7 ;是0Ah0Fh,还要加上7 aldisp1: mov ah,2 ;显示int 21h,例5.2 实现al

5、内容的16进制显示,pop dx ;恢复原ax值到dxand dl,0fh ;转换al的低4位or dl,30hcmp dl,39hjbe aldisp2add dl,7 aldisp2: mov ah,2 ;显示int 21hpop op cxpop axret ;过程返回 ALdisp endp,子程序调用指令,CALL指令分成4种类型(类似JMP) CALL label ;段内调用、直接寻址 CALL r16/m16 ;段内调用、间接寻址 CALL far ptr label ;段间调用、直接寻址 CALL far ptr mem ;段间调用、间接寻址 CALL指令需要保存返回地址: 段

6、内调用入栈偏移地址IP SPSP2, SS:SP、SP+1 IP 段间调用入栈偏移地址IP和段地址CS SPSP2, SS:SP、SP+1 CS SPSP2, SS:SP、SP+1 IP,CALL,子程序返回指令,根据段内和段间、有无参数,分成4种类型 RET ;无参数段内返回 RET i16 ;有参数段内返回 RET ;无参数段间返回 RET i16 ;有参数段间返回 需要弹出CALL指令压入堆栈的返回地址 段内返回出栈偏移地址IP IPSS:SP、SP+1 , SPSP2 段间返回出栈偏移地址IP和段地址CS IPSS:SP、SP+1 ,SPSP2 CSSS:SP、SP+1, SPSP2,

7、RET,返回指令RET的参数,RET i16 ;有参数返回 RET指令可以带有一个立即数 i16 , 则堆栈指针SP将增加 i16 ,即 SPSP+i16 这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数,;主程序mov al,0fh ;提供一位16进制数给ALcall htoasc ;调用子程序. ;子程序: 将AL低4位的一位16进制数转换成ASCII码 Htoasc proc and al,0fh ;只取al的低4位or al,30h ;al高4位变成3cmp al,39h ;是09,还是0Ah0Fhjbe htoendadd al,7 ;是0Ah0Fh,加上7; 0Ah

8、对应的ASCII码是41h htoend: ret ;子程序返回 Htoasc endp,例5.3 数码转换,5.2 子程序设计方法,在设计子程序时,需要考虑的问题是:1、主程序调用子程序,子程序运行结束后返回主程序2、主程序如何把数据(参数)传送给子程序子程序如何把加工结果(参数)传送给主程序,;实现al内容的16进制显示子程序 ALdisp proc far push ax ;过程中使用了AX、CX和ush cxpush ush ax ;暂存axmov dl,al ;转换al的高4位mov cl,4shr dl,clor dl,30h ;al高4位变成3cmp dl,39hjbe aldi

9、sp1add dl,7 ;是0Ah0Fh,还要加上7 aldisp1: mov ah,2 ;显示int 21h,例5.4 16进制数显示,pop dx ;恢复原ax值到dxand dl,0fh ;转换al的低4位or dl,30hcmp dl,39hjbe aldisp2add dl,7 aldisp2: mov ah,2 ;显示int 21hpop op cxpop axret ;过程返回 ALdisp endp,;16进制数显示主程序.model small.stack 256.data array db 04h,05h,16h,27h,38h,49hdb 5ah,6bh,7ch,8dh,

10、9eh,afh; 16进制数.code .startup,mov bx,offset array ;取数据段起始地址mov cx,12 displp: mov al,bx ;循环结构call ALdisp ;调用显示过程mov dl, ;显示一个逗号,分隔数据mov ah,2int 21hinc bxloop displp ;调用程序段结束.exit 0end,HTOASC proc far ;将AL低4位表达的一位16进制数转换为ASCII码and al,0fhcmp al,9jbe htoasc1add al,37h ;是0AH0FH,加37Hret ;子程序返回 htoasc1: add

11、 al,30h ;是09,加30Hret ;子程序返回 HTOASC endp,例5.5 具有多个出口的子程序,5.2.1 子程序的参数传递,入口参数(输入参数):主程序提供给子程序 出口参数(输出参数):子程序返回给主程序 参数的形式: 数据本身(传值) 数据的地址(传址) 传递的方法: 寄存器 变量 堆栈,子程序计算数组元素的“校验和” “校验和”是指不记进位的累加入口参数: 数组的逻辑地址(传址)元素个数(传值) 出口参数: 求和结果(传值),例5.6 求校验和,把参数存于约定的寄存器中,可以传值,也可以传址。 子程序对带有出口参数的寄存器不能保护和恢复(主程序视具体情况进行保护) 子程

12、序对带有入口参数的寄存器可以保护,也可以不保护;但最好一致例5.6a 入口参数:CX元素个数,DS:BX数组的段地址:偏移地址 出口参数:AL校验和,用寄存器传递参数,.startup;设置入口参数(含有DS数组的段地址)mov bx,offset array;BX数组的偏移地址mov cx,count ;CX数组的元素个数call checksuma ;调用求和过程mov result,al ;处理出口参数.exit 0,例5.6a 主程序,checksuma proc farxor al,al ;累加器清0 suma: add al,bx ;求和inc bx ;指向下一个字节loop su

13、maret checksuma endpend,例5.6a 子程序,主程序和子程序直接采用同一个变量名共享同一个变量,实现参数的传递 不同模块间共享时,需要声明例5.6b 入口参数: count元素个数, array数组名(含段地址:偏移地址) 出口参数: result校验和,用变量传递参数,.startup;设置入口参数(含有DS数组的段地址)mov bx,offset array;BX数组的偏移地址mov cx,count ;CX数组的元素个数call checksuma ;调用求和过程.exit 0,例5.6b 主程序,;子程序 Checksumb proc farpush axpush

14、 bxpush cxxor al,al ;累加器清0mov bx,offset array;BX数组的偏移地址mov cx,count;CX数组的元素个数,例5.6b 子程序,sumb: add al,bx ;求和inc bxloop sumbmov result,al ;保存校验和pop cxpop bxpop axret checksumb endp,例5.6b2/2,主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数 子程序将出口参数压入堆栈,主程序弹出堆栈取得它们例5.6c 入口参数: 顺序压入偏移地址和元素个数 出口参数: AL校验和,用堆栈传递参数,.startupmov a

15、x,offset arraypush axmov ax,countpush axcall checksumcadd sp,4 ;因为前面已经压了两次堆栈mov result,al.exit 0,例5.6c 主程序,图示,要注意堆栈的分配情况,保证参数存取正确、子程序正确返回,并保持堆栈平衡,checksumc proc nearpush bpmov bp,sp ;利用BP间接寻址存取参数push bxpush cxmov bx,bp+6 ;SS:BP+6指向偏移地址mov cx,bp+4 ;SS:BP+4指向元素个数xor al,al sumc: add al,bx inc bxloop su

16、mcpop cxpop bxpop bpret checksumc endp,例5.6c 子程序,图示,堆栈区及参数,主程序实现平衡堆栈: add sp,n子程序实现平衡堆栈: ret n,5.2.2 子程序的嵌套,子程序内包含有子程序 的调用就是子程序嵌套 没有什么特殊要求,ALdisp proc ;实现al二位16进制数显示 push axpush cx push ax ;暂存axmov cl,4shr al,cl ;转换al的高4位call htoasc ;子程序调用(嵌套)pop ax ;转换al的低4位 call htoasc ;子程序调用(嵌套)pop cxpop axret ALdisp endp,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

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