代码间的跳转

Posted a-s-m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码间的跳转相关的知识,希望对你有一定的参考价值。

 

代码间跳转的执行流程

以下面代码为例,看CPU在跳转过程做了什么操作。

jmp 0x20,0x004183d7

  (一)段选择子拆分

    0x20的二进制形式  0000_0000_0010_0000;

    RPL=00;

    TI=0;

    INDEX=4;

  (二)查表得到段描述符

    TI=0,所以查GDT表;

    INDEX=4,根据索引找到对应的段描述符;

    四种情况可以跳转:代码段,调用门,TSS任务段,任务门;

    数据段就不行,没有jmp数据段的;

  (三)权限检查

    如果是非一致代码段,要求:CPL=DPL,并且,RPL<=DPL;

    如果是一致代码段,要求:CPL>=DPL;

 

  (四)加载段描述符

    通过上面的权限检查后,CPU会将段描述符加载到CS段寄存器中;

  (五)代码执行

    CPU将CS.Base+Offset的值写入EIP,然后执行CS:EIP指令;

 

直接对代码段进行JMP或CALL的操作,无论目标是一致代码段还是非一致代码段,CPL都不会发生改变,

如果要提升CPL的权限,值能通过调用门。

-------------------------------------------

滴水中级--代码跨段跳转流程

以上是关于代码间的跳转的主要内容,如果未能解决你的问题,请参考以下文章

实现简单的网页间的跳转

Activity间的跳转和数据传递

Activity间传值的方式

(八十五)应用程序间的跳转与消息传递

Source Insight如何实现函数间的跳转与返回

IntelliJ IDEA编辑器的使用技巧