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?
发布于 2014-03-04 07:07:31
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。
https://stackoverflow.com/questions/22164745
复制相似问题