回复qqq:补充一点
如果NT位为0,使用iret时返回值从堆栈中获取 ....中断返回
如果NT位值为1 ,使用iret (不是中断返回) 而是从Previous Task Link 前一个TSS段选择子找到TSS找到各个寄存器的值返回
不要调试单步执行,会进0环把NT位清零,再使用iretd 因为NT位被置0 从堆栈返回,不会取出前一个TSS里的值 直接蓝屏...坑
使用jmp指令访问任务段:
jmp 0x48:0x123456
如果0x48是TSS段描述符,先修改TR寄存器,再用TR.Base指向的TSS中的值修改当前的寄存器.
CALL 0x48:0x12345678
使用 JMP 和CALL的区别
使用CALL 会储存上一个TSS段选择子到Previous Task Link
使用JMP这个值不变
如果用JMP访问TSS段描述符 EFLAGS寄存器的NT位值不变
如果用CALL访问TSS ,EFLAGS寄存器的NT位会被置1