一、回顾
在前面的课程中我们学习了MOV和LES等修改段寄存器的指令,当时老师说过,CS寄存器比较特殊,不能用MOV和"LCS"进行修改,原因是CS和EIP共同决定下一条指令的地址,要修改CS,就必须同时修改EIP,这也是Intel没有提供"LCS"指令的原因。
二、JMP FAR 执行流程
JMP 0x20:0x004183D7
上面是一条 JMP FAR 指令,CPU执行该指令分为以下5步:
(1)拆分段选择子
0x20 = 00100 0 00
RPL = 0
TI = 0
INDEX = 4
(2)查GDT表得到段描述符
根据段选择子拆得的下标,找到GDT表第5项。如果P=1,S=1,TYPE高1位=1,则表明这是一个代码段,就可以进行下一步。
(3)权限检查
TYPE域高2位是C属性,C=0表示非一致代码段,C=1表示一致代码段。
如果是非一致代码段,要求:CPL == DPL 并且 RPL <= DPLÿ