简介

上一博文我们实现了从实模式到保护模式的切换并在屏幕上显示了简单的字符,对于保护模式给我们带来的寻址范围的变化体会可能不深入,很难体会在保护模式下的地址寻址变化。

目标

在保护模式下将一段字符串复制到1M以外的地址空间,并将字符从该地址空间显示到屏幕上。

1、kernel.s 文件如下

 ;全局描述符结构 8字节; byte7 byte6 byte5 byte4 byte3 byte2 byte1 byte0; byte6低四位和 byte1 byte0 表示段偏移上限; byte7 byte4 byte3 byte2 表示段基址;定义全局描述符数据结构;3 表示有3个参数分别用 %1、%2、%3引用参数;%1:段基址     %2:段偏移上限  %3:段属性%macro GDescriptor  3dw %2 & 0xffffdw %1 & 0xffffdb (%1>>16) & 0xff dw ((%2>>8) & 0x0f00) | (%3 & 0xf0ff)db (%1>>24) & 0xff %endmacroDA_32       EQU 0x4000   ; 32 位段DA_CODE     EQU 0x98     ; 只执行代码段属性值DA_RW       EQU 0x92     ; 可读写数据段属性值org 0x9000 jmp entry[SECTION .gdt];定义全局描述符                            段基址           段偏移上限       段属性LABEL_GDT:           GDescriptor         0,             0,             0LABEL_DESC_CODE:     GDescriptor         0,             SegCodeLen-1,  DA_CODE+DA_32 LABEL_DESC_VIDEO:    GDescriptor         0xb8000,       0xffff,        DA_RWLABEL_DESC_7M:       GDescriptor         0x0700000,     0xffff,        DA_RW;gdt 表大小GdtLen  equ     $-LABEL_GDT;gdt表偏移上限和基地址GdtPtr  dw      GdtLen-1dd      0;cpu开机进入实模式时使用的段寄存器 cs,ds,es,ss 和偏移地址组成内存地址,内存地址=段寄存器 * 16 + 偏移地址 ;保护模式中段寄存器保存的是gdt 描述表中各个描述符的偏移,也叫选择子SelectorCode32  EQU     LABEL_DESC_CODE-LABEL_GDTSelectorVideo   EQU     LABEL_DESC_VIDEO-LABEL_GDTSelector7M      EQU     LABEL_DESC_7M-LABEL_GDT[SECTION .s16][BITS 16]
entry:mov ax,cs mov ds,axmov es,axmov ss,axmov sp,0x100 ;设置LABEL_DESC_CODE描述符段基址mov eax,0 mov ax,cs shl eax,4add eax,SEG_CODE32mov word [LABEL_DESC_CODE+2],axshr eax,16mov [LABEL_DESC_CODE+4],almov [LABEL_DESC_CODE+7],ahmov eax,0mov ax,dsshl eax,4 add eax,LABEL_GDTmov dword [GdtPtr+2],eax;设置GDTR 寄存器lgdt [GdtPtr]cli     ;关闭可可屏蔽中断,如键盘中断in al,0x92 or al,0x02out 0x92,al mov eax,cr0or eax,1 mov cr0,eaxjmp dword SelectorCode32:0[SECTION .s32][BITS 32]
SEG_CODE32:mov esi,msg mov ax,Selector7Mmov es,axmov edi,0copy_msg_to_7M:mov al,[esi]mov [es:edi],alinc ediinc esicmp al,0je  show_charjmp copy_msg_to_7Mshow_char:mov ax,SelectorVideo ;gs 寄存器是80386新增的辅助段寄存器mov gs,ax;在屏幕中间显示字符串,屏幕为每行80个字符,共25行。低字节为ascii字符编码,高字节为字符显示属性;可参考 《汇编语言》 王爽,屏幕显示相关章节;在屏幕11行20列开始显示字符mov ax,(80*11+20)mov ecx,2mul ecxmov edi,eaxmov ah,10000110b mov esi,0 putloop:mov al,[es:esi]cmp al,0je  finmov [gs:edi],axadd edi,2inc esi jmp putloopfin:hltjmp finmsg:db 'message from 0x0500000',0SEG_CODE32_END: nop ;32为模式代码长度
SegCodeLen  EQU SEG_CODE32_END-SEG_CODE32

相比于上一博文,该程序代码没有太大的变化。
1)添加了LABEL_DESC_7M段描述符和Selector7M选择子,
2)并将字符串复制到该选择子指向的内存空间,
3)修改字符显示属性为 mov ah,10000110b 实现闪烁功能

