欢迎来到天天文库
浏览记录
ID:27250095
大小:254.01 KB
页数:45页
时间:2018-11-30
《《子程序设计》ppt课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第6章子程序设计6.1堆栈6.2子程序6.3WindowsAPI6.1堆栈供程序使用的一块连续的内存空间;用于保存和读取一些临时的数据堆栈中的数据有以下几个特点:临时性快速性动态扩展性6.1.1堆栈空间相关的3个寄存器:SS,ESP和EBP在Windows用户模式下SS段寄存器通常和DS,ES段寄存器相等ESP寄存器中的内容作为堆栈的当前指针。EBP寄存器中的内容作为堆栈的“基准”指针。6.1.2进栈和出栈指令1.进栈指令PUSH格式:PUSHSRC功能:堆栈指针ESP减4,SRC保存在ESP指向的堆栈单元中。SRC可以是32位寄存器、内
2、存操作数、立即数或16位段寄存器。2.出栈指令POP格式:POPDST功能:从ESP指向的堆栈单元中取出数据送到DST中,堆栈指针ESP加4。DST是32位寄存器、内存操作数或16位段寄存器。立即数不能作为DST。3.PUSH、POP指令要点注意进栈和出栈的顺序入栈:PUSHEAXPUSHEBXPUSHECXPUSHEDX出栈(与入栈相反)POPEDXPOPECXPOPEBXPOPEAX4.PUSHFD指令格式:PUSHFD功能:堆栈指针ESP减4,EFLAGS标志寄存器保存在ESP指向的堆栈单元中。举例:将EFLAGS标志寄存器复制到E
3、AX中PUSHFDPOPEAX5.POPFD指令格式:POPFD功能:从ESP指向的堆栈单元中取出数据送到EFLAGS中,堆栈指针ESP加4。举例:PUSHFD和POPFD可以配对使用,用来保存和恢复程序某一时刻的标志。PUSHFD;保存状态寄存器…;执行其他的指令POPFD;恢复状态寄存器6.ENTER指令格式:ENTERSRC1,SRC2功能:SRC1和SRC2是两个立即数。SRC20时,该指令相当于下面的3条指令PUSHEBPMOVEBP,ESPSUBESP,SRC17.LEAVE指令格式:LEAVE功能:令ESP等于EBP,再从
4、堆栈弹出EBP。相当于:MOVESP,EBPPOPEBP常用于子程序返回之前6.1.3堆栈的用途1.临时保存寄存器的值PUSHEAXPUSHEBXPUSHECXPUSHEDX…POPEDXPOPECXPOPEBXPOPEAX堆栈的用途(续)2.临时保存变量的值PUSHCount…POPCount堆栈的用途(续)3.用于变量之间的数据传递将变量Var1的内容传递给Var2:PUSHVar1POPVar2堆栈的用途(续)4.交换两个变量Var1和Var2的值PUSHVar1PUSHVar2POPVar2POPVar1堆栈的用途(续)5.用做临
5、时的数据区6.子程序的调用和返回在调用子程序时,CALL指令自动在堆栈中保存其返回地址从子程序返回时,RET指令从堆栈中取出返回地址6.2子程序在编写较复杂的程序时,可以把整个功能分解为若干小的易于实现的子功能。每一个子功能由子程序段来完成。汇编语言中的子程序就是C语言中的函数。6.2.1子程序的定义和调用伪指令PROC和ENDP用来定义子程序子程序名PROC;表示子程序定义开始…RET子程序名ENDP;表示子程序定义结束子程序名的命名规则和变量相同子程序结束时,用RET指令返回主程序在主程序中,使用CALL指令来调用子程序PROC后面可
6、跟其他参数6.2.2调用和返回指令1.CALL指令格式:CALLSRC功能:调用子程序,入口地址为SRC。SRC可以是:程序名(标号)32位寄存器内存操作数带段寄存器的远地址常见的CALL指令的用法CALL子程序名CALL指令后面跟的是寄存器或内存操作数,则将寄存器或内存单元中的值取出来作为入口地址,再调用子程序。CALL指令后面跟的是带段寄存器的远地址,则由段寄存器来决定CALL指令的操作,可能是(1)段间调用(2)提升特权级(3)任务切换2.RET指令格式:RET[SRC]功能:从子程序返回到主程序RET指令用法:(1)段间返回子程序
7、是由另外一个段的CALL指令调用的(2)降低特权级从级别较低的特权级调用高特权级的程序3.CALL,RET指令对堆栈的使用在程序中我们设计了两个子程序:第1个子程序AddProc1使用ESI和EDI作为加数,做完加法后把和放在EAX中;第2个子程序AddProc2使用A和B作为加数,做完加法后把和放在R中。程序如右:callret.asm结果:10+20=3050+60=110CALL指令执行时,它首先把返回地址作为一个双字压栈,再进入子程序执行。子程序最后执行的RET指令从堆栈中取出返回地址,返回到主程序。CALL指令和RET指令执行是
8、必须依赖于堆栈的。高级语言的函数就是汇编语言的子程序。汇编语言传递参数有3种常用方法:(1)通过寄存器传递;(2)通过数据区内的变量来传递;(3)通过堆栈传递。6.2.3C语言函数的参数传递方
此文档下载收益归作者所有