在线支付网站制作,百度关键字搜索到自己的网站,网上商城简介怎么写,网页制作要多少钱下面代码读取柱面:0,磁头:0,扇区从2到18的数据到内存 0x8200~0xa3ff处
需要明白以下几点: 给定柱面,磁头,一个扇形区域是512字节,对应的物理可以理解为512个灯泡组(一个灯泡组有8个小灯泡)确定读取到内存中的位置 为什么是0x8200:因为0x8000~0x81ff这512个字节要留给启动区.为…下面代码读取柱面: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 0x13SI大于5时,执行error代码段 JAE(Jump if above or equal):大于等于 CMP SI,5
JAE errorJNC(Jump if not carry):如果没有出错的话跳到后面的代码段next代码段:用于读取下一个磁盘扇形区到内存中 一个扇形区域是512B,对应的段地址(es)偏移为0x0020,故使用AX给es加0x0020
总体代码如下
; haribote-ipl
; TAB4ORG 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 ; AH0x02 : 读入磁盘(柱面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