下面代码读取柱面:0,磁头:0,扇区从2到18的数据到内存 0x8200~0xa3ff处

  • 需要明白以下几点:

    • 给定柱面,磁头,一个扇形区域是512字节,对应的物理可以理解为512个灯泡组(一个灯泡组有8个小灯泡)
    • 确定读取到内存中的位置
      • 为什么是0x8200:因为0x8000~0x81ff这512个字节要留给启动区.
      • 为什么是0x8000以后,因为这一段内存区域,很少有人使用,故读取到这段内存上出错的机率低
    • CH(计数寄存器的高位)用于存储柱面信息
    • DH(数据寄存器的高位)用于存储磁头信息
    • CL(计数寄存器的低位)存储扇区
    • SI(源变址寄存器)用于存储读取磁盘失败的次数
    • 根据BIOS提供的信息:
      • AH = 0x02 ; 读入磁盘
      • AL = 1 ; 一次读取1个扇区
    • 系统复位: 复位软盘状态,再读一次
      MOV      AH,0x0820
      MOV     DL,0x00
      INT         0x13
      
    • SI大于5时,执行error代码段
      • JAE(Jump if above or equal):大于等于
      CMP      SI,5
      JAE     error
      
    • JNC(Jump if not carry):如果没有出错的话跳到后面的代码段
    • next代码段:用于读取下一个磁盘扇形区到内存中
      • 一个扇形区域是512B,对应的段地址(es)偏移为0x0020,故使用AX给es加0x0020

总体代码如下

