




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章高级过程 要点 简介堆栈框架递归 MODEL伪指令创建多模块程序 1 简介 堆栈框架变量的作用域和生存期堆栈参数的类型通过传递值或者传递引用来传递参数在堆栈上创建和初始化局部变量编写多模块的程序内存模型和语言关键字 堆栈框架 stackframe 也叫活动记录 它是为传递的参数 程序的返回地址 局部变量和保存的寄存器保留的堆栈空间创建堆栈框架的步骤如果有传递的参数 则压入堆栈子程序被调用 返回地址压栈子程序开始执行 EBP压栈movEBP ESP EBP就被作为寻址所有子程序参数的基址指针使用如果有局部变量 从ESP中减去一个值 为其在堆栈上保留创建局部变量的空间如果如何寄存器需要保存 则压入堆栈 2 堆栈框架 堆栈参数局部变量ENTER和LEAVE指令LOCAL伪指令 2 堆栈框架 2 1堆栈参数 过程参数有两种基本类型 寄存器参数可以优化程序的执行速度容易造成程序代码混乱堆栈参数几乎所有的高级语言都使用堆栈参数INVOKE伪指令 传递值还是传递引用 传递值当向过程传递变量值的一份拷贝时 就称为传递值 passingbyvalue 用于保护参数不被被调用的过程修改传递引用向过程传递变量的地址时 就称为传递引用 passingbyreference 只有希望被调用过程修改变量时 才通过引用方法来传递参数 堆栈参数的访问 intAddTwo intx inty returnx y 堆栈参数的显示访问 AddTwoPROCpushebpmovebp espmoveax ebp 12 addeax ebp 8 popebpret8AddTwoENDP codepush6push5callAddTwo 保存和恢复寄存器 子过程通常在修改寄存器之前保存其原来的值 以便在过程返回之前进行恢复理想情况下 要保存的寄存器应在EBP设为ESP的值之后 为局部变量保留空间之前压栈 MySubPROCpushebpmovebp esppushecxpushedxmoveax ebp 8 popedxpopecxpopebpret8MySubENDP USES操作符后要跟在过程开始时保存并在过程结束时恢复的寄存器列表对于列表中的每个寄存器 MASM自动生成合适的PUSH和POP指令注意 使用显式堆栈参数的过程应避免使用USES操作符由于MASM在过程的开始插入了PUSH指令 因此改变了堆栈参数相对于EBP的偏移地址 进而导致发生了错误 保存和恢复寄存器 2 2局部变量 全局变量和局部变量的优劣比较只有在局部变量所在过程之内的语句才能看到和修改局部变量局部变量使用的存储空间在过程结束后即释放一个过程内的局部变量的名字可以和其他过程内的局部变量名相同 不会发生名字冲突对递归过程以及可能由多个线程同时执行的过程而言 局部变量是必需的局部变量是在运行时栈上创建的 2 2局部变量 MySubPROCpushebpmovebp espsubesp 8movdwordptr ebp 4 10movdwordptr ebp 8 20movesp ebppopebpretMySubENDP voidMySub intX 10 intY 20 访问引用参数 例子 写一个ArrayFill过程 用16位随机整数填充一个数组 它接收两个参数 一是数组的偏移 二是数组的长度 datacount 100arrayWORDcountDUP codepushoffsetarraypushcountcallArrayFill LEA伪指令 FillStringPROCpushebpmovebp espsubesp 32leaesi ebp 30 movesi offset ebp 30 movecx 30L1 movbyteptr esi incesiloopL1addesp 32popebpret 2 3ENTER和LEAVE指令 ENTER指令自动为调用过程创建堆栈框架 他为局部变量保留堆栈空间并在堆栈上保存EBP 该指令执行一下三个动作 在堆栈上压入EBP pushebp 把EBP设为堆栈框架的基指针 movebp esp 为局部变量保留空间 subesp numbytes ENTER指令 ENTER有两个操作数第一个操作数是常量 用于指定要为局部保留保留出多少堆栈空间numbytes第二个操作数指定过程的嵌套层次nestinglevelENTERnumbytes nestinglevelnumbytes总是向上取整为4的倍数 使ESP按双字边界地址对齐Nestinglevel决定了从调用过程复制到当前堆栈框架中的堆栈框架指针数目 默认为0 ENTER指令 MySubPROCenter0 0 MySubENDP MySubPROCpushebpmovebp esp MySubENDP 声明一个没有任何局部变量的过程 ENTER指令 MySubPROCenter8 0 MySubENDP MySubPROCpushebpmovebp espsubesp 8 MySubENDP 为局部变量保留8字节的堆栈空间 LEAVE指令 LEAVE指令释放一个过程的堆栈框架执行和ENTER相反的动作 把EBP和ESP恢复为过程开始时的值 MySubPROCenter8 0 leaveretMySubENDP MySubPROCpushebpmovebp espsubesp 8 movesp ebppopebpretMySubENDP 2 4LOCAL伪指令 LOCAL伪指令在过程内声明一个或多个局部变量语句必须紧接着PROC伪指令所在行之后LOCAL变量列表变量列表由一系列变量定义组成 用 隔开变量定义变量名 类型 2 4LOCAL伪指令 MySubPROCLOCALvar1 BYTE BubbleSortPROCLOCALtemp DWORD SwapFlag BYTE InitArrayPROCLOCALTempArray 10 DWORD 各个变量间用 隔开 数组大小用方括号 2 4LOCAL伪指令 Sub1PROCLOCALarray1 50 DWORD Sub1ENDPSub2PROCLOCALarray2 80 DWORD Sub2ENDPSub3PROCLOCALarray3 300 DWORD Sub3ENDP 因为局部变量在堆栈上分配 所以必须保留足够的堆栈空间 stack4096 3 MODEL伪指令 MODEL伪指令决定内存模式类型 过程命名机制和参数传递约定 MODEL内存模式 模式选项 内存模式tiny small medium compact large huge和flat模式选项语言选项关键字和堆栈的远近选项 语言选项关键字 语言选项关键字C BASIC PASCAL FORTRAN SYSCALL STDCALL语言选项关键字的作用指定参数压栈顺序在过程调用后如何从堆栈上移出参数导出过程名的格式 STDCALL关键字 参数压栈顺序从右到左 从最后一个到第一个 过程调用后如何从堆栈上移出参数在ret指令后提供一个常量 指定在弹出返回地址后将该常量与ESP相加导出过程名的格式 name nn C关键字 参数压栈顺序 与STDCALL相同 从右到左 从最后一个到第一个 过程调用后如何从堆栈上移出参数在调用程序后 ESP要被加上一个常量导出过程名的格式 与STDCALL相同 name nn 4 INVOKE ADDR PROC和PROTO INVOKEADDRPROCPROTO参数分类 INVOKE伪指令 INVOKE伪指令是Intel的CALL指令的增强代替品 可以传递多个参数INVOKE过程名 参数列表 参数之间用 隔开可以任意数量 任意类型不同参数可以在不同的代码行上 dataval1DWORD12345hval2DWORD23456h codeINVOKEAddTwo val1 val2 INVOKE伪指令 AddTwoPROC val1 DWORD val2 DWORDmoveax val1addeax val2retAddTwoENDP codeINVOKEAddTwo val1 val2 INVOKE伪指令 ADDR运算符 ADDR运算符可以在INVOKE调用过程时传递指针 datamyArrayBYTE50DUP codeINVOKEFillArray ADDRmyArrayINVOKESwap ADDRArray ADDRArray 4 PROC伪指令基本格式 标号PROC 属性 USES寄存器列表 参数列表属性远近属性distance语言属性langtype可见性visibility序言prologue PROC伪指令 PROC伪指令允许定义一个过程并且附带参数列表过程名PROC parameter 1 parameter 2 parameter n PROC伪指令 参数名 类型参数名可以是赋予参数的任意名字 它的作用域仅限于当前过程内 不能和全局的变量名或代码标号相同参数列表也可写在同一行 AddTwoPROC val1 DWORD val2 DWORD AddTwoENDP FillArrayPROC pArray PTRBYTE FillArrayENDP PROC伪指令 PROC伪指令 Read FilePROCUSESeaxebx pBuffer PTRBYTELOCALfileHandle DWORDmovesi pBuffermovfileHandler eax retRead FileENDP PROC伪指令 Read FilePROCpushebpmovebp espaddesp 0fffffffchpusheaxpushebxmovesi dwordptr ebp 8 movdwordptr ebp 4 eaxpopebxpopeaxleaveret4Read FileENDP Example1PROCC parm1 DWORD parm2 DWORD Example1ENDP PROC伪指令 Example2PROCSTDCALL parm1 DWORD parm2 DWORD Example2ENDP PROTO伪指令 PROTO伪指令为一个已存在的过程创建原型允许过程在定义前就被调用创建方法拷贝PROC所在的语句 将PROC改成PROTO如果有USES伪指令 则去掉USES伪指令以及其后的寄存器列表 PROTO伪指令 ArraySumPROCUSESesiecx ptrArray PTRDWORD szArray DWORD ArraySumENDP ArraySumPROTO ptrArray PTRDWORD szArray DWORD 举例 计算一个双字数组的和ArraySum使用寄存器参数使用PROC伪指令声明堆栈参数 参数分类 过程的参数分类通常依据调用程序和被调用程序之间的数据传输方向来分类 输入参数输出参数输入 输出参数 例子 交换两个整数 voidswap intx inty inttemp temp x x y y temp voidswap int 疑难提示 错误的操作数尺寸传递错误类型的指针传递立即数 5 递归 递归求和1 2 n计算阶乘n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 5699-2025采光测量方法
- 2025年安全意识培训考试题及答案
- 草坪园艺技术中常见问题的解决方法
- 2025年物流行业高级经理的面试模拟题及答案
- 初中学科竞赛颁奖词模板
- 2025年机械安全员安全培训教材题库
- 2025年品质管理工程师职业资格考试试题及答案解析
- 2025年教师资格考试试题及答案解析
- 课件中文字的加强
- 2025年计算机信息系统师资格认证考试试题及答案解析
- 管径选择与管道压力降计算(三)92~137
- 2024-2025学年辽宁省普通高中高三上学期9月开学联考物理试题(解析版)
- 《卫生法》知识考试参考题库(含答案)
- 2024年认证行业法律法规及认证基础知识
- 《跆拳道》教学大纲
- 初中七年级下册语文阅读理解十篇(含答案)
- 高考必背72篇古诗词
- 《数据库应用基础(Access 2010)》中职全套教学课件
- ISO 55013-2024 资产管理-数据资产管理指南(中文版-雷泽佳翻译-2024)
- 耳穴贴压技术操作评分标准
- 大学生安全教育课件(共41张)
评论
0/150
提交评论