汇编:实模式->保护模式->实模式 切换的注意事项

本文详细阐述了在程序设计中从保护模式返回实模式的必要步骤,包括保存堆栈段和指针、设置规范段、在16位段返回、确保段在全局描述符表(GDT)中定义、理解32位和16位寄存器的差异、使用局部描述符表(LDT)以及返回实模式的代码段限制。这些要点对于理解操作系统内核和底层编程至关重要。
摘要由CSDN通过智能技术生成

1、程序开始时在实模式下要有自己的堆栈段,进入保护模式前先暂存ss及sp的值至某内存处,以便从保护模式返回实模式后恢复到原先的堆栈。
    2、返回实模式前需把各段寄存器设置为规范段,包括SS也要设置
    3、返回实模式前必须在16位段返回,不能在32位段里返回实模式。
    4、返回实模式前的段必须定义在GDT中。
    5、在32位段下操作有关寄存器时,注意32位寄存器和16位寄存器的差别,类似于SP寄存器,应用使用ESP寄存器。
    6、在使用定义在LDT中的段时,一定要使用LLDT先加载LDT缓冲寄存器(LDTR)。
    7、用于返回实模式的代码段的段界限必须为0FFFFH,不能为实际长度,否则要么在跳转到实模式的时候出错要么在跳转到实模式后执行int 21H出错。(个人推测原因如下:80286开始为每个段寄存器增加了段描述符高速缓冲寄存器,而这些缓冲寄存器对于程序员是不可见的,且在实模式下是不能修改的,要想改变这些高速缓冲寄存器的值必须通过在保护模式下修改相应的段寄存器的选择子来实现,这也是为什么在返回实模式之前必须把DS、ES、FS、GS、SS设置为规范段的原因。但是CS是一个特殊的段,不能通过常规方式修改,只能通过段间跳转修改,而一旦跳到实模式后又不能修改了,所以就要求在返回实模式的段的段描述符必须符合实模式下的要求。实模式下的段长度是0FFFFH,也就是64K,如果用于返回实模式的段的段界限不是0FFFFH,会导致返回实模式后实模式下的CS段的高速缓冲寄存器的段长度还是保护模式时的段界限值,这是不正确的,所以要求用于返回实模式的段的段界限必须是0FFFFH。)

ps:所谓规范段是指实模式下的标准段属性,一般段界限为0FFFFH,段属性为可读写。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值