<自己动手写操作系统>2011042901

【分析】

函数ReadSector
1 ;----------------------------------------------------------------------------
2
3 ; 函数名: ReadSector
4
5 ;----------------------------------------------------------------------------
6
7 ; 作用:
8
9 ; 从第 ax 个 Sector 开始, 将 cl 个 Sector 读入 es:bx 中
10
11 ReadSector:
12
13 ; -----------------------------------------------------------------------
14
15 ; 怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)
16
17 ; -----------------------------------------------------------------------
18
19 ; 设扇区号为 x
20
21 ; ┌ 柱面号 = y >> 1
22
23 ; x ┌ 商 y ┤
24
25 ; -------------- => ┤ └ 磁头号 = y & 1
26
27 ; 每磁道扇区数 │
28
29 ; └ 余 z => 起始扇区号 = z + 1
30
31 push bp
32
33 mov bp, sp
34
35 sub esp, 2 ; 辟出两个字节的堆栈区域保存要读的扇区数: byte [bp-2]
36
37
38
39 mov byte [bp-2], cl
40
41 push bx ; 保存 bx
42
43 mov bl, [BPB_SecPerTrk] ; bl: 除数
44
45 div bl ; y 在 al 中, z 在 ah 中
46
47 inc ah ; z ++
48
49 mov cl, ah ; cl <- 起始扇区号
50
51 mov dh, al ; dh <- y
52
53 shr al, 1 ; y >> 1 (其实是 y/BPB_NumHeads, 这里BPB_NumHeads=2)
54
55 mov ch, al ; ch <- 柱面号
56
57 and dh, 1 ; dh & 1 = 磁头号
58
59 pop bx ; 恢复 bx
60
61 ; 至此, "柱面号, 起始扇区, 磁头号" 全部得到 ^^^^^^^^^^^^^^^^^^^^^^^^
62
63 mov dl, [BS_DrvNum] ; 驱动器号 (0 表示 A 盘)
64
65 .GoOnReading:
66
67 mov ah, 2 ;
68
69 mov al, byte [bp-2] ; 读 al 个扇区
70
71 int 13h
72
73 jc .GoOnReading ; 如果读取错误 CF 会被置为 1, 这时就不停地读, 直到正确为止
74
75
76
77 add esp, 2
78
79 pop bp
80
81
82
83 ret
上述代码,没有太多的深奥之处。可以结合http://blog.csdn.net/x12143/archive/2010/03/23/5408031.aspx比对学习,参看注解

好了,这个部分暂时算过了吧,实在喊我用汇编来写,的确有些难。以后多读哈,找另外的方式来验证和实践


无论生活、还是技术,一切都不断的学习和更新~~~努力~
原文地址:https://www.cnblogs.com/GoGoagg/p/2032474.html