【OS学习笔记】十六 保护模式四:进入保护模式与在保护模式下访问内存的汇编代码

本文记录的是之前四篇文章所对应的汇编代码。四篇文章分别是:

  • 【OS学习笔记】十二 现代处理器的结构和特点
  • 【OS学习笔记】十三 保护模式一:全局描述符表(GDT)
  • 【OS学习笔记】十四 保护模式二:段描述符
  • 【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制

按照顺序将上述四篇文章对应的内容学完,方能看懂本篇文章的汇编代码。

更加详细的介绍请参考数据《X86汇编语言-从实模式到保护模式》第11章内容。

代码如下:

         ;代码清单11-1;文件名:c11_mbr.asm;文件说明:硬盘主引导扇区代码 ;;设置堆栈段和栈指针 mov ax,cs      mov ss,axmov 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],0x00mov 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],0x00007a00mov dword [bx+0x1c],0x00409600;初始化描述符表寄存器GDTRmov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一) 因为一共4个段(代码段数据段栈段与空段)  lgdt [cs: gdt_size+0x7c00]				  ;从gdt_size读取6字节的话,就包括了4字节的段线性地址和2字节的偏移地址in al,0x92                         ;南桥芯片内的端口 or al,0000_0010Bout 0x92,al                        ;打开A20cli                                ;保护模式下中断机制尚未建立,应 ;先禁止中断 mov eax,cr0or eax,1mov 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,cxmov esp,0x7c00mov ebp,esp                        ;保存堆栈指针 push byte '.'                      ;压入立即数(字节)sub ebp,4cmp ebp,esp                        ;判断压入立即数时,ESP是否减4 jnz ghalt                          pop eaxmov [0x1e],al                      ;显示句点 ghalt:     hlt                                ;已经禁止中断,将不会被唤醒 ;-------------------------------------------------------------------------------gdt_size         dw 0gdt_base         dd 0x00007e00     ;GDT的物理地址 在主引导扇区之后times 510-($-$$) db 0db 0x55,0xaa

笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。

学习探讨加个人:
qq:1126137994
微信:liu1126137994

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(176):列表元素

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>有序列表<…

RDLC报表---自定义数据集

//连接字符串stringconnstr "Data Source.;Initial CatalogWWALMDB;User IDsa;Passwordsqlsql";//新建连接SqlConnection connection newSqlConnection(connstr);//查询命令SqlCommand command newSqlCommand(textBoxSQL.Text, connection);//适配器SqlDataAdapter a…

设计模式-装饰者模式

1. 场景 很经典的一个场景 咖啡类型 espresso&#xff08;意大利咖啡&#xff09;&#xff0c;shortblack,LongBlack(美食咖啡)&#xff0c;Decaf(无因咖啡)调料 Milk ,Soy(豆浆)&#xff0c;Chocolate费用 不同的咖啡价格是不同的&#xff0c;而且有 咖啡调料的类型组合 每个咖…

【OS学习笔记】十七 保护模式五:保护模式下如何进行内存保护 与 别名段的意义与作用

上一篇文章学习了如何进入保护模式&#xff0c;以及如何在保护模式下进行内存访问。点击链接查看上一篇文章&#xff1a;进入保护模式与在保护模式下访问内存 首先说明本片文章有对应的汇编代码&#xff0c;点击链接查看&#xff1a;点击查看 本篇文章接着学习。我们已经知道…

前端学习(177):定义列表

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>定义列表<…

oracle 数据库工作总结思维导图

oracle 数据库工作中使用总1. oracle 数据库 工作中使用总结思维导图2 解析oracle执行计划1. oracle 数据库 工作中使用总结思维导图 2 解析oracle执行计划 执行计划树的基本规则如下&#xff1a; 执行计划将包含一个根&#xff0c;没有父&#xff08;操作&#xff09; 父&…

【软件开发底层知识修炼】十一 链接器-链接脚本

上一篇文章学习了链接器之-main函数不是第一个执行的函数:main函数不是第一个执行的函数 今天继续学习链接器&#xff0c;学习链接是如何动作的&#xff0c;从而引入链接脚本的概念。本文就学习链接脚本的概念。 1、链接脚本的作用 我们都知道可重定位文件经过链接器链接后最…

