第6章子程序设计.ppt
《第6章子程序设计.ppt》由会员分享,可在线阅读,更多相关《第6章子程序设计.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章子程序设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望6.1 堆栈n供程序使用的一块连续的内存空间;n用于保存和读取一些临时的数据 n堆栈中的数据有以下几个特点:n临时性n快速性n动态扩展性 6.1.1 堆栈空间 n相关的3个寄存器:SS,ESP和EBP n在Windows用户模式下 nSS段寄存器通常和DS,ES段寄存器相等 nESP寄存器中的内容作为堆栈的当前指针。nEBP寄存器中的内容作为堆栈的“基准”指针。6.1.2 进栈和出栈指令 1进栈指令P
2、USH 格式:PUSH SRC功能:堆栈指针ESP减4,SRC保存在ESP指向的堆栈单元中。nSRC可以是32位寄存器、内存操作数、立即数或16位段寄存器。2出栈指令POP 格式:POP DST功能:从ESP指向的堆栈单元中取出数据送到DST中,堆栈指针ESP加4。nDST是32位寄存器、内存操作数或16位段寄存器。n立即数不能作为DST。3PUSH、POP指令要点注意进栈和出栈的顺序入栈:PUSH EAXPUSH EBXPUSH ECXPUSH EDX出栈(与入栈相反)POP EDXPOP ECXPOP EBXPOP EAX 4PUSHFD指令格式:PUSHFD功能:堆栈指针ESP减4,EF
3、LAGS标志寄存器保存在ESP指向的堆栈单元中。举例:将EFLAGS标志寄存器复制到EAX中 PUSHFD POP EAX 5POPFD指令 格式:POPFD功能:从ESP指向的堆栈单元中取出数据送到EFLAGS中,堆栈指针ESP加4。举例:PUSHFD和POPFD可以配对使用,用来保存和恢复程序某一时刻的标志。PUSHFD ;保存状态寄存器 ;执行其他的指令POPFD ;恢复状态寄存器6ENTER指令 格式:ENTER SRC1,SRC2功能:SRC1和SRC2是两个立即数。SRC20时,该指令相当于下面的3条指令 PUSH EBPMOV EBP,ESPSUB ESP,SRC17LEAVE指
4、令格式:LEAVE功能:令ESP等于EBP,再从堆栈弹出EBP。相当于:MOV ESP,EBPPOP EBP常用于子程序返回之前 6.1.3 堆栈的用途1临时保存寄存器的值 PUSH EAXPUSH EBXPUSH ECXPUSH EDXPOP EDXPOP ECXPOP EBXPOP EAX堆栈的用途(续)2临时保存变量的值 PUSH CountPOP Count堆栈的用途(续)3用于变量之间的数据传递将变量Var1的内容传递给Var2:PUSH Var1POP Var2堆栈的用途(续)4交换两个变量Var1和Var2的值PUSH Var1PUSH Var2POP Var2 POP Var1
5、 堆栈的用途(续)5用做临时的数据区6子程序的调用和返回n在调用子程序时,CALL指令自动在堆栈中保存其返回地址 n从子程序返回时,RET指令从堆栈中取出返回地址 6.2 子程序 在编写较复杂的程序时,可以把整个功能分解为若干小的易于实现的子功能。每一个子功能由子程序段来完成。汇编语言中的子程序就是C语言中的函数。6.2.1 子程序的定义和调用伪指令PROC和ENDP用来定义子程序 子程序名 PROC ;表示子程序定义开始 RET子程序名 ENDP ;表示子程序定义结束 n子程序名的命名规则和变量相同 n子程序结束时,用RET指令返回主程序 n在主程序中,使用CALL指令来调用子程序n PRO
6、C后面可跟其他参数 6.2.2 调用和返回指令 1CALL指令格式:CALL SRC功能:调用子程序,入口地址为SRC。SRC可以是:n程序名(标号)n32位寄存器n内存操作数n带段寄存器的远地址 常见的CALL指令的用法nCALL 子程序名nCALL指令后面跟的是寄存器或内存操作数,则将寄存器或内存单元中的值取出来作为入口地址,再调用子程序。nCALL指令后面跟的是带段寄存器的远地址,则由段寄存器来决定CALL指令的操作,可能是n(1)段间调用 n(2)提升特权级 n(3)任务切换 2RET指令格式:RET SRC功能:从子程序返回到主程序RET指令用法:(1)段间返回 n子程序是由另外一个
7、段的CALL指令调用的(2)降低特权级 n从级别较低的特权级调用高特权级的程序 3CALL,RET指令对堆栈的使用 在程序中我们设计了两个子程序:n第1个子程序AddProc1使用ESI和EDI作为 加数,做完加法后把和放在EAX中;n第2个子程序AddProc2使用A和B作为加 数,做完加法后把和放在R中。程序如右:callret.asm 结果:10+20=30 50+60=110 nCALL指令执行时,它首先把返回地址作为一个双字压栈,再进入子程序执行。n子程序最后执行的RET指令从堆栈中取出返回地址,返回到主程序。nCALL指令和RET指令执行是必须依赖于堆栈的。高级语言的函数就是汇编语
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 章子 程序设计
限制150内