本章的思路是,在本机上上写一段代码(这些代码的意义是往显存中写一些数据)--》编译成bin文件--》写入到vhd硬盘的引导扇区(即第一扇区,见第四章详述)--》开机从硬盘启动,从而执行了自己写的这段代码。

重点是理解引导扇区的代码是如何被CPU执行的,下面还会分析。

书中源码如下:

         ;注释必须以分号“;”开始, 在源程序编译阶段,编译器将忽略所有注释;代码清单5-1 ;文件名:c05_mbr.asm;文件说明:硬盘主引导扇区代码;创建日期:2011-3-31 21:15 ;功能: 标号 number 处的汇编地址是 0x012E=302mov ax,0xb800                 ;指向缓存的逻辑地址mov es,ax;以下显示字符串"Label offset:"mov byte [es:0x00],'L'mov byte [es:0x01],0x07     ;颜色设置mov byte [es:0x02],'a'mov byte [es:0x03],0x07mov byte [es:0x04],'b'mov byte [es:0x05],0x07mov byte [es:0x06],'e'mov byte [es:0x07],0x07mov byte [es:0x08],'l'mov byte [es:0x09],0x07mov byte [es:0x0a],' 'mov byte [es:0x0b],0x07mov byte [es:0x0c],"o"mov byte [es:0x0d],0x07mov byte [es:0x0e],'f'mov byte [es:0x0f],0x07mov byte [es:0x10],'f'mov byte [es:0x11],0x07mov byte [es:0x12],'s'mov byte [es:0x13],0x07mov byte [es:0x14],'e'mov byte [es:0x15],0x07mov byte [es:0x16],'t'mov byte [es:0x17],0x07mov byte [es:0x18],':'mov byte [es:0x19],0x07mov ax,number                 ;取得标号number的偏移地址mov bx,10;设置数据段的基地址mov cx,csmov ds,cx;求个位上的数字mov dx,0div bxmov [0x7c00+number+0x00],dl   ;保存个位上的数字, dx存的是余数,实际上是存在了dl上;求十位上的数字xor dx,dxdiv bxmov [0x7c00+number+0x01],dl   ;保存十位上的数字;求百位上的数字xor dx,dxdiv bxmov [0x7c00+number+0x02],dl   ;保存百位上的数字;求千位上的数字xor dx,dxdiv bxmov [0x7c00+number+0x03],dl   ;保存千位上的数字;求万位上的数字 xor dx,dxdiv bxmov [0x7c00+number+0x04],dl   ;保存万位上的数字;以下用十进制显示标号的偏移地址mov al,[0x7c00+number+0x04]add al,0x30mov [es:0x1a],almov byte [es:0x1b],0x04mov al,[0x7c00+number+0x03]add al,0x30mov [es:0x1c],almov byte [es:0x1d],0x04mov al,[0x7c00+number+0x02]add al,0x30mov [es:0x1e],almov byte [es:0x1f],0x04mov al,[0x7c00+number+0x01]add al,0x30mov [es:0x20],almov byte [es:0x21],0x04mov al,[0x7c00+number+0x00]add al,0x30mov [es:0x22],almov byte [es:0x23],0x04mov byte [es:0x24],'D'mov byte [es:0x25],0x07infi: jmp near infi                 ;无限循环,否则cs:ip会指向102行而引起错误number db 0,0,0,0,0times 203 db 0db 0x55,0xaa

实验结果:

过程分析:

1)

处理器加电或者复位之后,如果硬盘是首选的启动设备,那么, ROM-BIOS将试图读取硬盘的 0 面 0 道1 扇区。传统上,这就是主引导扇区(Main Boot Sector,MBR)。

2)

读取的主引导扇区数据有 512 字节, ROM-BIOS 程序将它加载到逻辑地址0x0000:0x7c00处,也就是物理地址0x07c00 处,然后判断它是否有效。

3)

一个有效的主引导扇区,其最后两字节应当是 0x55和 0xAA。ROM-BIOS 程序首先检测这两个标志,如果主引导扇区有效, 则以一个段间转移指令jmp 0x0000:0x7c00 跳到那里继续执行, 此时cs:ip=0x0000:0x7c00。

4)

执行自己写的代码(具体见代码注释)。