as3 physaxe 2d 物理引擎

http://drawlogic.com/2008/04/06/physaxe-2d-flash-physics-kit-for-haxe-and-list-of-flash-flex-actionscript-physics-engines-for-as3/转载于:https://www.cnblogs.com/vilyLei/archive/2010/11/30/1892298.html

前端学习(178):表格元素

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>表格</ti…

java后端分享整理

java规范总结1. Java 常见的代码规范1.1. Java 自带的工具方法1.1.1 比较两个对象是否相等1.1.2 apache commons工具类库1.1.2.1 字符串判空1.1.2.3 重复拼接字符串1.1.2.4 格式化日期1.1.2.4 包装临时对象 &#xff08;不是特别常用&#xff09;1.1.3 common-beanutils 操作对…

【OS学习笔记】十八 保护模式五:保户模式下如何进行内存保护 与 别名段的意义与作用 对应汇编代码

本片文章是上一篇文章&#xff1a;点击查看对应的汇编代码。可以学习上一篇文章后再来对照查看汇编代码。或者查阅书籍《X86汇编语言-从实模式到保护模式》点击下载第12章内容来学习。 ;代码清单12-1;文件名&#xff1a;c12_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码 ;设…

SharePoint要在master page中动态显示List数据的几种方式

我们都知道&#xff0c;在SharePoint中&#xff0c;Content page继承自Page layout&#xff0c;而Page layout又继承自Master page。Master page的作用大家都知道&#xff0c;它定义了站点的的整体外观和公共元素&#xff0c;因此有了很强的页面重用性和很好的页面编辑体验&…

前端学习(179):表单元素

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>表单</ti…

【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)

上一篇文章学习了链接脚本的语法与相关概念&#xff1a;链接脚本的概念 在继续学习链接器的内容的同时&#xff0c;先学习一个新内容&#xff1a;内嵌汇编。 GCC编译器一般支持C/C内嵌汇编语言&#xff0c;这样可以实现语言本身无法实现的内容。我们本文主要介绍C语言中的内嵌…

并发编程总结

并发编程总结 1. ThreadLocal 每个线程复制一份2.volatile 解决内存可见性问题1. ThreadLocal 每个线程复制一份 package work.thread;/*** * @date 18/6/2019 11:59* @description:*/public class ThreadLocalDemo2 {// 每个线程的第几次操作private static ThreadLocal

【OS学习笔记】十九 保护模式六:保户模式下操作系统内核如何加载用户程序并运行

上一篇文章学习了保户模式下如何进行内存保护 与 别名段的意义与作用&#xff1a;点击链接查看上一篇文章&#xff1a;点击链接 本文接着学习&#xff0c;在保护模式下&#xff0c;内核是如何加载用户程序并运行的。其实这与在实模式下很像&#xff0c;只不过现在保护迷失多了…

数据思维整理

数据思维整理分享

常用的LaTeX公式用法

常用的LaTeX公式用法常用的latex公式用法常用的latex公式用法 加法 效果 减法 - 效果 − 乘法&#xff08;叉乘&#xff09; \times 例子: aba \times bab 效果 ab 乘法&#xff08;点乘&#xff09; \cdot 例子: a⋅ba \cdot ba⋅b 效果 a⋅b 除法 \div 例子&#xff1a;$ a…

linux平台下通过mcr方式从c++程序中调用matlab函数

小细节很多,所以容易出错. 平台:linux gcc matlab2010a 1 在matlab中写好函数例如branch,调用命令 mcc -W cpplib:libbranch -T link:lib branch.m -C 注意末尾的-C,很关键用于生成ctf文件,里面有执行需要的一些配置文件 2 将libbranch.so libbranch.ctf放在同一个目录中,写c程…

【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序

本汇编代码对应保户模式下操作系统内核如何加载用户程序并运行 的实际主引导扇区代码&#xff1a; 对应的内核代码在&#xff1a;内核代码对应的用户程序代码在&#xff1a;用户程序代码 ;代码清单13-1;文件名&#xff1a;c13_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码…