LBACHS:
xor dx, dx ; prepare dx:ax for operation
div WORD [bpbSectorsPerTrack] ; calculate (AX / WORD [bpbSectorsPerTrack]
inc dl ; adjust for sector 0
mov BYTE [absoluteSector], dl
xor dx, dx ; prepare dx:ax for operation
div WORD [bpbHeadsPerCylinder] ; calculate
mov BYTE [absoluteHead], dl ;
mov BYTE [absoluteTrack], al ;Quotient is returned in AL
ret
关于这段代码我有两个问题。
我认为DIV
将结果存储在AX而不是DL?为什么要增加DL寄存器?
如何计算模数?用DL?
答案 0 :(得分:1)
16位DIV
指令将DX:AX中的32位值除以16位数字(在您的情况下来自[bpbSectorsPerTrack]
);然后将商存储在AX中,余数存储在DX中。
对于您的具体情况,除法前DX:AX中的值是LBA扇区号。除法后,AX中的值为LBA / sectors_per_track
,DX中的值为LBA % sectors_per_track = CHS_sector - 1
。 注意:对于CHS,第一个扇区是扇区号1而不是扇区号0,这就是涉及inc
的原因。
对于第二个分区,DX:AX中的值预先为LBA / sectors_per_track
。除法后,AX中的值为(LBA / sectors_per_track) / heads_per_cylinder = cylinder
,DX中的值为(LBA / sectors_per_track) % heads_per_cylinder = head
。