《子程序设计》ppt课件

《子程序设计》ppt课件

ID:27250095

大小:254.01 KB

页数:45页

时间:2018-11-30

《子程序设计》ppt课件_第1页
《子程序设计》ppt课件_第2页
《子程序设计》ppt课件_第3页
《子程序设计》ppt课件_第4页
《子程序设计》ppt课件_第5页
资源描述:

《《子程序设计》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是两个立即数。SRC20时,该指令相当于下面的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语言函数的参数传递方

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。