; haribote-ipl
; TAB=4ORG     0x7c00          ; 程序从哪里装入; 以下是对标准FAT12格式软盘的描述JMP        entryDB     0x90DB      "HARIBOTE"        ; 可以自由书写引导扇形区的名称 (8字节)DW        512             ; 1扇区的大小 (必须做成512)DB        1               ; 集群大小 (必须设置在一个扇区)DW        1               ; FAT从哪里开始 (一般从第一个部分开始)DB       2               ; FAT的个数 (必须是2)DW       224             ; 根目录区域的大小 (一般为224条目)DW         2880            ; 这个驱动器的大小 (必须是2880扇区)DB        0xf0            ; 媒体类型 (必须是0xf0)DW      9               ; FAT区域的长度 (必须设置为9个扇区)DW        18              ; 1卡车有几个扇区 (必须是18)DW        2               ; 头数 (必须为2)DD       0               ; 因为不使用分区, 这里一定0DD      2880            ; 再写一次这个驱动器的大小DB        0,0,0x29        ; 预先设置值DD       0xffffffff      ; 音量序列号DB       "HARIBOTEOS " ; 磁盘名称 (11字节)DB     "FAT12   "        ; 格式名称 (8字节)RESB    18              ; 暂且空开18字节; 程序主体entry:MOV       AX,0            ; 寄存器初始化MOV     SS,AXMOV        SP,0x7c00MOV        DS,AX; 读磁盘MOV       AX,0x0820MOV        ES,AXMOV        CH,0            ; 柱面0MOV        DH,0            ; 磁头0 (正面)MOV   CL,2            ; 扇区2
readloop:                       ; 清零失败寄存器MOV    SI,0            ; 记录失败次数的寄存器; 重新尝试
retry:MOV   AH,0x02         ; AH=0x02 : 读入磁盘(柱面0,磁头0,扇区2)MOV   AL,1            ; 1个扇区MOV   BX,0MOV     DL,0x00         ; A驱动器INT       0X13            ; 调用磁盘BIOS  JNC     next            ; 没出错的话跳转到nextADD   SI,1            ; 出错了,SI加1CMP       SI,5            ; 比较SI与5JAE     error           ; SI >=5时, 跳转到error; 复位软盘状态MOV      AH,0x00MOV      DL,0x00         ; A驱动器INT       0x13            ; 重置驱动器JMP  entry; 读取下一个扇区
; CL:扇区号, ES:读入的地址
next:; 把内存地址后移0x200MOV      AX,ES           ADD     AX,0x0020MOV    ES,AX           ; ES无法直接加 0x020ADD      CL,1            ; 往CL里加1; 比较CL与18,如果小于18则跳转到readloopCMP     CL,18           JBE     readloopfin:    HLT                     ; 让CPU停止, 等待指令JMP       fin             ; 无限循环error:    MOV     SI,msg
putloop:MOV     AL,[SI]ADD      SI,1            ; 给SI加1CMP      AL,0JE      finMOV      AH,0x0e         ; 显示一个文字MOV     BX,15           ; 指定字符颜色INT     0x10            ; 调用显卡BIOSJMP       putloop
msg:DB      0x0a, 0x0a      ; 换行2次DB        "load error"  ;DB     0x0a            ; 换行DB      0RESB   0x7dfe-$        ; 用0x00将代码不全至 0x7dfe-$DB        0x55, 0xaa
```

汇编 --- 从磁盘(扇区2到18)上读取数据到内存中相关推荐

  1. 从服务器获取文件错误,在尝试获取许可证时出现无法从许可证服器上读取数据的错误信息...

    Problem [Simplified Chinese] 在尝试获取许可证时遇到FLEXlm -16 "无法从许可证服务器上读取数据"的错误信息. Symptom 完整的错误信息如 ...

  2. 许可证服务器读取文件时警告错误,在尝试获取许可证时出现无法从许可证服器上读取数据的错误信息...

    Problem [Simplified Chinese] 在尝试获取许可证时遇到FLEXlm -16 "无法从许可证服务器上读取数据"的错误信息. Symptom 完整的错误信息如 ...

  3. 【MQTT】利用MQTT.fx上传数据节点到中移OneNET云平台

    在学习使用OneNET云平台过程中,使用MQTT协议向平台上传数据,利用MQTT.fx输入发布tpoic,为了确保设备上传消息确实被平台所接受处理,设备可以订阅系统 topic ,从而获取上传数据点的 ...

  4. 在 4GB 物理内存的机器上,申请 8G 内存会怎么样?

    作者:小林coding 计算机八股文刷题网站:https://xiaolincoding.com/ 大家好,我是小林. 看到读者在群里讨论这些面试题: 其中,第一个问题「在 4GB 物理内存的机器上, ...

  5. 在 4G 内存的机器上,申请 8G 内存会怎么样?

    在 4GB 物理内存的机器上,申请 8G 内存会怎么样? 这个问题在没有前置条件下,就说出答案就是耍流氓.这个问题要考虑三个前置条件: 操作系统是 32 位的,还是 64 位的? 申请完 8G 内存后 ...

  6. 当小内存遇上大量数据,你该怎么解决这个问题?

    作者丨Itamar Turner-Trauring 译者丨夏夜 策划丨万佳 当你写了一个处理数据的软件,它可能在小样本文件上运行地很好,但一旦加载大量真实数据后,这个软件就会崩溃. 问题在于你没有足够 ...

  7. linux汇编格式化磁盘,如何进行硬盘格式化命令操作【详解】

    导语:玩电脑最想要的就是电脑运行流畅,想点哪里点哪里.可是小编的电脑经常会遇到卡屏.电脑反映速度慢的情况,最终小编将电脑抱到修理师那里,修理师说是电脑上硬盘的内存空间太小,被垃圾文件占领了,解决的办法 ...

  8. python读写磁盘扇区数据_[Win32] 直接读写磁盘扇区(磁盘绝对读写)

    正讲着驱动开发呢,这里突然插一篇Win32的博文.事实上.还是做引子,上一篇博文"IRP与派遣函数"中,我们知道了驱动程序须要处理I/O请求.我们先来看看怎么发出一个I/O请求. ...

  9. windows下修改磁盘扇区数据

    Windows系统提供了文件系统,通常应用程序读写文件都是调用CreateFile函数来实现,不会直接读写磁盘数据,但某些特殊目的中,我们需要读取磁盘扇区数据,查看是否包含某些关键字,并且有可能擦除这 ...

最新文章

  1. Jvm 系列(三):GC 算法 垃圾收集器
  2. 一步一步学JVM-垃圾回收器
  3. C# 平时碰见的问题【1】
  4. Codeforces 864 B Polycarp and Letters 暴力
  5. java开发利器 源码_Java开发的利器: 反编译工具 JD-GUI
  6. linux php木马下载,Linux shell快速查找PHP木马
  7. leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)
  8. Java实现二叉树的前中后序遍历(Leetcode)
  9. python连载第12篇 for循环 源码+ 答案
  10. 一个iOS开发者的Flutter“历险记”
  11. 从iPhone诞生看物联网 10年后将无所不在
  12. 睡眠革命——摘抄总结大纲
  13. JAVA中分号用中文还是英文_【英文中有分号(;)吗?怎么用呢?】作业帮
  14. 在博客右下角设置透明卡通小美女,附上源码
  15. To https://gitee.com/xxxx/gittest.git解决方案
  16. RNA-seq 详细教程:实验设计(2)
  17. 完整的网络端口表《二》
  18. 潇洒汽车模具设计,模具与制造
  19. chrome 实验室
  20. joomla模板的应用

热门文章

  1. tftp服务器连接开发板下载内核提示:retry count exceeded; starting again
  2. java break 在if 中使用_java中使用国密SM4算法详解
  3. python环境配置opencv_【Python】python2.7 安装配置OpenCV2
  4. python跨目录调用_python 跨目录访问文件
  5. python俄罗斯方块课程设计报告_用python实现俄罗斯方块
  6. 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!
  7. linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高
  8. 干货 | 深度学习名词表:57个专业术语加相关资料解析(附论文)
  9. JavaScript字符串、数组、对象方法总结
  10. jquery 下拉框 select2 运用 笔记