アセンブリタグで同じ質問を見つけましたが、参照するために見つけることができません!! (とても参考になります)ごめんなさい。
では、なぜインデックスに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 !! ありがとう。