学习32位保护模式明显感觉比16位实模式复杂一些,其实两者之间所做的事情是一样的,无非是对内存的各种操作,对栈的各种操作,但是手段不一样,实模式是野蛮的,可以在任意地方读写(比如代码区),保护模式比实模式要文明的多,增加了许多的保护手段和一些资源使用限制,就如同一个文明国家的规章制度一样,初次读起来费解难懂,因为这夹杂着历史的演进。但是关键的地方就那几点,明白了这几点32位保护模式基本上就很轻松了。

1,全局描述符数据结构,段选择子的数据结构,里面每个字段表示的含义(这个不用记忆,可以回头再查);

2,GDT的加载过程;

3,32位寻址过程;

4,数据段,代码段,栈段各自的保护措施;

书中的代码不难,粘在下面:

         ;代码清单12-1;文件名:c12_mbr.asm;文件说明:硬盘主引导扇区代码 ;创建日期:2011-10-27 22:52;设置堆栈段和栈指针 mov eax,cs      mov ss,eaxmov sp,0x7c00;计算GDT所在的逻辑段地址mov eax,[cs:pgdt+0x7c00+0x02]      ;GDT的32位线性基地址 xor edx,edxmov ebx,16div ebx                            ;分解成16位逻辑地址 mov ds,eax                         ;令DS指向该段以进行操作mov ebx,edx                        ;段内起始偏移地址 ;创建0#描述符,它是空描述符,这是处理器的要求mov dword [ebx+0x00],0x00000000mov dword [ebx+0x04],0x00000000  ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间mov dword [ebx+0x08],0x0000ffff    ;基地址为0,段界限为0xfffffmov dword [ebx+0x0c],0x00cf9200    ;粒度为4KB,存储器段描述符 ;创建保护模式下初始代码段描述符mov dword [ebx+0x10],0x7c0001ff    ;基地址为0x00007c00,512字节 mov dword [ebx+0x14],0x00409800    ;粒度为1个字节,代码段描述符 ;创建以上代码段的别名描述符mov dword [ebx+0x18],0x7c0001ff    ;基地址为0x00007c00,512字节mov dword [ebx+0x1c],0x00409200    ;粒度为1个字节,数据段描述符mov dword [ebx+0x20],0x7c00fffemov dword [ebx+0x24],0x00cf9600;初始化描述符表寄存器GDTRmov word [cs: pgdt+0x7c00],39      ;描述符表的界限   lgdt [cs: pgdt+0x7c00]in al,0x92                         ;南桥芯片内的端口 or al,0000_0010Bout 0x92,al                        ;打开A20cli                                ;中断机制尚未工作mov eax,cr0or eax,1mov cr0,eax                        ;设置PE位;以下进入保护模式... ...jmp dword 0x0010:flush             ;16位的描述符选择子:32位偏移[bits 32]                          flush:                                     mov eax,0x0018                      mov ds,eaxmov eax,0x0008                     ;加载数据段(0..4GB)选择子mov es,eaxmov fs,eaxmov gs,eaxmov eax,0x0020                     ;0000 0000 0010 0000mov ss,eaxxor esp,esp                        ;ESP <- 0mov dword [es:0x0b8000],0x072e0750 ;字符'P'、'.'及其显示属性mov dword [es:0x0b8004],0x072e074d ;字符'M'、'.'及其显示属性mov dword [es:0x0b8008],0x07200720 ;两个空白字符及其显示属性mov dword [es:0x0b800c],0x076b076f ;字符'o'、'k'及其显示属性;开始冒泡排序 mov ecx,pgdt-string-1              ;遍历次数=串长度-1 @@1:push ecx                           ;32位模式下的loop使用ecx xor bx,bx                          ;32位模式下,偏移量可以是16位,也可以 @@2:                                      ;是后面的32位 mov ax,[string+bx] cmp ah,al                          ;ah中存放的是源字的高字节 jge @@3 xchg al,ah mov [string+bx],ax @@3:inc bx loop @@2 pop ecx loop @@1mov ecx,pgdt-stringxor ebx,ebx                        ;偏移地址是32位的情况 @@4:                                      ;32位的偏移具有更大的灵活性mov ah,0x07mov al,[string+ebx]mov [es:0xb80a0+ebx*2],ax          ;演示0~4GB寻址。inc ebxloop @@4hlt ;-------------------------------------------------------------------------------string           db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.'
