2016-08-23 5 views
2

8086は16ビット命令を使用していますが、RAMアドレスは8ビットしか保持していません。 1つのアドレスをロードして、命令が1/2/3バイトを必要とするかどうかをチェックし(例えば、レジ​​スタを8/16ビットに直接移動する)、操作を実行するか、1つのRAM 'space'が16ビッグビッグですか?RAMからのプログラムの読み込み8086

+0

実際にはRAMは24ビットです。これは、セグメントレジスタとオフセットで整列された段落の理由です。 8ビットアドレスを指定すると、セグメントレジスタがベースであるとみなされます。 –

答えて

5

多くの命令はマルチバイトであり、複数の命令は2つ以上のアドレスにまたがることを意味します。

メモリバスは16ビットなので、1回の操作で16ビット(2つの隣接アドレス)をロードできます。あなたは、バイトアドレス可能なメモリとバスの幅を混同しています。

それは一つのアドレスをロードし、その命令は1/2/3バイト(例えばレジスタ8/16ビットにすぐに移動)

を必要とする場合には、継続的に命令バイトをフェッチチェックしません6バイトのバッファー(16ビットバスの16ビットCPUなので、一度に2バイト)。バッファは、最大許容8086命令(IDKとは別にデコードされる可能性のある接頭辞を除く)を保持するのに十分な大きさです。直前の命令の実行が終了すると、バッファを調べます。より詳しい説明については、下のリンクを参照してください。おそらく、バッファ全体を命令としてデコードしようとします。命令の終了を検出する前にフェッチバッファの最後にヒットした場合、次のフェッチサイクルが完了するまで待機し、再度試みます。

参考:8086 CPU architecture、これは「8086コードフェッチ」の最初のヒットです。それはフェッチと実行が重複することを確認するので、最も基本的な方法でパイプラインされます

TL:DR:デコードする命令が完全になるまでバッファにフェッチします。その後、次の命令の一部であるため、余分なバイトはバッファの先頭にシフトされます。

私は通常、命令フェッチが8086のボトルネックであることを読んだので、コードサイズの最適化は他のほとんどすべてを上回っています。


パイプライン処理されたCPUは、復号化を開始するために前の命令の実行が完了するのを待つ必要はありません。現代のCPUもであり、多くの場合、は帯域幅の多いコードフェッチであるため、デコードされた命令のキューが用意されています(ブランチがこれを混乱させる場合を除いて)。とタグwikiのその他のリンクを参照してください。


また、非常に一般的な命令の1つは、push r16のような1バイトです。

+2

私は、私の古いお気に入り[** The Art of Assembly Sect 3.3.7 **]のデコードの雑草に入ることができると思います(https://courses.engr.illinois.edu/ece390/books/artofasm/CH03 /CH03-3.html#HEADING3-102)。これはデコードの概要です。 –

+0

速いとポイントの答えに感謝します。 –

+2

8086のプリフェッチキューはわずか6バイトでしたが、命令の長さに制限はありませんでした。あなたは、あなたが望むように多くの冗長プレフィックスを使用することができます.15バイトの制限が '386'で追加されました。冗長なプレフィックスがなければ、命令は6バイトを超える可能性があります。例えば、 'mov [es:0]、1234'は7バイトです。しかし、接頭辞がまったくなくても、8086命令が6バイトを超えることはできないと思います。私の推測では、プレフィックスバイトは別々にデコードされ、個々の命令と同じように個別にデコードされていました。 –

関連する問題