boot.s、main.c文件参考上一博文,运行结果如下

总结

保护模式与实模式对边最大的变化时寻址方式的变化,保护模式下地址=短地址*16+偏移地址,保护模式下地址不再是段地址左移4位(向左移动一位二进制相当于扩大2倍,222*2即16)加上偏移地址,保护模式下寻址都通过寄存器GDT,段寄存器保存的是GDT中段索引。一句话总结就是地址映射方式发生变化。

题外话

博主在编程中特别喜欢使用数学上的映射来概括抽象的东西,y = f(x),一个函数(方法)功能是映射,甚至感觉整个人类科技文明都可以使用映射来描述,道可道,非常道。细细体会

07.保护模式下字符显示相关推荐

  1. ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行...

    ★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述...

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  3. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务...

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  4. 保护模式下中断或异常示意图

    保护模式下中断或异常示意图 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/08/24/3845741.html

  5. 保护模式下寻址(易懂)

    网上看到的一强帖,不转不行了,牛人啊,把这段代码拿捏的相当到位 括号中是我的加注 段机制轻松体验 [内存寻址] 实模式下的内存寻址: 让我们首先来回顾实模式下的寻址方式 段首地址×16+偏移量 = 物 ...

  6. 实地址模式与保护模式下的中断与异常处理

    在中断和异常的处理过程中,很重要的一件事是如何识别中断源,获取中断服务子程序的入口地址.在80486 CPU系统中,因为CPU的工作模式不同而获取中断向量的方式有所不同,本节讨论CPU工作在实地址模式 ...

  7. bios x86保护模式下的软盘操作floppy

    Cpu启动时,如果在bios中设置了从软盘启动,则bios会自动把软盘的第一个扇区(512字节)搬移到0x7c00,然后会从0x7c00开始运行,我们需要在这512字节的程序中实现把boot从软盘中搬 ...

  8. IA-32 Intel手册学习笔记(二)保护模式下的内存管理

    内存管理概述(Memory Management Overview) Inter体系结构的内存管理可分为两部分:分段和分页. 分段提供了一种机制,这种机制可以为每个程序或者任务提供单独的代码.数据和栈 ...

  9. MIT-JOS系列1:实模式和保护模式下的段寻址方式

    实模式下的段寻址 以8086为例 8086 段寄存器16位(段地址/基地址),寄存器16位(偏移地址),地址总线20位(寻址1M:2^20) 实际物理地址 = (段寄存器 << 4) + ...

最新文章

  1. Java反射机制——获取成员变量构造函数
  2. github中删除已建仓库(二)
  3. steam程序员php玩的游戏,Steam:又一款烧脑的编程游戏上线,宅男回家了也要开心加班!...
  4. 利用Python我发现我女朋友每天都在看这种网站
  5. node.js stream
  6. Ubuntu中超级终端-minicom
  7. MyBatis文档观后整理
  8. 线性回归、bagging回归、随机森林回归
  9. 无损音乐ape转wav图文教程
  10. 4007: [JLOI2015]战争调度
  11. Unity 之游戏特效
  12. java date 年龄_Java 根据年月日精确计算年龄
  13. linux环境,tomcat 关闭命令sh shutdown.sh 命令执行后进程没有关闭
  14. postgresql 数据库中 like 、ilike、~~、~~*、~、~*的含义
  15. 浦江县教育计算机网上网认证系统,校园网使用FAQ
  16. 迷失lost结局什么意思_《lost》《迷失》大结局,没看懂的进,详细讲解
  17. QT图表chart-饼状图
  18. n719 rom 卡刷 android 4.3,三星n719卡刷刷机教程(刷第三方rom包)
  19. iOS QQ 扫一扫 捷径URL
  20. 左连接,右连接与自然连接语法以及注意点

热门文章

  1. IDEA中连接MySQL时报错:Server returns invalid timezone
  2. 【深入UCSC Genome Brower】他山之石
  3. Android关系型数据库应用——电话(短信)黑名单
  4. SQL 注入之二次注入
  5. 向量余弦值(Cosine)(C#)
  6. 转:typedef的用法
  7. 禁止 mysql nobody_Warning: mysql_real_escape_string(): Access denied for user 'nobody'@'localhost'
  8. Java操作Word自动生成目录
  9. 408知识框架总结——数据结构
  10. 重磅发布《2020年中国乳制品行业数据中台研究报告》