1

最近、 BrokenThornでのOS開発に関するいくつかの素晴らしいチュートリアルを読みました。これは素晴らしいOSDevシリーズです。

ブートローダーのステージ2をロードしたいときに、「次のクラスターを計算する」という考え方を理解するのに苦労しています。コードは:

      mov     ax, WORD [cluster]  ; The 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
      jz      .EVEN_CLUSTER 

次のクラスター番号を取得するために、現在のクラスター番号に3/2を掛けるのはなぜですか?

4

3 に答える 3

3

アセンブリタグで同じ質問を見つけましたが、参照するために見つけることができません!! (とても参考になります)ごめんなさい。

では、なぜインデックスに3/2を掛けて、次のクラスターのインデックスを取得するのでしょうか。

まず、いくつかのアイデアを明確にする必要があります。

FATテーブルのEnrtyとは何ですか?

長さ12ビットのメモリの平和です。したがって、FATテーブルはこのエントリのアンサンブルです。

このエントリには何がありますか?

このメモリの平和にはインデックス(番号)があり、このインデックスは同じFATテーブル内のエントリ(FAT開始アドレスからのエントリの数)を参照します。

各エントリの長さは12ビットです:

<---- 12 bits ----><---- 12 bits ----><---- 12 bits ----><---- 12 bits ---->
    1st index          2nd index          3rd index         4th index 

ルートディレクトリから最初のインデックスを取得したら(例:4)、FATテーブルのこのインデックスに移動して、次のクラスター番号のインデックスを見つける必要があります。どのように進めますか?

FATテーブルの開始アドレス(見つけやすい)が必要で、インデックスを追加するだけです。次のようになります。

     mov bx, [FAT address]   ; Strat address of FAT table
     mov ax, [cluster]       ;the index (for ex: 4)
     add bx, ax              ;Start address + index = the next Entry (cluster).

簡単 :-)!!

しかし、3/2の分数はどこにありますか?:-D。
上記のコードは間違っています、なぜですか?

論理は正しいですが、「アドレス指定ユニット」の誤解があります。
ほとんどのCPUでは、ユニットのアドレス指定はBYTE(8ビット)であるため、[インデックス]を作成すると、次のようになります。インデックス*メモリ内の8ビット。したがって、[cluster] ---> index * 8ビットを作成すると、このように8ビット長のエントリにインデックスが付けられます。

これに対して、私たちのインデックスは8ビットではなく12ビットです!!! では、この大きな問題をどのように解決するのでしょうか?

解決策: [クラスター]に3/2を掛けるだけです。つまり、
インデックス*8ビット*3/2=インデックス*12ビットです。それが私たちに必要なものです!! これで、メモリに12ビット単位(1.5バイト)のインデックスを付けることができます。
正しいコードは次のとおりです。

     mov bx, [FAT address]   ; Strat address of FAT table
     mov ax, [cluster]       ;the index (for ex: 4)
     mov dx, ax              ; make copy of index
     shr dx, 0x0001          ; divide it By 2.
     add ax, dx              ; index/2 + index = index * 3/2.
     add bx, ax              ;Start address + index = the next Entry (cluster).

私は初心者なので、何か問題がある場合は通知してください; -D !! ありがとう。

于 2012-12-13T13:22:41.053 に答える
1

この奇妙さは、FAT12 ファイル システムに固有のものです。

FAT12 のクラスターのレコードのサイズは 12 ビットであるため、ファイル アロケーション テーブルでそのオフセット (バイト単位) を計算するには、インデックスを取得して 3/2 (または 12 ビット/8 ビット) を掛ける必要があります。

クラスター レコードには、ファイルまたはファイルの終わりマークの次のクラスター (リンクされたリスト内のポインターなど) の数が含まれます。空きクラスタの場合、クラスタ レコードは不良クラスタをマークするか、単に空きである可能性があります。

于 2012-12-12T18:37:05.030 に答える