欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第6章子程序设计.ppt

    • 资源ID:2578155       资源大小:254.01KB        全文页数:45页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第6章子程序设计.ppt

    第6章 子程序设计,6.1 堆栈 6.2 子程序 6.3 Windows API,6.1 堆栈,供程序使用的一块连续的内存空间; 用于保存和读取一些临时的数据 堆栈中的数据有以下几个特点: 临时性 快速性 动态扩展性,6.1.1 堆栈空间,相关的3个寄存器:SS,ESP和EBP 在Windows用户模式下 SS段寄存器通常和DS,ES段寄存器相等 ESP寄存器中的内容作为堆栈的当前指针。 EBP寄存器中的内容作为堆栈的“基准”指针。,6.1.2 进栈和出栈指令,1进栈指令PUSH 格式:PUSH SRC 功能:堆栈指针ESP减4,SRC保存在ESP指向的堆栈单元中。 SRC可以是32位寄存器、内存操作数、立即数或16位段寄存器。,2出栈指令POP,格式:POP DST 功能:从ESP指向的堆栈单元中取出数据送到DST中,堆栈指针ESP加4。 DST是32位寄存器、内存操作数或16位段寄存器。 立即数不能作为DST。,3PUSH、POP指令要点,注意进栈和出栈的顺序 入栈: PUSH EAX PUSH EBX PUSH ECX PUSH EDX,出栈 (与入栈相反) POP EDX POP ECX POP EBX POP EAX,4PUSHFD指令,格式:PUSHFD 功能:堆栈指针ESP减4,EFLAGS标志寄存器保存在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 EBP MOV EBP, ESP SUB ESP, SRC1,7LEAVE指令,格式:LEAVE 功能:令ESP等于EBP,再从堆栈弹出EBP。 相当于: MOV ESP, EBP POP EBP 常用于子程序返回之前,6.1.3 堆栈的用途,1临时保存寄存器的值 PUSH EAX PUSH EBX PUSH ECX PUSH EDX POP EDX POP ECX POP EBX POP EAX,堆栈的用途(续),2临时保存变量的值 PUSH Count POP Count,堆栈的用途(续),3用于变量之间的数据传递 将变量Var1的内容传递给Var2: PUSH Var1 POP Var2,堆栈的用途(续),4交换两个变量Var1和Var2的值 PUSH Var1 PUSH Var2 POP Var2 POP Var1,堆栈的用途(续),5用做临时的数据区 6子程序的调用和返回 在调用子程序时,CALL指令自动在堆栈中保存其返回地址 从子程序返回时,RET指令从堆栈中取出返回地址,6.2 子程序,在编写较复杂的程序时,可以把整个功 能分解为若干小的易于实现的子功能。每 一个子功能由子程序段来完成。 汇编语言中的子程序就是C语言中的函数。,6.2.1 子程序的定义和调用,伪指令PROC和ENDP用来定义子程序 子程序名 PROC ;表示子程序定义开始 RET 子程序名 ENDP ;表示子程序定义结束 子程序名的命名规则和变量相同 子程序结束时,用RET指令返回主程序 在主程序中,使用CALL指令来调用子程序 PROC后面可跟其他参数,6.2.2 调用和返回指令,1CALL指令 格式:CALL SRC 功能:调用子程序,入口地址为SRC。 SRC可以是 : 程序名(标号) 32位寄存器 内存操作数 带段寄存器的远地址,常见的CALL指令的用法,CALL 子程序名 CALL指令后面跟的是寄存器或内存操作数,则将寄存器或内存单元中的值取出来作为入口地址,再调用子程序。 CALL指令后面跟的是带段寄存器的远地址,则由段寄存器来决定CALL指令的操作,可能是 (1)段间调用 (2)提升特权级 (3)任务切换,2RET指令,格式:RET SRC 功能:从子程序返回到主程序 RET指令用法: (1)段间返回 子程序是由另外一个段的CALL指令调用的 (2)降低特权级 从级别较低的特权级调用高特权级的程序,3CALL,RET指令对堆栈的使用,在程序中我们设计了两个子程序: 第1个子程序AddProc1使用ESI和EDI作为 加数,做完加法后把和放在EAX中; 第2个子程序AddProc2使用A和B作为加 数,做完加法后把和放在R中。 程序如右:callret.asm 结果:10 + 20 = 30 50 + 60 = 110,CALL指令执行时,它首先把返回地址作为一个双字压栈,再进入子程序执行。 子程序最后执行的RET指令从堆栈中取出返回地址,返回到主程序。 CALL指令和RET指令执行是必须依赖于堆栈的。,高级语言的函数就是汇编语言的子程序。 汇编语言传递参数有3种常用方法: (1)通过寄存器传递; (2)通过数据区内的变量来传递; (3)通过堆栈传递。,6.2.3 C语言函数的参数传递方式,1cdecl方式,cdecl方式是C语言函数的默认方式 调用规则 : (1)使用堆栈传递参数。 (2)主程序按从右向左的顺序将参数逐个压栈, (3)在子程序中,使用EBP+X的方式来访问参数。 (4)子程序用RET指令返回。 (5)由主程序执行“ADD ESP, n”指令调整ESP,达到堆栈平衡。 (6)子程序的返回值放在EAX中。,2stdcall方式,Windows API采用的调用规则是stdcall方式 调用规则: 1.使用堆栈传递参数,使用从右向左的顺序将参数入栈。 2.堆栈的平衡是由子程序来完成的。 子程序使用“RET n”指令 子程序的返回值放在EAX中,3fastcall方式,调用方式和stdcall类似 调用规则: (1)它使用ECX传递第1个参数,EDX传递第2个参数。 (2)其余参数采用从右至左的顺序入栈。(3)由子程序在返回时平衡堆栈。,4this方式,在C+类的成员函数中使用。它使用ECX传递this指针,即指向对象。 调用方式和stdcall类似。,5naked方式,想由编程者自行编写函数内的所有代码, 就使用naked调用规则。,6.2.4 子程序的参数传递方式,汇编语言中,向子程序传递参数可以 按照C程序的方式来处理 。 例如, 下面的子程序AddProc3采用cdecl方式,AddProc4采用stdcall方式。 程序示例:callrule.asm,6.2.5 带参数子程序的调用,注意的两个方面 (1)参数转换。子程序中用ebp+8表示第1个参数,用ebp+12表示第2个参数,用ebp+16表示第3个参数,依次类推。 (2)平衡堆栈。 一种方式是在子程序中用“RET n”平衡堆栈; 另一种方式是在主程序中用“ADD ESP, n” 平衡堆栈。,invoke伪指令,1使用invoke伪指令对主程序和子程序的简化 在调用子程序时,使用invoke伪指令,后面跟子程序名和各个参数的取值即可。 使用invoke伪指令对前面的callrule.asm进行简化,有以下几点:,invoke伪指令,(1)子程序的调用规则 (2)子程序的参数 (3)子程序的进入/退出代码 (4)子程序的返回指令 (5)主程序中采用invoke语句 程序示例:invoke.asm 机器指令列表:invoke2,对照invoke.asm和机器指令列表,可以观 察到以下几点: (1)自动加入的指令 AddProc5,AddProc6中的一些语句是MASM自动加入的 (2)参数的替换 参数a用EBP+8替换,参数b用EBP+12替换。 (3)返回指令 AddProc5采用C规则,用“RET”返回;AddProc6采用stdcall规则,用“RET 8”返回,(4)invoke语句转换为CALL指令 invoke后面跟的参数被逐一压入堆栈,再跟上一 条CALL指令。 (5)堆栈平衡 对AddProc5的调用,在CALL指令后面用“ADD ESP, 8”来平衡堆栈。 对AddProc6的调用,由于在返回时使用了“RET 8” 在CALL指令后面不需要“ADD ESP, 8”,invoke伪指令(续),2使用invoke调用子程序的一些限制 invoke伪指令后面跟的参数必须直接能够作为PUSH指令的源操作数。 错误的写法:invoke addproc, r*2, 30 正确的写法: MOV EBX, r SHL EBX, 1 invoke addproc, EBX, 30,6.2.6 子程序中的局部变量,定义:仅在子程序内部使用的变量,可提高程序的模块化程度也被 称为自动变量。 局部变量的作用域是子程序,1局部变量的实现原理,(1)在进入子程序的时候,通过修改堆栈指针ESP来预留出需要的空间。用SUB ESP, x指令预留空间,x为该子程序中所有局部变量使用的空间。 (2)返回主程序之前,通过恢复ESP释放空间,在堆栈中不再为子程序的局部变量保留空间。,2堆栈帧,包括以下几个部分: 子程序的参数 返回地址 主程序的EBP 子程序的局部变量 在子程序中: 由EBP可确定堆栈帧的位置 由EBP+0可以得到主程序的堆栈帧,3在子程序中使用局部变量,local伪指令可以在子程序中定义局部变量 格式: local 变量名1重复数量:类型,变量名2重 复数量:类型 程序示例:local.asm 结果:r=20 s=10,4直接使用局部空间,如果不使用local伪指令,可以直接在堆栈中为子程序分配局部变量空间,但不如用local伪指令方便。,5ADDR伪操作符,ADDR伪操作符可以取出局部变量的地址 格式:ADDR 局部变量 ADDR只能在invoke语句中使用 程序示例:addr.asm 结果:r=50 s=40,6.2.7 子程序的嵌套,程序中同样可以调用其他子程序,构成子程序的嵌套。 嵌套深度没有一个具体的限制,主要取决于堆栈的容量。 子程序调用时,返回地址要保存在堆栈中 子程序中的局部变量也要在堆栈中分配。,6.2.8 子程序的递归,子程序自己调用自己的情况称做递归。 以计算xn为例来说明递归子程序的写法: C语言程序:recurse.c 汇编程序: recurse.asm 结果:x=3 n=5 x(n) =243,6.3 Windows API,API在实质上也是一个子程序 ,主要有: 1printf 2scanf 3MessageBox 4确定函数的声明语句和库文件 5MASM32工具包,

    注意事项

    本文(第6章子程序设计.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开