首页 > 其他分享 >chapter3------保护模式之从保护模式跳转回实模式

chapter3------保护模式之从保护模式跳转回实模式

时间:2024-07-28 17:08:42浏览次数:9  
标签:REAL 保护模式 mov chapter3 LABEL 模式 ------ ax

1、准备合适的段选择子

在保护模式下,段寄存器存储的是段选择子,而不是实际的段地址。要切换到实模式,需要准备一个适当的段选择子,它指向实模式下要访问的代码段。

示例程序:

LABEL_DESC_NORMAL: Descriptor    0,         0ffffh, DA_DRW    ; Normal 描述符

SelectorNormal      equ LABEL_DESC_NORMAL   - LABEL_GDT       ; 段选择子

2、保护模式到实模式的准备工作---为回到实模式的跳转指令指定正确的段地址

以下的程序是后面步骤中的跳转回实模式的指令,放在这里是为了简单说明下

LABEL_GO_BACK_TO_REAL:
     jmp 0:LABEL_REAL_ENTRY  ; 段地址会在程序开始处被设置成正确的值

以下是jmp 0:LABEL_REAL_ENTRY这条指令的机器码,[LABEL_GO_BACK_TO_REAL]存储的是这条指令的首地址,而[LABEL_GO_BACK_TO_REAL+3]存储的就是段地址
跳转指令

示例程序

mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
; 这部分代码将段寄存器 ds、es、ss 设置为代码段的段选择子,即当前执行代码的段选择子。这是为了确保在保护模式下能够正确访问数据和堆栈。

mov sp, 0100h
; sp 寄存器被设置为 0100h,这是为了为堆栈分配一些空间

mov [LABEL_GO_BACK_TO_REAL+3], ax
; 这行代码将当前代码段的段选择子存储在 [LABEL_GO_BACK_TO_REAL+3] 处。这个位置是跳转指令中存储段地址的地方

3、保护模式到实模式---加载段选择子到段寄存器

; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN   32
[BITS   16]
    ; 跳回实模式:
    ; 将段寄存器 ds、es、fs、gs、ss 设置为 SelectorNormal,这个值是在程序的开始处设置的正确的段选择子
    mov ax, SelectorNormal
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax

    ; 这部分代码是关于控制寄存器 cr0 的操作,用于从保护模式切换到实模式。通过清除 cr0 的最低位,可以使处理器进入实模式
    mov eax, cr0
    and al, 11111110b
    mov cr0, eax

    ; 使用 jmp 指令跳转到定义的 LABEL_REAL_ENTRY,以开始执行实模式下的代码
LABEL_GO_BACK_TO_REAL:
     jmp 0:LABEL_REAL_ENTRY  ; 段地址会在程序开始处被设置成正确的值

Code16Len   equ $ - LABEL_SEG_CODE16

4、回到实模式

LABEL_REAL_ENTRY:       ; 从保护模式跳回到实模式就到了这里
  mov ax, cs
  mov ds, ax
  mov es, ax
  mov ss, ax

  ; SPValueInRealMode 是一个在实模式中保存堆栈指针的位置。这行代码将 sp 寄存器设置为这个值,以恢复实模式下的堆栈位置
  mov sp, [SPValueInRealMode]

  in  al, 92h     ; 关闭 A20 地址线
  and al, 11111101b
  out 92h, al

  sti         ; 开中断

  mov ax, 4c00h   ; 回到 DOS
  int 21h

标签:REAL,保护模式,mov,chapter3,LABEL,模式,------,ax
From: https://www.cnblogs.com/winter-z/p/18328401

相关文章

  • 简单网页制作
    网页效果预览这个网页包含图片,链接,字体设置,表格等初学者最好手敲代码,更快熟悉元素和结构完整的代码放在最后了一:代码怎么变成网页之前我们安装了xampp,启动xampp里的apache及sql在xampp下找到htdocs目录新建文件夹改名后缀为.php即可将新建文件用记事本打开在里面输......
  • sublime_text_build_4169 分析
    sublime_text记录目录sublime_text记录1、定位注册对话框license_window_1400A25D2定位按钮事件lambda2、注册函数on_ok_clicked_license_window_1400A3F60check_lic_1400A19BC(topatch)parse_lic_1405B0E48verify_rsa_signature_1405B1B693、网络校验net_check_license_1400A30......
  • Vite本地构建:手写核心原理
    前言接上篇文章,我们了解到vite的本地构建原理主要是:启动一个connect服务器拦截由浏览器请求ESM的请求。通过请求的路径找到目录下对应的文件做一下编译最终以ESM的格式返回给浏览器。基于这个核心思想,我们可以尝试来动手实现一下。搭建静态服务器基于koa搭建一个项目:项......
  • ssy暑假集训暴力算法学习笔记
    7.28集训第六天今天t大学的学长peop1e来给我们讲课啦!人好帅呀嘿嘿嘿....内容如下模拟退火:定义模拟退火可以分成两个部分,一个是"模拟",一个是"退火",先介绍什么叫退火,贴一张百度百科的图吧:\(\\\)那这"退火"的定义有啥用吗?模拟退火就是用来模拟整个退火的过程(其实没啥相似......
  • Windows安装MinIO
    官方文档1.安装MinIO服务器下载MinIO可执行文件:https://dl.min.io/server/minio/release/windows-amd64/minio.exe下一步包括运行可执行文件的说明。不能从资源管理器或双击文件来运行可执行文件https://www.minio.org.cn/download.shtml#/windows2.启动minioserver......
  • 自制基于simplefoc大功率驱动板想法的由来,同时欢迎有相同兴趣的F友一起来玩。。。
      前一阵子,偶然在B站上看了一个simplefoc的介绍视频,代码简洁、算法精妙让人佩服,更让人佩服的是:开源!遂!搜索之!不搜不知道一搜吓一跳,发现太OUT了,原来玩这个算法的人这么多,让我这个整天沉浸在帕克、反帕克、Ualpha、Ubeta...的开发攻城狮汗颜。  出于好奇和对知识的无限渴求(冒......
  • Spring 状态机极简使用
    Spring状态机极简使用本文不探讨状态机的思想与Spring状态机的架构,仅做快速实现参考。Spring状态机官方文档项目参考代码基于SpringBoot配置的快速集成案例maven依赖配置<dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-s......
  • abtest相关知识
    步骤:1.确认改动点(只能是单一因素)2.设计核心指标(点击率/转化率,一般分为直接值和比率值)3.计算实验所需最少样本流量(防止影响过大)基于大数定律(次数多了,频率就等于概率)和中心极限定律(抽样的均值和方差服从整体),前提是样本量足够大,这个足够大是多少,公式如下:(组间指的是预期组......
  • 算法笔记|Day10栈与队列II
    算法笔记|Day10栈与队列II☆☆☆☆☆leetcode150.逆波兰表达式求值题目分析代码☆☆☆☆☆leetcode239.滑动窗口最大值题目分析代码☆☆☆☆☆leetcode347.前K个高频元素(待补充)题目分析代码☆☆☆☆☆leetcode150.逆波兰表达式求值题目链接:leetcode150.......
  • BI-LSTM+Attention 的 tensorflow-1.14 实现
    这里只是用简单例子演示关于self-attention的逻辑,判断一句话的情感是正面或者是负面,具体原理自己百度即可。importtensorflowastfimportnumpyasnptf.reset_default_graph()#词向量维度dim=2#隐层大小hidden=5#时间步大小step=3#情感类别正面......