首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-09-07 
通过逻辑扇区号得到物理磁盘位置(磁头,磁道,扇区)。下面的代码是《一个操作系统的实现》第4章的源代码。基本与

通过逻辑扇区号得到物理磁盘位置(磁头,磁道,扇区)。
下面的代码是《一个操作系统的实现》第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)
 这句注释里面应该有 除二 的功能

热点排行