欢迎来到天天文库
浏览记录
ID:20813406
大小:100.50 KB
页数:4页
时间:2018-10-16
《过程调用、中断及异常》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、过程调用类型处理器支持两种类型的过程调用:[1]CALL与RET指令[2]ENTER与LEAVE指令,配合CALL与RET指令这两种过程调用机制都使用了程序栈(通常简称为“栈”)保存调用过程的状态、传递参数到被调过程,并为当前执行的过程存储局部变量。栈栈是一组连续的内存单元(见图6-1),它位于SS寄存器指定的段中,最长可达4GBytes(即段的最大长度)。。。PUSH指令将数据压入栈中,ESP寄存器递减,写入项位于栈顶。。。POP指令读取栈顶的数据,ESP寄存器递增。程序或操作系统可以设置多个栈,栈的最大数量取决于段和可用的物理内存。当设置了多
2、个栈时,同一时间只有一个栈——当前栈——是可用的,当前栈所在的段由SS寄存器指定。所有的栈操作都是在当前栈进行的,比如,将ESP寄存器中的值作为内存地址时,它指向的是当前栈的一个地址。图6-1栈结构[1]设定一个栈。。设定一个栈段。。将此栈段的段选择器载入SS寄存器(使用MOV、POP或LSS指令)。。载入栈指针到ESP寄存器(使用MOV、POP或LSS指令)。[2]栈对齐栈指针可以是16位(字)或32位(双字)边界,这取决于栈段的宽度,而栈段的宽度取决于段描述符中的D标志。处理器并不会检查栈指针是否对齐,这是运行在处理器上的程序和任务的职责,未
3、对齐的栈指针会极大地降低性能,有时候还会导致程序故障。[3]栈访问的地址大小属性隐性地使用栈的指令(比如PUSH和POP)有两种地址大小属性,16位或32位。显性地址的属性取决于当前代码段的D标志和是否有67H地址大小前缀。栈顶的地址大小属性决定了在栈访问中使用SP还是ESP。[4]过程链接信息处理器为过程链接提供了两种指针:栈帧基址指针和返回指令指针。。。栈被分为多个帧,每一个栈帧都可以有局部变量、过程链接信息和传递到其它过程的参数。栈帧基址指针(包含在EBP寄存器中)是栈帧内部固定的参考点。。。在转移到被调过程的第一条指令之前,CALL指令会
4、把EIP寄存器中的地址push到当前栈,这一地址称为返回指令指针。处理器并不会跟踪返回指令指针的位置,程序员必须在执行RET指令之前确保栈指针指向返回指令指针。使用CALL与RET调用过程CALL指令可以跳转到当前代码段(近调用)或其它代码段(远调用)的过程。近调用通常用于访问当前运行的程序或任务的本地过程,远调用通常用于访问操作系统过程或不同任务中的程序。RET指令与CALL指令匹配。[1]近调用与返回操作CALL:。。将EIP寄存器的当前值入栈。。载入被调过程的偏移到EIP寄存器。。开始执行被调过程RET:。。pop栈顶值(返回指令指针)到E
5、IP寄存器。。如果RET指令有可选的n参数,递增栈指针(由n参数指定的字节数)。。恢复调用过程的运行[2]远调用与返回操作CALL:。。将CS寄存器的当前值入栈。。将EIP寄存器的当前值入栈。。载入被调过程的段选择器到CS寄存器。。载入被调过程的偏移到EIP寄存器RET:。。pop栈顶值(返回指令指针)到EIP寄存器。。pop栈顶值(返回的代码段的段选择器)到CS寄存器。。如果RET指令有可选的n参数,递增栈指针(由n参数指定的字节数)。。恢复调用过程的运行[3]参数传递在过程之间传递参数有三种方式:通用寄存器、参数表或者栈。[4]保存过程状态信
6、息处理器不会在调用过程时保存通用寄存器、段寄存器或EFLAGS寄存器的内容,所以必须显性地保存需要的值。PUSHA与POPA指令能帮助保存和恢复通用寄存器的内容。PUSHA按照以下顺序将通用寄存器的值入栈:EAX,ECX,EDX,EBX,ESP(执行PUSHA指令之前的值),EBP,ESI和EDI。POPA指令恢复PUSHA指令保存的值(除了ESP值)。PUSHF指令将EFLAGS寄存器的低字入栈,而PUSHFD指令将整个EFLAGS寄存器入栈。[5]调用到其它权级IA-32架构的保护机制提供四种权限等级,编号0到3,数字越大,权限越小。图6-3
7、.保护等级中断与异常处理器提供两种机制中断程序运行:。。中断是由I/O设备触发的异步事件。。异常是当处理器检查到一个或多个预定义条件成立时触发的同步事件。IA-32架构定义了三种异常类型:故障、陷阱与终止。分程序结构语言的过程调用关于ENTER与LEAVE指令,略。
此文档下载收益归作者所有