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

qlz37238 2012-05-22 08:26:18
下面的代码是《一个操作系统的实现》第4章的源代码。基本与书上是一样的。
只不过把大部分的代码给去掉了。只剩下了一些代码。这个代码的作用就是把逻辑扇区号转换为物理磁盘位置。然后从得到根目录区的文件名及相关属性信息
我看了半天这个代码。感觉这个代码好像有问题。
大家看看。这个代码是不是有问题?


BPB_SecPerTrk DW 18 ; 每磁道扇区数
BPB_NumHeads DW 2 ; 磁头数(面数)
BS_DrvNum DB 0 ; 中断 13 的驱动器号
SectorNoOfRootDirectory equ 19 ; 根目录区的第一个扇区号
mov word [wSectorNo], SectorNoOfRootDirectory
mov cl, 1
ReadSector:
; -----------------------------------------------------------------------
; 怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)
; -----------------------------------------------------------------------
; 设扇区号为 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 ;


...全文
649 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qlz37238 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

; y >> 1 (y/BPB_NumHeads)
这句注释里面应该有 除二 的功能
[/Quote]

相当于除以2。
1/2=0
所以shr al,1过后就是0
汗。相不通的就是这一段。其它的都没问题
qlz37238 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

有些东西看是很难看出来的,调试最实际
[/Quote]

运行了.但是结果是正确的.
调试过后与自己想的觉得不对.
shr al, 1
我就是觉得奇怪的就是这一句.
ax=19
bx=18
div bl过后
al=1,ah=1
在这里要从第19个扇区开始查找.那肯定是柱面是0磁道是1扇区是2
但是后面还有shr al,1
这样al=0 在执行mov ch, al过后.磁道就变成了0.
但是运行结果是正确的.
汗.其实我就是想不通这一点.
WJN92 2012-05-23
  • 打赏
  • 举报
回复
; y >> 1 (y/BPB_NumHeads)
这句注释里面应该有 除二 的功能
WJN92 2012-05-22
  • 打赏
  • 举报
回复
有些东西看是很难看出来的,调试最实际

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