第三天是关于读取u盘中扇区,比较关键的一部分,所以博主將分成三部分来介绍关于如何读取u盘的扇区。学会了如何读取u盘的扇区后,就为后面从u盘扇区复制内核程序到内存打下了基础。
本部分將介绍如何读取u盘的第二扇区,代码说明一切,先上代码,然后对关键性的步骤进行解释。
.global start
.code16
start:
jmp entry
/*定义fat12文件格式*/
.byte 0x00
.ascii "helloOSX"
.word 512
.byte 1
.word 1
.byte 2
.word 224
.word 2880
.byte 0xf0
.word 9
.word 18
.word 2
.long 0
.long 2880
.byte 0,0,0x29
.long 0xffffffff
.ascii "myosudisk "
.ascii "fat12 "
.fill 18
entry:
mov $0,%ax
mov %ax,%ds
mov %ax,%es
mov %ax,%ss
mov $0x7c00,%sp
mov %dl,(0x7dfe)
mov $msg,%si
call puts
mov $my,%si
call puts
/*memory=0x8200,chs=002*/
mov $0x820,%ax
mov %ax,%es
mov $0x00,%bx
mov $0x00,%ch
mov $0x00,%dh
mov $0x02,%cl
call read
mov $okmsg,%si
call puts
loop:
jmp loop
read:
mov (0x7dfe),%dl
//mov $0x00,%dl
mov $0x02,%ah
mov $0x01,%al
int $0x13
jc error
ret
error:
mov $errormsg,%si
call puts
hlt
//ret
jmp loop
/*
this is a subfunction to display string
usage: mov $address,%si
call puts
or mov $label,%si
call puts
*/
puts:
movb (%si),%al
add $1,%si
cmp $0,%al
je finish
movb $0x0e,%ah
movw $15,%bx
int $0x10
jmp puts
finish:
;hlt
ret
msg:
.asciz "\r\nmy bootloader is running"
my:
.asciz "\r\nwelcome to our course "
errormsg:
.asciz "\r\nread u flash failed "
okmsg:
.asciz "\r\nread u disk of 2 sector, ok "
.org 510
.word 0xaa55
1:u盘的dr
iver number是多少,dl=??
其实读u盘的第二扇区和读软盘没有什么区别,唯一的不同是我们需要知道u盘的drive number。在调用0x13中断时,dl需要指定一个正确的driver number。
从书本上我们知道软盘的driver number是0x00,但是u盘的drive number是多少?只要知道了这个driver number,我们就可以读取 u盘的第二个扇区到内存了。
从上面的代码中,可以看到有这样一条代码:
mov %dl,(0x7dfe)
不知道大家看懂了没有,其实当bios在读取u盘的512个字节时,已经把u盘的drive number保存到了dl中,我们所做的只是把dl中已经保存的关于u盘的drive number,保存到了内存的0x7dfe处。
到后面读u盘,调用int 0x13中断,需要给dl赋值为u盘drive number时,再从0x7dfe内存地址把drive number读到dl寄存器中,如下图中所看到,这样就可以正确的读取u盘的第二个扇区了,因为我们得到u盘的drive number。
本部分程序的关键就是上图中,做了标记的两部分,得到u盘的drive number,调用 int 0x13读取u盘的第二扇区。
2:关键问题:如何得到u盘的chs结构值?
因为我们从书中都知道 了软盘是chs=80x2x18的结构,读取软盘的chs时10个柱面时,就比较容易了。
可是如果要读取u盘,我们怎么知道自己的u盘的chs结构呢,关于我们的u盘有多个sector,有多少个head,有多少个cylinder呢?
这是很多人在读写u盘时遇到的问题。所以在下一节中,博主会拿出一节来,对如何得到u盘的chs的大小进行讲解。下图是通过汇编程序,读到博主自己u盘的chs结构,有了下面的数据,大家就完全知道如何读取u盘的所有扇区了。
好吧,下节再见!有问题记得加群交流哦!be relax!
博主邮箱cherishsir@gmail.com
qq群:159336168
程序文件照例上传到百度云
帐号:cherishsir@gmail.com密码:cherish