欢迎来到天天文库
浏览记录
ID:38411900
大小:467.50 KB
页数:99页
时间:2019-06-12
《汇编语言第6章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、汇编语言程序设计讲授人:杜春来第6章子程序结构讲授人:杜春来子程序设计6.1子程序结构程序设计6.1.1.子程序定义伪指令6.1.2.示例讲解6.1.3.子程序参数传递6.1.4.子程序局部变量的表示6.1.5.子程序的嵌套、递归与重入6.2模块化程序设计6.1子程序设计把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率子程序设计要利用过程定义伪指令参数传递是子程序设计的重点和难点子程序可以嵌套;一定条件下,还
2、可以递归和重入子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行主程序与子程序CALLlabel主程序RET子程序回到CALL指令后的指令处——返回地址子程序设计6.1子程序结构程序设计6.1.1.子程序定义伪指令6.1.2.示例讲解6.1.3.子程序参数传递6.1.4.子程序局部变量的表示6.1.5.子程序的嵌套、递归与重入6.2模块化程序设计6.1.1.过程定义伪指令过程名PROC
3、[属性][语言类型][可见性][USES寄存器列表][,形参[:类型]]...过程体过程名ENDP过程名(子程序名)为符合语法的标识符过程属性(1)过程属性分为NEAR或FARNEAR属性的过程只能被相同代码段的其他程序调用,为段内近调用;NEAR16/NEAR32FAR属性的过程可以被相同或不同代码段的程序调用,为段间远调用。FAR16/FAR32过程属性(2)32位的程序会自动选择FAR32或NEAR32;16位的程序会自动选择NEAR16和FAR16tiny、small、compact存储下,过程的缺
4、省属性为near16;medium、large和huge存储模式下,过程的缺省属性为far16。flat模式下,过程的缺省属性为near32。语言类型语言类型说明标识符的命名规则和子程序的调用规则,可以是C,STDCALL,SYSCALL,PASCAL。表6-1具体类型规则:表6-1MASM6.x的语言类型语言类型CSYSCALLSTDCALLPASCALBASICFORTRAN命名约定名字前加下划线名字前加下划线名字变大写名字大写名字大写参数传递顺序从右到左从右到左从右到左从左到右从左到右从左到右平衡堆栈
5、的程序调用程序被调用程序被调用程序被调用程序被调用程序被调用程序保存BP或EBP是是是允许VARARG参数是是是可见性可见性决定子程序是否能被其他模块使用。其选项有PRIVATE,PUBLIC,EXPORT。默认选项是PUBLIC。USESUSES项指定子程序中使用的寄存器,汇编程序会根据这个选项自动生成子程序开始和结束时相应寄存器的保存和恢复代码。应用形参表形参表是子程序需要的入口参数,参数的类型可以是WORD,DWORD等,也可以是VARARG。子程序设计6.1子程序结构程序设计6.1.1.子程序定义伪
6、指令6.1.2.示例讲解6.1.3.子程序参数传递6.1.4.子程序局部变量的表示6.1.5.子程序的嵌套、递归与重入6.2模块化程序设计6.3windowsAPI函数的调用(提升修养)6.1.2示例讲解6.1.2.1子程序调用和返回指令6.1.2.2示例讲解6.1.2.1子程序调用和返回指令子程序调用指令CALL子程序返回指令RETCALL和RET指令均不影响标志位。注意:ret与reti8堆栈平衡6.1.2示例讲解6.1.2.1子程序调用和返回指令6.1.2.2示例讲解子程序实例十六进制数转换为字符把A
7、L内容转换为十六进制字符串把EAX内容转换为十六进制字符串十六进制数转换为字符利用子程序完成将AL低4位中的一位16进制数转换成对应的ASCII码.code;主程序start:…moval,0fh;提供参数ALcallhtoasc;调用子程序…endstart主程序htoascprocandal,0fh;只取al的低4位oral,30h;al高4位变成3cmpal,39h;是0~9,还是0AH~0FHjbehtoendaddal,7;是A~F,其ASCII值还要加上7htoend:ret;子程序返回htoa
8、scendp子程序子程序的定义体应在主程序结束之后或在起始标号start之前,才能避免子程序被自动执行注意:AL内容转换为十六进制字符串分析:1.AL中8位二进制数对应2位十六进制数2.先转换高4位成ASCII码并保存3.然后转换低4位并保存。如果子程序要使用某些寄存器,但又不能改变其原来的内容在过程开始部分先将要修改内容的寄存器顺序压栈(不包括返回值寄存器)在过程最后返回调用程序之前,再将这些寄存器内容逆序弹出
此文档下载收益归作者所有