【OS学习笔记】十六 保护模式四:进入保护模式与在保护模式下访问内存的汇编代码
发布日期:2021-07-01 00:05:39
浏览次数:2
分类:技术文章
本文共 3187 字,大约阅读时间需要 10 分钟。
本文记录的是之前四篇文章所对应的汇编代码。四篇文章分别是:
按照顺序将上述四篇文章对应的内容学完,方能看懂本篇文章的汇编代码。
更加详细的介绍请参考数据《X86汇编语言-从实模式到保护模式》第11章内容。
代码如下:
;代码清单11-1 ;文件名:c11_mbr.asm ;文件说明:硬盘主引导扇区代码 ; ;设置堆栈段和栈指针 mov ax,cs mov ss,ax mov sp,0x7c00 ;计算GDT所在的逻辑段地址 mov ax,[cs:gdt_base+0x7c00] ;低16位 mov dx,[cs:gdt_base+0x7c00+0x02] ;高16位 mov bx,16 div bx mov ds,ax ;令DS指向该段以进行操作 mov bx,dx ;段内起始偏移地址 ;创建0#描述符(描述符是8字节的),它是空描述符,这是处理器的要求 mov dword [bx+0x00],0x00 mov dword [bx+0x04],0x00 ;创建#1描述符,保护模式下的代码段描述符 mov dword [bx+0x08],0x7c0001ff mov dword [bx+0x0c],0x00409800 ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区) mov dword [bx+0x10],0x8000ffff mov dword [bx+0x14],0x0040920b ;创建#3描述符,保护模式下的堆栈段描述符 mov dword [bx+0x18],0x00007a00 mov dword [bx+0x1c],0x00409600 ;初始化描述符表寄存器GDTR mov word [cs: gdt_size+0x7c00],31 ;描述符表的界限(总字节数减一) 因为一共4个段(代码段数据段栈段与空段) lgdt [cs: gdt_size+0x7c00] ;从gdt_size读取6字节的话,就包括了4字节的段线性地址和2字节的偏移地址 in al,0x92 ;南桥芯片内的端口 or al,0000_0010B out 0x92,al ;打开A20 cli ;保护模式下中断机制尚未建立,应 ;先禁止中断 mov eax,cr0 or eax,1 mov cr0,eax ;设置PE位,直接导致处理器的运行进入保护模式 ;以下进入保护模式... ... jmp dword 0x0008:flush ;16位的描述符选择子:32位偏移 ;清流水线,并串行化处理器 [bits 32] flush: mov cx,00000000000_10_000B ;加载数据段选择子(0x10) mov ds,cx ;以下在屏幕上显示"Protect mode OK." mov byte [0x00],'P' mov byte [0x02],'r' mov byte [0x04],'o' mov byte [0x06],'t' mov byte [0x08],'e' mov byte [0x0a],'c' mov byte [0x0c],'t' mov byte [0x0e],' ' mov byte [0x10],'m' mov byte [0x12],'o' mov byte [0x14],'d' mov byte [0x16],'e' mov byte [0x18],' ' mov byte [0x1a],'O' mov byte [0x1c],'K' ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 mov ebp,esp ;保存堆栈指针 push byte '.' ;压入立即数(字节) sub ebp,4 cmp ebp,esp ;判断压入立即数时,ESP是否减4 jnz ghalt pop eax mov [0x1e],al ;显示句点 ghalt: hlt ;已经禁止中断,将不会被唤醒 ;------------------------------------------------------------------------------- gdt_size dw 0 gdt_base dd 0x00007e00 ;GDT的物理地址 在主引导扇区之后 times 510-($-$$) db 0 db 0x55,0xaa
笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。
学习探讨加个人:
qq:1126137994 微信:liu1126137994转载地址:https://lyy-0217.blog.csdn.net/article/details/84963411 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月23日 13时02分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LINUX 使用管道实现无需落地文件GZIP压缩
2019-05-02
pure-ftp 启用虚拟账户的问题
2019-05-02
ipvsadm 安装配置
2019-05-02
linux下nc的使用
2019-05-02
sed学习---字符替换
2019-05-02
Linux shell脚本的字符串截取
2019-05-02
linux和windows下mysql密码怎样清空!
2019-05-02
mysql logs-slave-updates (A -> B -> C)
2019-05-02
关于Java中split方法对空字符串处理问题
2019-05-02
mysql JDBC URL参数解析
2019-05-02
数据库复习(4)
2019-05-02
C# TextBox输入密码显示星号(*)
2019-05-02
C#如何将文件资源添加到resource下
2019-05-02
Android活动的生命周期
2019-05-02
阿里Java首席架构师都在看的“MyBatis源码解析文档”你看过吗?
2019-05-02
火爆全网!2021年最新发布Java面试清单(九大技术点)
2019-05-02
火了火了!2021年字节总监最新福利:240道LeetCode算法刷题笔记!
2019-05-02