レジスタまたはメモリの場所に値(例:MVI 3A
またはMVI 53
)、その特定の値でレジスタまたはメモリの場所を初期化するものは何ですか?初期化を行うのはCPUですよね?しかし、それらの値はどこから引き出されているのでしょうか?
注:質問している命令セットアーキテクチャについては言及していなかったので、私はいくつかの仮定を立てて、当てはめる必要があります。また、教科書や学習資料が今日の「デスクトップCPU」とは異なるアーキテクチャを参照しているように見えるので、どのアーキテクチャを参照しているかがわかるように、教科書または学習資料の名前を引用してください。
これ以上の情報がなければ、私のインターネット検索は、この本を参照している可能性があることを示しているようです:マイクロプロセッサとマイクロコントローラ:アーキテクチャ、プログラミング、およびシステム設計
I
のMVI
は、immediateを指します。アセンブリプログラミングでは、「即値」は、命令自体に直接エンコードされる値です。
簡単にするために、最初に、固定された命令サイズを持つアーキテクチャの場合に注目します。たとえば、各アセンブリ命令は32ビットです。
32ビットの一部は、加算、減算、メモリからのロード、メモリへの格納、分岐などの操作を指定するオペコードを格納するために使用されます。MVI
は、設定されるオペコードのニーモニックです特定のレジスタを特定の値に。
32ビット命令の残りのビットは、オペコードが何であるかに応じて目的に使用されます。異なるオペコードは、残りのビットを異なる方法で使用します。
MVI
の場合、残りのビットのいくつかは、その「即時値」で更新されるCPUレジスタを指定します。残りのビットは、この即値をエンコードするために使用されます。
通常、CPUはこの即時値をフェッチするために追加のメモリ要求を行う必要がないことを強調しておきます。その理由は、CPUが 命令デコード ステップを実行する前に、メモリから命令全体(32ビット)を既にロードしているためです。したがって、オペコード、レジスタ識別子、および即値がすべて命令デコーダにロードされます。
命令デコーダは、ALU入力ポートの1つを介して、この即値を算術論理演算ユニット(ALU)に渡すことができます。 ALUは何も実行しないように設定されます-同じ入力値を出力として渡します。レジスタファイルは、ALU出力ポートからこの値を受け入れ、MVI
命令の命令デコーダの解析に従って、宛先レジスタに格納するように構成されています。
即値は技術的には指示の一部です。
詳細は異なる場合がありますが、同様の手順が多くのアーキテクチャにわたって存在します。
場合によっては、アーキテクチャのワードサイズは32ビットです。つまり、ALUおよびメモリ操作は32ビット幅であり、命令サイズも32ビットに固定されています。オペコードとレジスタ識別子が命令ビットの一部を占めているため、即値を32ビットにすることはできません。代わりに、即値はより少ないビット数に制限されます。たとえば、オペコードが6ビットで、レジスタ識別子が5ビット(最大32のレジスタをサポート)の場合、即時値に使用できる残りのビット数は32 - 6 - 5 == 21
ビットです。アーキテクチャによっては、この21ビットの即時値は、符号付きまたは符号なしとして解釈される場合があります。
他の一部のアーキテクチャでは、即値は命令自体にパックされず、そのすぐ隣に格納されます。
||住所|指示データ|| || 0 | MVI || || 2 | 0x1234 || || 4 | ||次の命令は||
これらのアーキテクチャでは、追加のメモリアクセスが必要になる場合があります。アドレス0
のMVI
命令により、命令デコーダーはアドレス2
のデータを命令としてではなく、MVI
命令の値として扱います。
この設計では、MVI
命令が全幅データ(16ビット)をレジスターにロードできますが、分岐命令がアドレス2
をジャンプターゲットとして指定する危険があることに注意してください。 。データは任意の16ビット値である可能性があるため、このアドレスに到達する分岐命令は、そのデータを命令のオペコード(誤ってその16ビット値と同じビットパターンを持つ任意のオペコード)として誤って解釈します。したがって、アセンブリ言語プログラマが意図しない任意の命令を実行します。
さらに他のいくつかのアーキテクチャでは、MVI
に相当するものがまったくない可能性があります。代わりに、値はメモリからロードする必要があり、通常はLD
(ロード)という名前です。
||住所|データ/指示|| || 0 | LD R1、(address)128 || || 2 |次の命令|| || ... | ... || || 128 | 0x1234 ||
MVI(Move Immediate)は、MVIオペコード自体(「オペランド」)に隣接するメモリ位置から即値をコピーします。この値は、アセンブル時にマシンコードに組み込まれ、コードセグメント(実行中の命令を含むメモリブロック)に存在します。
一般に、アセンブリ言語には命令とオペランドの両方があります。
値をロードするとき、命令には、操作に必要なデータを指定するオペランドがあります。これは、Cで整数または整数へのポインタを設定する方法と同様に、別のメモリ位置の値またはリテラル値である可能性があります。おそらく、2つの種類に対して異なるマシンコード命令があるか、または組み込みのインジケータがある可能性があります。オペランドに、解釈方法を指定します。議会レベルでは、これは無関係です。
CPUが命令をロードして実行すると、CPUはそれが属するリテラル値を格納するか、メモリから値をロードして格納します。
これは、値が命令のオペランドから取得されることを意味しますが、値は別のレベルの間接参照であり、別のメモリ位置に格納される可能性があります。