• <自己动手写操作系统>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比对学习,参看注解

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


    无论生活、还是技术,一切都不断的学习和更新~~~努力~
  • 相关阅读:
    Mondriaan's Dream POJ
    H
    Superdoku Kattis
    Corn Fields POJ
    旅行的意义 Gym
    G
    J
    Welcome Party ZOJ
    redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
    redis入门到精通系列(二):redis操作的两个实践案例
  • 原文地址:https://www.cnblogs.com/GoGoagg/p/2032474.html
Copyright © 2020-2023  润新知