操作系统学习初步-软驱介绍及BIOS调用示例

软驱

1.4M的软盘两面均可记录信息,称为面0和面1。两面各有一个磁头可以记录和读取信息,两个磁头分别称为磁头0和磁头1。每面有80个同心圆磁道,从外向里称为磁道0…磁道79 。每个片面均分成18个扇面。扇面把磁道分成了更小的单元,每一小块称为一个扇区,一个扇区是512字节,面0磁道0有18个扇区,序号1…18,面1磁道0为19…36,然后磁道1开始排序。全盘容量为 5121880*2=1474560字节。

磁盘中断:INT 0x13
AH 0x0重置;0x2读盘;0x3写盘;0x4校验;0x5寻道
AL 读取对象占的扇区数(只能同时处理连续的扇区,意思是不能跨越磁道、磁头)
ES:BX 读出的数据存储在什么地方?
CH 磁道号(柱面号)
CL 从第几个扇区开始读
DH 磁头号(0或1)
DL 驱动器号,一般情形软驱是A盘,为0
FLAGS.CF 0,正确,AH == 0;1,错误,AH == 错误码

以下是一段读取软驱内容到指定物理内存的汇编代码。
该程序只能读取一张软盘。
程序参数:驱动器号,一般为0;需要读取的位置(指定内容在磁盘中的偏移,不是哪个扇区);读取内容的字节数;目标物理内存。
本段程序为GNU AS,AT&T语法格式。需要注意的是标识符大小写敏感的。

.macro FloppyRead  driver,ReadPosition,ReadSize,DestJMP _FloppyReadEntry_FLOPPY_VARS:# 变量head      :.byte  0        #磁头号cylinder :.byte  0        #柱面号sector    :.byte  1        #扇区号once      :.byte  1        #一次连续读取的扇区数sectors  :.word 1        #需要读取的扇区数目PhyAddr:.long   \DestOkay     :.ascii "Read Success!"_FloppyReadEntry:# 求读取位置所在柱面扇区磁头信息movl $\ReadPosition,%eax                      #读取位置/512获得扇区数目movl $512,%ecxxorl   %edx,%edx      # 真的要小心,这条指令不能少,不然结果不确定。EDX=0divl   %ecx                         addl  $1,%eax  #余数为0时,读取位置还是要定位到下一扇区,譬如512,第一扇区为0..511,512 in sector2GET_HEAD:movl  $36,%ecx                                        # 正反2面共36个簇xorl   %edx,%edx                                    # edx清0divl    %ecxmovb %al,cylindercmp   $18,%edx                     # 余数为扇区数>18,磁头为1,扇区为(余数-18)JNA   GET_SECTORsubl $18,%edxmovb $1,headGET_SECTOR:movb %dl,sector# 求取需要读取的扇区数movl $\ReadSize,%eaxxorl %edx,%edxmovl $512,%ecxdivl   %ecxaddl $1,%eaxmovw %ax,sectors# 把 SI作为计数器,统计已经读取的扇区movw $0,%si_Retry:# 求一次读入的扇区数movb $19,%alsubb  sector,%almovb %al,once# 把将要读取的扇区数加已经读完的扇区数相加和总数比较movw %si,%bxaddb once,%blcmpw  sectors,%bx# 如果%bx<=sectors,直接进行读取jbe  _CallBios# 如果超过了,把ONCE减去超过的数量,得到需要读取的数量movw once ,%axsubw  sectors,%bx # 得到多余的数量 21-4=17subw  %bx,%axmovb  %al,once_CallBios:movw $0,%axmovw %ax,%esmovw PhyAddr,%BXmovb head,%DH   #磁头movb $\driver,%DL    #驱动器movb cylinder,%CH    #柱面movb sector,%CL   #扇区movb $0x02,%AHmovb once,%AL   #读入扇区数量INT    0x13nopjc  _CallBios_Next:add once,%sicmp sectors,%si#如果大于等于需要读取的扇区数,跳转到结束jAE _READ_FINISH
_GO_ON:# 将写入地址修改movl $512,%eaxmull  onceaddl PhyAddr,%eaxmovl %eax,PhyAddr# 起始扇区重置1#movb $1,sector# 更换磁头movb head,%alnot   %aland $1,%almovb %al,head#如果磁头由1->0,磁道加1cmp $0,%aljne  _Retryadd $1,cylinder  #如果cylinder>80,则需要更换磁盘jmp _Retry_READ_FINISH:nopmovw $Okay,%bp            /* ES:BP=字符串地址  */movw $13,%cx             /*字符串长度 */movw $0x1301,%ax     /*AH=0x13,AL=0x01  */movw $0xC,%bx     /*Page=0(BH=0)Black ground and red font(BL=0x0C,highlight)*/movb $15,%dh              /* Line  */movb $0,%dl             /* col */int  0x10nop
.endm

