控制转移(一)
来源:互联网 发布:男生干净漂亮 知乎 编辑:程序博客网 时间:2024/05/25 18:11
控制转移基本可以分为两大类:同一任务内的转移和任务间的转移(任务切换)。同一任务内的转移又分为:段间转移、特权级不变的段间转移、特权级变换的段间转移。段内转移与实模式下相似,不涉及特权级变换和任务切换。只有段间转移才涉及特权级变换和任务切换。
段间转移指令
与是模式下一样,指令JMP、CALL和RET都具有段间转移的功能,指令INT和IRET总是段间转移。此外,中断、异常也将引起 段间转移。与实模式下相似,段间转移指令JMP和段间调用指令CALL还可以分为段间直接转移和段间间接转移两类。如果指令JMP和CALL在指令中直接含有目标地址指针(保护模式中,段间转移的目的位置由选择子和偏移构成的地址表示,常把它称为目标地址指针),就是段间直接转移;如果指令中含有指向包含目的地址指针的门描述符或TSS描述符的指针,那么就是段间间接转移。
向目标代码段转移的步骤(通过门转移)。
1、判别目标地址指针内的选择子指示的描述符是否为空描述符。空描述符是GDT中第0个描述符,是一个特殊的描述符。目标代码段描述符不能为空描述符,也即选择子的高14位不能为0。
2、从全局或者局部描述附表内读取目标代码段描述符。由选择子内的TI位,确定使用全局描述附表还是局部描述附表。
3、根据情况,检测描述符类型是否正确;调整TPL。
4、把目标代码段描述符内的有关内容装(主要是选择子)载到CS高速缓冲寄存器。
5、判别目标地址指针内的偏移是否越出代码段。
6、装载CS段寄存器和指令指针寄存器EIP;CPL存入CS内选择子的RPL字段。
对于非一致代码段:要求CPL=DPL,RPL<=DPL(内层特权级能访问外层)
一致代码段:要求CPL>=DPL(低特权级访问高特权级)
任务内无特权级转移的转换
所谓任务内无特权级变换的转移:在转移到新的代码段时,当前特权级CPL保持不变。利用段间转移指令JMP、段间调用指令CALL和段间返回指令RET可实现任务内无特权级变换的转移。利用INT和IRET也可以实现任务内无特权级变换的转移。无特权级变换的的转移意味着不调整CPL,很多条件下也就满足RPL=CPL。
- 控制转移(一)
- 控制转移(二)
- 汇编(十五)——控制转移类指令一
- 转移控制
- 控制转移(三)——调用门转移流程
- 控制转移指令
- 控制转移类指令
- Swift控制转移语句
- Swift控制转移语句
- 控制转移语句
- 控制转移语句
- C++ 无条件转移控制
- 汇编(十六)——控制转移类指令二
- 汇编(十七)——控制转移类指令三
- 控制转移(一致代码和非一致代码)
- 链接转移一
- MCS-51控制转移指令
- 控制文件的添加,转移
- X86汇编语言学习手记(3)
- 基于事件的异步模式
- 美丽 无瑕
- Invoke,BeginInvoke干什么用的,内部是怎么实现的?
- vct输出思想
- 控制转移(一)
- AIX去除感叹号警告防范
- 从对工作流理论发展的理解到jBPM4的设计思想
- 借助 GNU autotools 生成 makefile 的简易流程
- MySQL基本数据类型
- 纽约法庭惊现“史上最性感”女黑客
- 华章10月书讯:《并发的艺术》《精益求精:卓越的互联网产品设计与管理》《Essential C++(注释版)》
- X86汇编语言学习手记(2)
- HDR的好处