下面的代码是《一个操作系统的实现》第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)
这句注释里面应该有 除二 的功能