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

下面代码读取柱面: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
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些值得思考的PHP问题

那些值得思考的PHP问题 1、关于弱类型 函数strpos是返回字符串str2在str1的位置,没有找到则返回false,然而如果在实际应用上返回的位置是0,在if语句中0也被当作false,所以我们需要对false做类型判断, $str1 yabadaba…

Lvs Tun隧道模式配置

######## TUN是IP Tunneling ,IP隧道的简称,它将调度器收到的IP数据包封装在一个新的IP数据包中,转交给应用服务器,然后实际服务器的返回数据会直接返回给用户。 工作原理: 用户请求负载均衡服务器,当IP数…

mysql-常用sql

记录下工作中常用的sql 删除重复数据 delete from student where id not in (select min(id) from student group by name); -- 该语句在mysql下会报错, -- 执行报错:1093 - You cant specify target table student for update in FROM clause -- 原因是…

优雅的使用Laravel之phpstorm配置

优雅的使用Laravel之phpstorm配置 先打开一个Laravel 项目,然后在project tool 窗口选择根节点、然后右键->Composer | Init composer 。 如果你的电脑里没有composer.phar,可以点击链接来下载。然后点击项目 composer->add denpendency.. 搜索ba…

算法 --- 求两个集合的并集

const unionL (l1, l2)>{for(let i0; i <l1.length; i){if(l2.indexOf(l1[i]) -1){l2.push(l1[i])}}return l2 }let l1 [1,2,3,4]; let l2 [1,2,5]; console.log(unionL(l1,l2)); //[1, 2, 5, 3, 4]

java实验四——找鞍点

package hello;public class 实验四 {public static void main(String[] args) {// TODO Auto-generated method stubint[][] a {{9,8,6},{2,3,1},{8,5,2}};System.out.println("二维数组为&#xff1a;");for(int i0;i<a.length;i){for(int j0;j<a[i].length;…

BZOJ 4551树题解

好吧&#xff0c;洛谷的数据比较水暴力就可以过。。。。&#xff08;而且跑到飞快&#xff09; 不过&#xff08;BZ水不过去&#xff09;还是讲讲正规的做法。 其实一眼可以看出可以树剖&#xff0c;但是&#xff0c;码起来有点麻烦。 其实有一种更简单的离线做法。 我们很容易…

es6 --- 使用Symbol保护私有变量

定义一个人物类 假设其属性有姓名和性别我们希望,性别在声明后就固定不变 传统方法 var Person (function(){var _gender ;function P(name, gender){this.name name;_gender gender;}P.prototype.getGender function(){return _gender;}return P; })();var p1 new Pe…

组合数

long long factorial(int n) {long long m 1;for(int i1;i<n;i)m*i;return m; } long long C(int n,int m) {return factorial(n)/(factorial(m)*factorial(n-m));//可能会溢出 } 正解&#xff1a; long long C(int n,int m) {if(m<n-m) m n-m;long long ans 1;for(in…

Mysql中的联合索引、前缀索引、覆盖索引

Mysql中的联合索引、前缀索引、覆盖索引 索引 索引是一种特殊的文件&#xff0c;它们包含着对数据表里所有记录的引用指针。更通俗的说&#xff0c;数据库索引好比是一本书前面的目录&#xff0c;能加快数据库的查询速度。 联合索引 又名复合索引&#xff0c;由两个或多个列…

LVM逻辑卷管理

什么是逻辑卷&#xff1f;因为可以将文件系统像卷一样伸长或缩短之故。 LVM做法&#xff0c;将几个物理分区或磁盘&#xff0c;通过软件组合成为一块看起来是独立的大磁盘&#xff08;VG&#xff09;&#xff0c;然后将这块大磁盘再经过分成可使用分区&#xff08;LV&#xff0…

es6 --- 自制迭代器

对象 对象如下 const obj {left: 100,top: 200 }不可迭代 for(let attr of obj){console.log(attr); }迭代规则 可迭代,所具有的属性[Symbol.iterator] 需要自己给obj添加迭代规则 obj[Symbol.iterator] () >{// 获取obj的所有键let keys Object.keys(obj);let len …

软件工程的实践项目课程的自我目标

对实践项目完成后学习到的能力的预期&#xff1a;这算是自己第一次参加的团队合作的软件实践吧&#xff0c;以前自己搞的小“玩意”&#xff0c;实难登大雅之堂&#xff0c;期待实践项目后--->1、自己的代码能力能够有较明显的提高&#xff0c;代码更加规范。 2、提升团队合…

[Shell] swoole_timer_tick 与 crontab 实现定时任务和监控

手动完成 "任务" 和 "监控" 主要有下面三步&#xff1a; 1. mission_cron.php&#xff08;定时自动任务脚本&#xff09;&#xff1a; <?php /*** 自动任务 定时器 (5s 执行).** swoole_timer_tick 解决秒级定时&#xff1b;* 如需调整&#xff0c;注意…

关于项目调研

一、柠檬时代app 1、作品内容&#xff1a; 该作品主要为每一所高校的大学生量身定制的手机生活助手&#xff0c;由您自主运营的校园手机客户端。开放的自定义平台&#xff0c;汇聚本校周边所有生活服务、外卖商家、娱乐休闲、新鲜事儿、知名社团、周边商铺、校园达人等栏目。 …

html 标签

html概述 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。HTML是一种基础技术&#xff0c;常与CSS、JavaScript一起被众多网站用于设计令人赏心悦目的网页、网页应用程序…

es6 --- forEach的实现

forEach的第一个参数 接收回调函数 let a [a, b, c]; a.forEach((v, k ,s)>{console.log(v, k ,s);console.log(this); })v: valuek: keys: 代表数组a本身this指向当前函数执行所在的作用域,即window forEach的第二个参数. forEach第1个参数用于接收回调函数,第2个参数…

java Calendar

1.1 Calendar类概念 Calendar是日历类&#xff0c;在Date后出现&#xff0c;替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量&#xff0c;方便获取。 Calendar为抽象类&#xff0c;由于语言敏感性&#xff0c;Calendar类在创建对象时并非直接创建&…

结对项目之需求分析与原型设计

结对项目之需求分析与原型设计 031402317 李佳恺 031402511 黄家俊 这是我们两个人第一次合作&#xff0c;虽然结对是栋哥帮我们分配的&#xff0c;并且一开始我们就认识&#xff0c;但是也很开心有这个机会能一起合作完成任务。 初步分工我负责随笔&#xff0c;家俊负责原型设…

javaEE项目部署方式

1、手动部署 2、自动化部署 “自动化”的具体体现&#xff1a;向版本库提交新的代码后&#xff0c;应运服务器上自动部署 转载于:https://www.cnblogs.com/zyc-blogs/p/9674606.html