第六课突破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小时内删除。
kepserverex 数据类型
« 上一篇
[复习]微机原理复习题6(含答案)
下一篇 »
发表评论