第五章 编写主引导扇区代码相关推荐

  1. [书]x86汇编语言:从实模式到保护模式 -- 第六、七章 编写主引导扇区代码

    第六章 编写主引导扇区代码(启动时显示文字:Label offset:) PART 1 >> 用VirtualBox显示最终效果 1.1 汇编 启用nasm的工具"nasm-sh ...

  2. 第5章 编写主引导扇区代码

    开机过程 一.在屏幕上显示文本 01.显卡和显存 每个字节表示三原色中的一个(红绿蓝) 两种模式|-文本模式|-图像模式两种模式的显存是分开的;文本模式下,显存的内容是文本的编码:图像模式下,显存的内 ...

  3. 【OS学习笔记】六 实模式:编写主引导扇区代码

    上一篇文章学习了:计算机的启动过程(点击链接查看上一篇文章) 这篇文章学习记录为:编写主引导扇区代码. 参考:<X86汇编语言-从实模式到保护模式>-李忠.纯学习笔记,更详细内容请阅读正版 ...

  4. 【OS学习笔记】八 实模式:编写主引导扇区代码-另一种更高效的写法

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章,我们用比较原始的方法编写了主引导扇区的代码.点击链接查看 ...

  5. 【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码

    本文是以下几篇文章对应的主引导扇区代码汇编代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 保护模式 ...

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

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

  7. 硬盘主引导扇区汇编代码

    GitHub地址:https://github.com/yifengyou/X86-assembly-language-from-real-mode-to-protection-mode/blob/m ...

  8. 主引导扇区及主引导记录MBR的详细说明

    引导扇区在每个分区里都存在,但是我们常说的*主引导扇区*是硬盘的 第一物理扇区.它由两个部分组成:即主引导记录MBR和硬盘分区表DPT.在 总共512字节的主引导分区里其中MBR占446个字节(偏移0 ...

  9. 主引导扇区(MBR),分区表(DPT)及活动分区(DBR)

    主引导扇区:硬盘的0柱面.0磁头.1扇区(也叫主引导记录MBR),大小为512Byte. 分区表(DPT):位于主引导分区,从偏移01BEH开始到偏移01FDH结束的64字节. 活动分区DBR:DBR ...

最新文章

  1. 水痘痊愈就能终生免疫?其实病毒仍潜伏在神经,随时以更可怕的形式爆发......
  2. PAT A1063——set的常见用法详解
  3. cf1206解题报告
  4. python 01列表异或_python基础篇三
  5. Asp.Net SignalR 集群会遇到的问题
  6. Ztree 改 节点
  7. python123词频统计之哈姆雷特_基于Yarn的Spark环境,统计哈姆雷特词频(1)-阿里云开发者社区...
  8. atitit。gui 界面皮肤以及换肤总结 java .net c++
  9. ubuntu/Windows双系统,在ubuntu隐藏window分区的方法
  10. Sketchup 2022下载
  11. 液化石油气(LPG)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  12. python数据类型包括实数_01~Python数据类型
  13. 获取用户手机号码解析失败,微信小程序授权登录获取token步骤
  14. Python学习总结(1)——Python知识清单(基础知识数据科学)
  15. c#后台如何导出excel到本地_C#实现导出Excel
  16. 裸眼3D LED显示屏,是未来趋势还是行业自嗨?
  17. 垃圾分类微信小程序设计python
  18. 密立根油滴实验的计算机仿真实验报告,大学物理实验报告系列之密立根油滴实验.doc...
  19. 如何毁掉一个产品大佬
  20. 医学检验专业职业生涯

热门文章

  1. 前端学习(342):进制只能介于2-36之间Uncaught RangeError: toString() radix argumen
  2. 第五十五期:区块链将在2020年实现的重大改变
  3. java学习(127):finally语句
  4. 前端第一天 HTML基础
  5. asic面试题目 英伟达_免笔试!不限量!全球可编程图形处理技术领袖英伟达2021校园招聘火热进行中!...
  6. php实时股票,php基于curl实现的股票信息查询类实例
  7. java容器集合类的区别用法_Java容器笔记(二):不同集合实现类的特点与区别...
  8. c语言做贪吃蛇vs2015,熬书几个月,终于编出简易的贪吃蛇了,VS2013
  9. redis笔记——redis事务及锁应用
  10. vue 公用组件开发 确认框confirm