メモリの場所から別のメモリの場所にデータを直接移動できないのはなぜですか。
ばかげた質問をしている場合は申し訳ありませんが、少なくとも私が遭遇したものについては、これが本当の状況だと思います (8085,8086 n 80386)
私は実際にデータを移動するための解決策を探しているわけではありません (たとえば、movs n all を使用するなど) が、実際にはこの異常の理由です。
メモリの場所から別のメモリの場所にデータを直接移動できないのはなぜですか。
ばかげた質問をしている場合は申し訳ありませんが、少なくとも私が遭遇したものについては、これが本当の状況だと思います (8085,8086 n 80386)
私は実際にデータを移動するための解決策を探しているわけではありません (たとえば、movs n all を使用するなど) が、実際にはこの異常の理由です。
基本的な理由は、ほとんどの命令セットで1つのレジスタオペランドと1つのメモリオペランドが許可されており、この形式に準拠すると、命令デコーダの設計が容易になるためです。また、命令は通常1つのメモリ位置に対してのみメモリ操作を発行でき、最大で1つのレジスタブロックの読み取りまたは書き込みが可能であるため、CPU内の実行エンジンが容易になります。
メモリ間命令を直接実行するには、2つのメモリ位置を指定する必要があります。これは、レジスタ/メモリ命令フォーマットを考えると厄介です。マシンのパフォーマンスを考えると、これだけのために命令フォーマットを変更する理由はほとんどありません。
最近のCPUで使用されているハックは、ある種のブロック移動命令を提供することです。この命令では、ソースと宛先の場所がレジスターにあります(X86の場合、これはそれぞれESIとEDIです)。次に、命令は2つのレジスタ(またはx86の場合は、どちらのレジスタを単に知っている命令)を指定するだけです。これにより、命令のデコードの問題が解決されます。
命令実行の問題は少し難しいですが、人々はたくさんのトランジスタを持っています。あるレジスタから間接的に読み取り、別のレジスタを介して間接的に書き込み、両方をインクリメントすることは、シリコンでは扱いにくいですが、それはいくつかのトランジスタをかみ砕くだけです。これで、要求したとおりに、メモリからメモリに移動する命令を作成できます。X86で注目されている他のポスターの1つに、これを正確に実行するインストルシトン(MOVB、MOVW、MOVSなど)があります。一度に1メモリバイト/ワード/...です。
CPUは高帯域の読み取りと書き込みを生成できるため、メモリのブロックを移動するのが理想的です。x86は、MOV-にREP(リピート)プレフィックスを付けてこれを行い、より大きなブロックを移動します。
しかし、1つの命令でこれを実行できる場合、実行に長い時間がかかる可能性があり(1Gbの移動時間?->数百万クロックサイクル!)、CPUの割り込み応答速度が損なわれるという問題があります。
x86は、PCを命令の先頭に戻して、REPMOV-を中断できるようにすることでこれを解決します。移動中にレジスタを適切に更新することにより、高速ブロック移動と高い割り込み応答率の両方を備えたREPMOV命令を中断して再起動できます。管の下のより多くのトランジスタ。
RISCの担当者は、ブロック移動命令のこのような複雑さはほとんど価値がないことを理解しました。ダムループ(x86でも)をコーディングできます。
copy: MOV EAX,[ESI]
ADD ESI,4
MOV [EDI],EAX
ADD EDI,4
DEC ECX
JNE copy
これは、REPMOV-と同じ基本的なことを行います。最近のCPU(x86など)のほとんどはこれを非常に高速に実行するため(スーパースカラーなど)、バスはカスタム移動命令と同じように使用されますが、これらの無駄なトランジスタ(または対応する熱)をすべて必要としません。
MOVSはどうですか?esi によってアドレス指定された 8/16/32 ビット値を、edi によってアドレス指定された場所に移動します。
CPU と RAM の間には、1 セットのアドレス ライン、1 セットのデータ ライン、および数本の制御ラインがあります。2 番目のアドレス ラインのセットと RAM 内の複雑なロジック全体がなければ、メモリからメモリに物理的に直接移動することはできません。したがって、一時的にレジスタに格納する必要があります。
ロードとストアを一緒に実行し、プログラマーには 1 つの命令のように見える命令を作成することもできますが、命令サイズ、実効アドレス計算ロジックの非重複、パイプラインなど、それを保持することが望ましいその他の考慮事項があります。よりシンプル。
ほとんどの CPU の種類は、メモリからメモリへの移動を許可しません。通常、CPU は一度に 1 つのメモリ位置にしかアクセスできません。つまり、値を移動するときに値を格納するための一時的な場所 (通常は汎用レジスタ) が必要です。考えてみると、あるメモリ ロケーションから別のメモリ ロケーションに直接移動するには、CPU が RAM の 2 つの異なるスポットに同時にアクセスできる必要があります。同じRAMにアクセスするのに十分な「いい」はかなり悪いでしょう。チップ設計者は、ある RAM チップから別の RAM チップに直接コピーできるようにするためのいくつかのトリックを引き出すことができたかもしれませんが、それは非常に特殊なアプリケーションの種類の機能であり、非常にまれな問題を解決するためにコストと複雑さを追加するだけです。
特別な DMA ハードウェアを使用して、少なくとも CPU の観点からは、一時ストレージなしでメモリが移動されているようにプログラムに見せることができる場合があります。
一般に、メモリ-メモリ マシンは、ロード-ストア マシンよりも低速です。これは、1980年頃にRISCの研究者によって推測/解明/発明されました。そのため、古いアーキテクチャ (VAX/OS360) はメモリ-メモリ アーキテクチャを持つ傾向があります。新しいマシンはロードストアを行います。
もう 1 つの興味深いバリアントは、スタック マシンです。彼らは常に少数派として存在しているようです。