2017-02-09 25 views
0

Я не понимаю, почему мы делим текущий кластер и добавляем результат сам по себе.
Вот кодНе удается понять, как индексировать таблицу FAT для поиска нового кластера в файловой системе FAT12

mov  ax, WORD [cluster] ; current cluster 

mov  cx, ax    ; copy current cluster 

mov  dx, ax    ; copy current cluster 

shr  dx, 0x0001   ; divide by two 

add  cx, dx    ; sum for (3/2) 

mov  bx, 0x0200   ; location of FAT in memory 

add  bx, cx    ; index into FAT 

mov dx, WORD [bx]  ; read two bytes from FAT 

test ax, 0x0001 

jnz  .ODD_CLUSTER ; Remember that each entry in the FAT is a 12 but value. If it represents ; a cluster (0x002 through 0xFEF) then we only want to get those 12 bits ; that represent the next cluster  

    .EVEN_CLUSTER:   
and  dx, 0000111111111111b  ; take low twelve bits  
    jmp  .DONE 

    .ODD_CLUSTER:   
    shr  dx, 0x0004     ; take high twelve bits  

.DONE:   
    mov  WORD [cluster], dx   ; store new cluster  
    cmp  dx, 0x0FF0     ; test for end of file   
+0

Возможно, вы захотите прочитать комментарий в своем собственном коде после 'JNZ .ODD_CLUSTER', который говорит все это. – tofro

ответ

1

Кластерные указатели 12 бит каждый. Байт имеет 8 бит, поэтому смещение байта указателя кластера в таблице FAT равно cluster * 12/8 == cluster * 1.5.
Чтобы умножить целое число на 1,5, вы можете сделать i + (i >> 1), что и делает этот код.

+0

спасибо, я получил его –