第六课突破512字节的限制上
  前⼏节我们介绍了FAT12⽂件系统,制作了虚拟软盘⽂件a.img,并在Qt Creater中进⾏了⽂件内容的读取实验。那些读取都是使⽤外部的程序实现的,实际应⽤中,我们需要⽤主引导程序来实现⽂件的读写,主引导程序存在于主引导扇区MBR 中,也就是说程序和⽂件是存在⼀张盘上的,⽽且这些主引导程序需要使⽤汇编语⾔实现。接下来,我们就来实现具有读取功能的主引导程序。
  为了验证⽂件读取的正确性,我们需要在主引导程序中先实现⼀个字符串打印函数。BIOS已经将中断向量写到了内存的指定位置处,这其中就有能实现字符串打印的函数,我们需要做的就是配置⼀些参数,需要配置的参数和配置步骤如下:
  1、指定打印参数(AX=0x1301 , BX = 0x0007)
  2、指定字符串的内存地址(ES:BP  = 字符串地址)
  3、指定字符串的长度(CX = 字符串长度)
  4、中断调⽤(int 0x10)
⽰例如下:
  需要⽤到的汇编语⾔的知识点如下:
  下⾯直接给出打印字符串的汇编程序: 1 org 0x7c00
2
3 jmp short start
4 nop
5
6 define:
7    BaseOfStack equ 0x7c00
8
9 header:
10    BS_OEMName    db "D.T.Soft"
11    BPB_BytsPerSec dw 512
12    BPB_SecPerClus db 1
13    BPB_RsvdSecCnt dw 1
14    BPB_NumFATs    db 2
15    BPB_RootEntCnt dw 224
16    BPB_TotSec16  dw 2880
17    BPB_Media      db 0xF0
18    BPB_FATSz16    dw 9
19    BPB_SecPerTrk  dw 18
20    BPB_NumHeads  dw 2
21    BPB_HiddSec    dd 0
22    BPB_TotSec32  dd 0
23    BS_DrvNum      db 0
24    BS_Reserved1  db 0
25    BS_BootSig    db 0x29
26    BS_VolID      dd 0
27    BS_VolLab      db "D.T.OS-0.01"
28    BS_FileSysType db "FAT12  "
29
30 start:
31    mov ax, cs
32    mov ss, ax
33    mov ds, ax
34    mov es, ax
35    mov sp, BaseOfStack
36
37        mov ax, MsgStr
38        mov bp, ax
39
40        mov ax, ds
41        mov es, ax
42
43        mov cx, 6
44    call Print
45
46 last:
47    hlt
48    jmp last
49
50 ; es:bp --> string address
51 ; cx    --> string length
52 Print:
53    mov ax, 0x1301
54    mov bx, 0x0007
55    int 0x10
56    ret
57
58 MsgStr db  "Hello, DTOS!"
59 MsgLen equ ($-MsgStr)
60 Buf:
61    times 510-($-$$) db 0x00
62    db 0x55, 0xaa
  我们的虚拟软盘⽂件a.img已经格式化好了,现在要修改的只是第⼀个扇区即主引导扇区,所以我们要按照FAT12的格式来填充第⼀个扇区,因此,上⾯的程序中,第10到28⾏是FAT12的引导扇区的信息,它前⾯还有三个字节,其中前两个字节是跳转指令jmp short start,第三个字节为空指令nop。从start开始是我们的可执⾏程序,BaseOfStack是定义的栈底地址。
  汇编程序我们需要编译成⼆进制可执⾏程序,然后写⼊a.img虚拟软盘的第⼀个扇区中,每次都执⾏这个过程很⿇烦,我们将这个过程写成makefile,如下所⽰:
1 .PHONY : all clean rebuild
2
3 SRC := boot.asm
4 OUT := boot.bin
5 IMG := a.img
6
7 RM := rm -fr
8
9 all : $(OUT) $(IMG)
10    dd if=$(OUT) of=$(IMG) bs=512 count=1 conv=notrunc
11    @echo "Success!"
12
13 $(IMG) :
14    bximage $@ -q -fd -size=1.44
15
16 $(OUT) : $(SRC)
17    nasm $^ -o $@
18
19 clean :
20    $(RM) $(IMG) $(OUT)
21
22 rebuild :
23    @$(MAKE) clean
24    @$(MAKE) all字符串截取后六位
25
bochs的启动⽂件修改成如下内容:
1 >>>>>>>>>>>>###
2 # Configuration file for Bochs
3 >>>>>>>>>>>>###
4
5 # how much memory the emulated machine will have
6 megs: 32
7
8 # filename of ROM images
9 romimage: file=/usr/share/bochs/BIOS-bochs-latest
10 vgaromimage: file=/usr/share/vgabios/vgabios.bin
11
12 # what disk images will be used
13 floppya: 1_44=a.img, status=inserted
14 # choose the boot disk.
15 boot: a
16
17 # where do we send log messages?
18 # log:
19
20 # disable the mouse
21 mouse: enabled=0
22
23 # enable key mapping, using US layout as default.
24 keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
  启动bochs,即可得到运⾏结果,如下所⽰:
  可见,hello已经成功打印出来了。
  接下来,我们开始读取⽂件,假如我们知道了数据所在的扇区,那么怎么将它读出来呢?先来看⼀下软盘的构造,如下所⽰:
  3.5⼨软盘的特性如下:
  根据逻辑扇区号计算磁头号、柱⾯号、物理扇区号的⽅法如下:
  软盘复位和软驱数据读取的参数如下:
  整体的读取流程如下:
  需要⽤到的汇编知识点如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论