;-------------------------------------------------------------------------------pgdt             dw 0dd 0x00007e00      ;GDT的物理地址
;-------------------------------------------------------------------------------                             times 510-($-$$) db 0db 0x55,0xaa

实验现象:

第12章 存储器的保护相关推荐

  1. X86汇编语言从实模式到保护模式12:存储器的保护

    目录 1. 进入32位保护模式 1.1 创建GDT表 1.1.1 空描述符 1.1.2 数据段描述符 1.1.3 代码段描述符 1.1.4 代码段别名描述符 1.1.5 栈段描述符 1.2 mov d ...

  2. 第12章 光盘存储器的格式

    第12章 光盘存储器的格式 CD格式包含逻辑格式和物理格式.逻辑格式实际上是文件格式的同义词,它规定如何把文件组织到光盘上以及指定文件在光盘上的物理位置,包括文件的目录结构.文件大小以及所需盘片数目等 ...

  3. [书]x86汇编语言:从实模式到保护模式 -- 第11章 进入保护模式,初识全局描述符表GDT; 第12章 别名,冒泡排序

    第11章 进入保护模式:初始化全局描述符表,通过GDT进入代码段.数据段.堆栈段 ; FILE: c11_mbr.asm ; DATE: 20191229 ; TITLE: 硬盘主引导扇区代码; 设置 ...

  4. 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20

    存储器的保护(三) 修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响).要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量 ...

  5. 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18

    本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:"文王拘而演<周易> ...

  6. 存储器的保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记19

    接着上一篇博文说. 5.代码段执行时的保护 每个代码段都有自己的段界限.同栈段一个道理,有效界限和G位相关. G=0:有效界限 = 描述符中的段界限 G=1:有效界限 = 描述符中的段界限值 * 0x ...

  7. 微机原理第五章 存储器

    微机原理笔记分享 课程链接:https://www.bilibili.com/video/BV1qv411Y7AA?share_source=copy_web 微机原理第五章 @[TOC](微机原理第 ...

  8. Linux就这个范儿 第12章 一个网络一个世界

    Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus  OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...

  9. 单片微型计算机徐春辉,单片微机原理及应用 徐春辉第12章 习题答案

    第12章习题解答 1.I/O接口和I/O端口有什么区别?I/O接口的功能是什么? 解:I/O端口简称I/O口,常指I/O接口电路中具有端口地址的寄存器或缓冲器.I/O接口是指单片机与外设间的I/O接口 ...

最新文章

  1. Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展
  2. 别再纠结线程池大小 + 线程数量了,没有固定公式的!
  3. nodejs安装失败
  4. net2.0中使用Cookie保存中文出现乱码的解决方法
  5. python去重计数_用Python实现透视表的value_sum和countdistinct功能
  6. Eclipse中JSP生成的class文件去了哪里?
  7. PHP可变变量的简单使用
  8. java feign请求pathvariable_8、服务发现amp;服务消费者Feign
  9. java获取linux本机ip_linux下java获取本机IP地址
  10. 英特尔多核平台编码优化大赛就顺便试试身手了
  11. EMMC内存芯片和NAND区别
  12. C++中的CopyElision
  13. 浏览器自带开发工具你知道多少?
  14. BO4 SDK 检索所有使用了某个universe object的报表
  15. Eclipse - Reset Perspective
  16. SUS系统 postfix邮箱设置
  17. Python||PyCharm||代码为什么是灰色的???(已解决)
  18. 教程:建立自己的私有云存储
  19. 二进制数据流方式实现 个人头像的读取、上传、修改------善良公社项目
  20. 如何理解面向对象思维?

热门文章

  1. 前端学习(1153):常量const01
  2. 前端学习(558):margin重叠
  3. mybatis学习(39):动态sql片段
  4. Qt 给应用程序添加图标
  5. 深入::first-letter的研究
  6. 处理后台返回文本带空格和换行页面不显示断句的问题
  7. 传送,条件加速 Learn Unreal Engine (with C++)
  8. 2015 总结 2016 展望
  9. SVN 清理失败解决方案
  10. Linux内核程序的编译:模块化编译