操作系统学习初步-软驱介绍及BIOS调用示例相关推荐

  1. 操作系统学习初步--用GNU汇编创建最简单的OS

    操作系统学习初步–用GNU汇编创建最简单的OS 先贴上一段GNU汇编代码: .code16 .org 0x7c00 /*设置程序地址为0x7c00*/ movw %cs,%ax movw %ax,%d ...

  2. 操作系统学习笔记-06-系统调用

    操作系统学习笔记-2019 王道考研 操作系统-06-系统调用 文章目录 6-系统调用 6.1 知识概览 6.2什么是系统调用?有什么作用? 6.3系统调用与库函数的区别 6.4系统调用背后的过程 6 ...

  3. 自己写操作系统学习总结

    怎样自己写一个简单的操作系统? https://www.zhihu.com/question/20207347 我写的时候一些经历: 第一次写的时候3000行左右的就无法调试了,当时主要参考了linu ...

  4. 分享--操作系统学习

    分享--操作系统学习 链接: https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247487662&idx=1&sn ...

  5. 操作系统学习常见疑惑问与答

    主要看了下特权级这块,和上次看的保护模式下寻址,发现于渊的书有个问题,很多地方为了回避繁杂的理论,反而把一些要点略去了,最后自己还是不得不到网上到处查资料~ 以下内容貌似是一个即将毕业的学长做毕设所总 ...

  6. Linux操作系统学习笔记【入门必备】

    Linux操作系统学习笔记[入门必备] 文章目录 Linux操作系统学习笔记[入门必备] 1.Linux入门 2.Linux目录结构 3.远程登录 3.1 远程登录Linux-Xshell5 3.2 ...

  7. ROS机器人操作系统学习笔记(三)ROS通信架构

    ROS机器人操作系统学习笔记(三)ROS通信架构 ROS的通信架构是ROS的灵魂,也是整个ROS正常运行的关键所在.ROS通信架构包括各种数据的处理,进程的运行,消息的传递等等.本章主要介绍了通信架构 ...

  8. 操作系统学习体会之进程管理篇

    计算机基础知识的学习中,操作系统则是重中之重.继对微机原理和计算机组成原理的基础知识了解和学习后,对硬件和基础原理的理论有了初步的了解,结合在所在公司的项目中开发应用的经历和体会,进行了操作系统的学习 ...

  9. 【国产数据库】GBase学习④ - GBase 8c 介绍

    [国产数据库]GBase学习④ - GBase 8c 介绍 GBase 8c 介绍 GBase 8c 分布式架构介绍 GBase 8c 介绍 MOT是一种内存数据库存储引擎,其中所有表和索引完全驻留在 ...

最新文章

  1. 梯度下降法与牛顿法的比较
  2. boost asio resolver
  3. 如何编写高性能的C#代码(一)
  4. vuejs 轮播_如何在VueJS中设计和构建轮播功能
  5. 将Tomcat集成到IDEA
  6. skypebridge.exe 损坏的映像 错误代码 0xc000012f
  7. 整理 Mac 安装 oracle
  8. 一个模仿Struct的Action类
  9. 中国防毒软件市场深度研究分析报告
  10. Matlab实现常见的插值算法
  11. word表格删除空白行java_在Word中怎样批量删除空行,这些点主要注意
  12. 【考研词汇训练营】Day 6 —— eventually,state,create,productivity,stimulate
  13. unity 角色控制器CharaterController脚本
  14. 基于卷积神经网络CNN的面部表情识别
  15. php商城添加加入购物车,php添加购物车,php购物车
  16. 2021云蓝课c++填空第4题(B)
  17. 12306网站专家:拟采取办法应对抢票软件
  18. [Nodejs]基于Nodejs构建属于自己的微信公众号
  19. P1217 [USACO1.5]回文质数 Prime Palindromes
  20. unity 简单的吃豆豆项目

热门文章

  1. 阿里云国际站代理商:阿里云是干什么的?阿里云app和建网站有什么关系?
  2. 钱学森诞辰110周年:他让美国人忌惮,让中国人挺直腰杆子
  3. 【项目经验】— 登录功能
  4. 块坐标下降法算法matlab代码,《最优化:建模、算法与理论》、《最优化计算方法》代码展示...
  5. 使用git新建分支推送项目
  6. int main(int argc, char argv[]) argc和argv是什么意思?
  7. JB的Python之旅-爬虫篇--urllib和Beautiful Soup
  8. 机器学习-贝叶斯公式
  9. 逆向学习笔记: APK过签名包java校验(一)
  10. 传感器数据采样率控制