装配师和模数

时间:2014-03-04 06:40:36

标签: assembly

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?

1 个答案:

答案 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