当前位置: 代码迷 >> 汇编语言 >> 经过逻辑扇区号得到物理磁盘位置(磁头,磁道,扇区)
  详细解决方案

经过逻辑扇区号得到物理磁盘位置(磁头,磁道,扇区)

热度:3896   发布时间:2013-02-26 00:00:00.0
通过逻辑扇区号得到物理磁盘位置(磁头,磁道,扇区)。
下面的代码是《一个操作系统的实现》第4章的源代码。基本与书上是一样的。
只不过把大部分的代码给去掉了。只剩下了一些代码。这个代码的作用就是把逻辑扇区号转换为物理磁盘位置。然后从得到根目录区的文件名及相关属性信息
我看了半天这个代码。感觉这个代码好像有问题。
大家看看。这个代码是不是有问题?

Assembly code
BPB_SecPerTrk    DW 18        ; 每磁道扇区数BPB_NumHeads    DW 2        ; 磁头数(面数)BS_DrvNum    DB 0        ; 中断 13 的驱动器号SectorNoOfRootDirectory    equ    19    ; 根目录区的第一个扇区号mov    word [wSectorNo], SectorNoOfRootDirectorymov    cl, 1ReadSector:    ; -----------------------------------------------------------------------    ; 怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)    ; -----------------------------------------------------------------------    ; 设扇区号为 x    ;                          ┌ 柱面号 = y >> 1    ;       x           ┌ 商 y ┤    ; -------------- => ┤      └ 磁头号 = y & 1    ;  每磁道扇区数     │    ;                   └ 余 z => 起始扇区号 = z + 1    push    bp    mov    bp, sp    sub    esp, 2 ; 辟出两个字节的堆栈区域保存要读的扇区数: byte [bp-2]    mov    byte [bp-2], cl    push    bx            ; 保存 bx    mov    bl, [BPB_SecPerTrk]    ; bl: 除数    div    bl            ; y 在 al 中, z 在 ah 中    inc    ah            ; z ++    mov    cl, ah            ; cl <- 起始扇区号    mov    dh, al            ; dh <- y    shr    al, 1            ; y >> 1 (y/BPB_NumHeads)    mov    ch, al            ; ch <- 柱面号    and    dh, 1            ; dh & 1 = 磁头号    pop    bx            ; 恢复 bx    ; 至此, "柱面号, 起始扇区, 磁头号" 全部得到    mov    dl, [BS_DrvNum]        ; 驱动器号 (0 表        mov    ah, 2            ; 读    mov    al, byte [bp-2]        ; 读 al 个扇区    int    13h            ; 


------解决方案--------------------------------------------------------
有些东西看是很难看出来的,调试最实际
------解决方案--------------------------------------------------------
; y >> 1 (y/BPB_NumHeads)
 这句注释里面应该有 除二 的功能
  相关解决方案