子程序设计汇编语言程序设计课件.ppt
《子程序设计汇编语言程序设计课件.ppt》由会员分享,可在线阅读,更多相关《子程序设计汇编语言程序设计课件.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言程序设计讲义/张华平/20121汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计第六章第六章 子程序设计子程序设计张华平张华平 副教授副教授 博士博士Email:Email:Website:/Website:/ICTCLASICTCLAS张华平博士张华平博士网络搜索挖掘与平安实验室网络搜索挖掘与平安实验室(wSMSBIT)(wSMSBIT)2021-112021-11汇编语言程序设计讲义/张华平/2012 为了程序共享或模块化设计的需要,为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成可以把一段公共语句序列设计成子程序子程序或或宏指令宏指令的形式。本章介绍子
2、程序的设计方的形式。本章介绍子程序的设计方法。法。汇编语言程序设计讲义/张华平/20126.1 6.1 子程序结构及设计方法子程序结构及设计方法一、子程序结构一、子程序结构在汇编语言中用过程定义伪在汇编语言中用过程定义伪指令定义子程序。过程定义伪指令格式:指令定义子程序。过程定义伪指令格式:过程名过程名PROC PROC 属型属型过程名过程名ENDPENDP汇编语言程序设计讲义/张华平/2012 其中过程名就是子程序名,它也表示子其中过程名就是子程序名,它也表示子程序入口的符号地址。程序入口的符号地址。属型可以是属型可以是NEARNEAR型缺省值或型缺省值或FARFAR型。型。NEARNEAR
3、型子程序只可以被段内调用,而型子程序只可以被段内调用,而FARFAR型型子程序可以被段间或段内调用。子程序可以被段间或段内调用。汇编语言程序设计讲义/张华平/20121 1调用程序和子程序在同一个代码段的程序结构调用程序和子程序在同一个代码段的程序结构CODE CODE SEGMENTSEGMENTMAINMAINPROC PROC FARFARCALLCALL SUB1SUB1RETRETMAINMAINENDPENDPSUB1SUB1PROCPROC ;类型可缺省类型可缺省RETRETSUB1SUB1ENDPENDPCODECODEENDSENDS ;END ;END后跟主程序名后跟主程序
4、名ENDENDMAINMAIN汇编语言程序设计讲义/张华平/20122 2调用程序和子程序在不同段的程序结构调用程序和子程序在不同段的程序结构CODE1CODE1S SEGMENTEGMENTMAINMAINPROC PROC FARFARCALLCALLFAR PTR SUB2FAR PTR SUB2RETRETMAINMAINENDPENDPCODE1CODE1ENDSENDSCODE2CODE2SEGMENTSEGMENTSUB1SUB1PROCPROCFARFARCALL CALL FAR FAR PTR PTR SUB2 SUB2 ;CALL;CALL SUB2SUB2RETRETS
5、UB1SUB1ENDPENDPSUB2SUB2PROCPROCFARFARRETRETSUB2SUB2ENDPENDPCODE2CODE2ENDSENDSENDENDMAINMAIN汇编语言程序设计讲义/张华平/2012二、设计子程序时应注意的问题二、设计子程序时应注意的问题1 1子程序说明子程序说明为为便便于于引引用用,子子程程序序应应在在开开头头对对其其功功能能、调调用用参参数数和和返返回回参参数数等等予予以以说说明明,例例如如参参数数的的类类型型、格格式式及及存存放放位位置置等。等。汇编语言程序设计讲义/张华平/20122 2存放器的保存与恢复存放器的保存与恢复为了保证调用程序的存放器内
6、为了保证调用程序的存放器内容不被破坏,应在子程序开头保存它要用到容不被破坏,应在子程序开头保存它要用到的存放器内容,返回前再恢复它们。的存放器内容,返回前再恢复它们。汇编语言程序设计讲义/张华平/20123 3注意堆栈状态注意堆栈状态在设计含有子程序的程序时,在设计含有子程序的程序时,要密切注意堆栈的变化。这包括要要密切注意堆栈的变化。这包括要注意一注意一切与堆栈有关的操作切与堆栈有关的操作。例如。例如CALLCALL调用类型调用类型和子程序定义类型的一致性,和子程序定义类型的一致性,PUSHPUSH和和POPPOP指指令的匹配令的匹配,通过堆栈传递参数时子程序返回通过堆栈传递参数时子程序返回
7、使用使用RET nRET n指令等指令等,以确保堆栈平衡。以确保堆栈平衡。汇编语言程序设计讲义/张华平/2012北京理工大学北京理工大学-张华平张华平-2021106.2 6.2 堆堆 栈栈 所谓所谓堆栈堆栈,就是供程序使用的一块连续的,就是供程序使用的一块连续的内存空间,一般用于保存和读取临时性的内存空间,一般用于保存和读取临时性的数据。数据。汇编语言程序设计讲义/张华平/2012北京理工大学北京理工大学-张华平张华平-2021116.2.1 6.2.1 堆栈特点堆栈特点 1.1.临时性临时性2.2.快速性快速性3.3.动态扩展性动态扩展性汇编语言程序设计讲义/张华平/2012北京理工大学北
8、京理工大学-张华平张华平-2021126.2.2 6.2.2 堆栈用途堆栈用途 1.1.保护和恢复调用现场保护和恢复调用现场2.2.用于变量之间的数据传递用于变量之间的数据传递3.3.用做临时的数据区用做临时的数据区4.4.子程序的调用和返回子程序的调用和返回汇编语言程序设计讲义/张华平/2012北京理工大学北京理工大学-张华平张华平-2021136.2.3 6.2.3 子程序的返回地址子程序的返回地址 例例.段内调用和返回段内调用和返回设计两个子程序:第设计两个子程序:第1 1个子程序个子程序AddProc1AddProc1使用使用ESIESI和和EDIEDI作为加数,做完加法后把和放在作为
9、加数,做完加法后把和放在EAXEAX中;第中;第2 2个子程序个子程序AddProc2AddProc2使用使用X X和和Y Y作为加数,做完加法作为加数,做完加法后把和放在后把和放在Z Z中。主程序先后调用两个子程序,最中。主程序先后调用两个子程序,最后将结果显示出来。后将结果显示出来。在在AddProc2AddProc2中用到了中用到了EAXEAX,所以要先将,所以要先将EAXEAX保存在保存在堆栈中,返回时再恢复堆栈中,返回时再恢复EAXEAX的值。否那么的值。否那么EAXEAX中的中的值会被破坏。值会被破坏。见程序见程序PROG0603.ASM PROG0603.ASM。汇编语言程序设计
10、讲义/张华平/20126.3 6.3 子程序参数传递子程序参数传递可以通过给子程序传递参数使其更通用。常用的参可以通过给子程序传递参数使其更通用。常用的参数传递方法如下:数传递方法如下:通过存放器传递;通过存放器传递;子程序直接访问模块中变量同一模块;子程序直接访问模块中变量同一模块;通过地址表传递参数地址;通过地址表传递参数地址;通过堆栈传递参数或参数地址。通过堆栈传递参数或参数地址。汇编语言程序设计讲义/张华平/2012北京理工大学北京理工大学-张华平张华平-2021156.3.1 C6.3.1 C语言函数的参数传递方式语言函数的参数传递方式 在在C/C+C/C+以及其他高级语言中,函数的
11、以及其他高级语言中,函数的参数是通过堆栈来传递的。参数是通过堆栈来传递的。C C语言中的语言中的库函数,以及库函数,以及Windows APIWindows API等也都使用等也都使用堆栈方式来传递参数。堆栈方式来传递参数。汇编语言程序设计讲义/张华平/201216C C函数常见的有函数常见的有5 5种参数传递方式调用规那么见下表。种参数传递方式调用规那么见下表。调用规则参数入栈顺序参数出栈说 明cdecl方式从右至左主程序参数个数可动态变化stdcall方式从右至左子程序Windows API常使用fastcall方式用ECX、EDX传递第1、2个参数,其余的参数同stdcall,从右至左
12、子程序常用于内核程序this方式ECX等于this,从右至左子程序C+成员函数使用naked方式从右至左子程序自行编写进入/退出代码汇编语言程序设计讲义/张华平/20121 1通过存放器传递通过存放器传递 这种传递方式使用方便,适用于参数较少的情况。这种传递方式使用方便,适用于参数较少的情况。例把例把BXBX中的中的1616位二进制数转换成十进制并显示位二进制数转换成十进制并显示在屏幕上。在屏幕上。分析:采用从高到低逐个除以十进制位权的方法。分析:采用从高到低逐个除以十进制位权的方法。见程序见程序汇编语言程序设计讲义/张华平/20122 2假假设设调调用用程程序序和和子子程程序序在在同同模模块
13、块中中,子子程程序序可以直接访问模块中的变量可以直接访问模块中的变量例例实实现现数数组组求求和和功功能能。要要求求数数组组求求和和不不考考虑虑溢溢出出情情况况由由子子程程序序实实现现,其其数数组组元元素素及及结结果果均为字型数据。见程序。均为字型数据。见程序。汇编语言程序设计讲义/张华平/20123 3通过地址表传递参数地址通过地址表传递参数地址 适用于参数较多的情况。具体方法是先建立一个适用于参数较多的情况。具体方法是先建立一个地址表,该表由参数地址构成。然后把表的首地址地址表,该表由参数地址构成。然后把表的首地址通过存放器或堆栈传递给子程序。通过存放器或堆栈传递给子程序。例编写一个数组求和
14、子程序,其数组元素及结例编写一个数组求和子程序,其数组元素及结果均为字型数据。另定义两个数组,并编写一个主果均为字型数据。另定义两个数组,并编写一个主程序,通过调用数组求和子程序分别求出两个数组程序,通过调用数组求和子程序分别求出两个数组的和。的和。汇编语言程序设计讲义/张华平/2012 分分析析:虽虽然然主主、子子程程序序在在同同模模块块中中,但但由由于于在在一一个个程程序序中中要要分分别别求求出出两两个个数数组组的的和和,因因此此子子程序不能直接引用数组变量名。程序不能直接引用数组变量名。本本例例用用数数组组首首地地址址、元元素素个个数数的的地地址址、和和地地址址构构成成地地址址表表,通通
15、过过地地址址表表传传送送这这些些参参数数的的地地址址,以便子程序能够访问到所需参数。以便子程序能够访问到所需参数。见程序见程序。汇编语言程序设计讲义/张华平/20124 4通过堆栈传递参数或参数地址通过堆栈传递参数或参数地址 这这种种方方式式适适用用于于参参数数较较多多,或或子子程程序序有有多多层层嵌套、递归调用的情况。嵌套、递归调用的情况。步骤:步骤:主程序把参数或参数地址压入堆栈;主程序把参数或参数地址压入堆栈;子子程程序序使使用用堆堆栈栈中中的的参参数数或或通通过过栈栈中中参参数数地地址址取取到参数;到参数;子子程程序序返返回回时时使使用用RET RET n n指指令令调调整整SPSP指
16、指针针,以以便便删删除除堆堆栈栈中中已已用用过过的的参参数数,保保持持堆堆栈栈平平衡衡,保保证证程序的正确返回。程序的正确返回。汇编语言程序设计讲义/张华平/2012例例完完成成数数组组求求和和功功能能,求求和和由由子子程程序序实实现,要求通过堆栈传递参数地址。现,要求通过堆栈传递参数地址。见程序见程序汇编语言程序设计讲义/张华平/2012 本例通过本例通过BPBP访问堆栈中的参数。访问堆栈中的参数。程程序序的的堆堆栈栈变变化化情情况况参参见见图图6-1,6-1,指指示示了了程程序序中中所所有有入入栈栈操操作作对对堆堆栈栈的的影影响响随随入入栈栈数数据据的的增增加加,SP,SP的的值值不不断断
17、减减小小,堆堆栈栈可可用用空空间间也也随随之之减减少少。图图6-26-2为为已已从从子子程程序序返返回回、而而主主程程序序RETRET指指令令执执行行前前的的堆堆栈栈状状态态,其其中中的的灰灰色色局局部部表表示示执执行行语语句句时时已已弹出的数据。弹出的数据。汇编语言程序设计讲义/张华平/2012 随随着着弹弹出出数数据据的的增增加加,SPSP的的值值不不断断增增大大,堆堆栈栈可可用用空空间间也也随随之之增增大大。子子程程序序中中语语句句RET RET 6 6指指令令,在在从从堆堆栈栈弹弹出出返返回回地地址址后后还还要要使使SPSP值值加加6 6,这这样样就就跳跳过过了了通通过过堆堆栈栈传传递
18、递的的三三个个参参数数,或者说删除了它们。或者说删除了它们。因因此此,当当主主程程序序的的语语句句RETRET指指令令被被执执行行时时,程程序序控控制制从从栈栈顶顶弹弹出出数数字字0 0给给IPIP,弹弹出出PSPPSP的的段段基基址址给给CSCS,于于是是执执行行PSP:0PSP:0处处的的INT INT 20H20H指指令令,正确返回操作系统。正确返回操作系统。汇编语言程序设计讲义/张华平/2012返回返回语句语句执行后堆栈状态执行后堆栈状态语句语句执行后堆栈状态执行后堆栈状态语句语句执行后堆栈状态执行后堆栈状态语句语句执行后堆栈状态执行后堆栈状态语句语句执行后堆栈状态执行后堆栈状态语句语
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 子程序 设计 汇编语言 程序设计 课件
限制150内