关于从保护模式切换到实模式的相关说明

关于为什么不能从32位的保护模式直接跳转到实模式,而要先跳转到16位的保护模式,再从16位的保护模式跳转到实模式的理解

;****************注意在此用normal选择子对段寄存器进行填充******************************
mov ax, SelectorNormal
317 mov ds, ax
318 mov es, ax
319 mov fs, ax
320 mov gs, ax
321 mov ss, ax

从上述代码可以看出:ds,es,fs,gs,ss这些段寄存器对应的高速缓冲寄存器中的内容可以通过加载normal选择子而得到更新,当向这几个段寄存器中装入normal选择子时,会自动地将normal对应的描述符装载到描述符高速缓冲寄存器中,因normal选择子所对应的描述符的属性符合实模式下的要求,即:段界限为ffffh,段属性也是固定的。
但是:CS寄存器是不可以通过装载normal来更新CS对应的高速缓冲寄存器的,为什么:你能写出这样的指令吗:MOV CS,SelectorNormal,汇编中没有这样的指令。
即然这样,那怎么可以让CS对应的高速缓冲寄存器中的内容符合实模式的要求呢?
方法是这样的:因为CS的值只能通过jmp,call这样的指令去改变,所以,定义一个16位的代码段,这个代码段的描述符定义为:段界限0ffffh,段属性:存在的只执行代码段
假设这个代码段的选择子为:select32,偏移地址为:offsetaddr
用一条转移指令向这段代码跳转:jmp select32:offsetaddr
因现在处于保护模式,所以jmp指令执行的结果是将select32对应的描述符装入cs对应的描述符高速缓冲寄存器中,这个描述符就是符合实模式要求的。这样,CS段寄存器对应的高速缓冲寄存器中的内容终于达到实模式的要求了,所以现在可以进行从保护模式到实模式跳转了,再用一条jmp语句就可以从保护模式跳转到实模式了。

猜你喜欢

转载自lingqi1818.iteye.com/blog/1517406