8_高级过程.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8_高级过程

汇编语言 lybliu@cuit.edu.cn, QQ (学校主页?教学平台) 第8章 高级过程 8.2 堆栈帧(stack frame) 8.4 INVOKE,ADDR等伪指令 8.2 堆栈帧(堆栈框架) CPU中用到堆栈的地方很多 通过PUSH和POP指令利用堆栈保存和恢复寄存器、变量等 CALL利用堆栈存放返回地址供RET指令使用 使用堆栈传递子过程参数 利用堆栈实现局部变量 堆栈帧的使用步骤 通常堆栈帧的创建步骤如下: 如果有需传递的参数,将各参数依次用PUSH压栈 通过CALL调用子过程,此指令自动将返回地址压栈 子过程开始,将EBP压栈 把ESP的值传给EBP,后续指令通过EBP访问堆栈空间,可以访问子过程的参数 如果有局部变量,则将ESP减去一个值,为局部变量保留空间。这些空间一样可以通过EBP来访问。 再对其他需要保存的寄存器压栈 堆栈代码示例 AddTwo proc Push ebp Mov ebp,esp Mov eax,[ebp+12] Add eax,[ebp+8] Pop ebp Ret AddTwo endp 8.2.2 寄存器参数的缺点 给子过程传递参数有两种基本方式 通过寄存器传递 执行效率高 代码可能显得混乱 寄存器数量有限 通过堆栈传递 方式灵活通用 效率偏低 通过寄存器传递参数的例子 ;… Mov esi , offset array Mov ecx,lengthof array Mov ebx , type array Call DumpMem ;… 通过堆栈传递参数的例子 push offset array Push lengthof array Push type array Call DumpMem2 使用堆栈传递参数时,参数的两种类型: 值参数(变量或常量的值) 引用/指针参数(变量的地址) 传递值的示例 .data Val1 dword 5 Val2 dword 6 .code Push val2 Push val1 Call AddTwo 传递引用的示例 .data Val1 dword 5 Val2 dword 6 .code Push offset val2 Push offset val1 Call AddTwo 堆栈帧与参数访问的示例 .data Val1 dword 5 Val2 dword 6 .code Push val2 Push val1 Call AddTwo … AddTwo proc push ebp Mov ebp , esp mov eax , [ebp + 12] ;取得val2 add eax , [ebp + 8] ;加上val1 pop ebp ret AddTwo endp 堆栈的清理 因为在调用子过程前,给堆栈压入了一些内容,在子过程返回时,必须调整堆栈指针 调整的方法有两种: 在调用完子过程后通过加法指令改变ESP值 通过 RET imm 指令的形式 用Add的方式清理堆栈 .data Val1 dword 5 Val2 dword 6 .code Push val2 Push val1 Call AddTwo Add esp , 8 用Ret imm的方式清理堆栈 .data Val1 dword 5 Val2 dword 6 .code Push val2 Push val1 Call AddTwo Ret imm 的含义 Ret 指令有两种形式,均表示子过程的返回,功能都是从堆栈中当前位置取出值送给EIP,并调整ESP的值。差别在ESP调整的值不同 Ret ;将esp 加4 Ret imm ;将esp 加4再加上指令中的imm值 8.2.4 调用约定/调用规范 上述显示了不同的调整堆栈的方法 一个是在调用的地方调整(即由调用者调整),C语言中采用这种方式;(C调用约定) 一种是在子过程里调整,Windows 的API采用这种方式,也称作 stdcall调用约定方式。 两种方式各有优缺点 C约定方式 参数按函数中参数从右到左依次入栈 子过程中不处理堆栈调整,由调用者自己调整 支持可变参数个数,如printf函数,每次调用时参量个数可能不同。 stdcall调用约定 参数按函数表中参数从右到左依次入栈 通过在子过程中采用ret imm的方式调整堆栈 Windows API采用这种方式。所以,我们在win32的汇编里一般采用stdcall约定。 例:通过栈传参数调用Windows API 通过堆栈传递8位/16位参数 虽然CPU支持16位堆栈参数,但仍

文档评论(0)

文档精品 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6203200221000001

1亿VIP精品文档

相关文档