Assembly-programming-assembly-addressing-modes
アセンブリ-アドレス指定モード
ほとんどのアセンブリ言語命令では、オペランドを処理する必要があります。 オペランドアドレスは、処理されるデータが保存される場所を提供します。 オペランドを必要としない命令もあれば、1つ、2つ、または3つのオペランドを必要とする命令もあります。
命令に2つのオペランドが必要な場合、通常、最初のオペランドはデスティネーションであり、レジスタまたはメモリの場所にデータが含まれ、2番目のオペランドはソースです。 ソースには、配信されるデータ(即時アドレス指定)またはデータのアドレス(レジスタまたはメモリ内)が含まれます。 通常、ソースデータは操作後も変更されません。
アドレッシングの3つの基本モードは次のとおりです-
- レジスタのアドレス指定
- 即時アドレス指定
- メモリアドレッシング
レジスタのアドレス指定
このアドレッシングモードでは、レジスタにオペランドが含まれています。 命令に応じて、レジスタは第1オペランド、第2オペランド、またはその両方になります。
例えば、
レジスタ間のデータ処理にはメモリが関与しないため、データの処理が最速になります。
即時アドレス指定
即値オペランドには、定数値または式があります。 2つのオペランドを持つ命令が即時アドレス指定を使用する場合、最初のオペランドはレジスタまたはメモリの場所であり、2番目のオペランドは即時定数です。 最初のオペランドは、データの長さを定義します。
例えば、
ダイレクトメモリアドレッシング
オペランドがメモリアドレッシングモードで指定されている場合、通常はデータセグメントへのメインメモリへの直接アクセスが必要です。 このアドレス指定方法では、データの処理が遅くなります。 メモリ内のデータの正確な位置を特定するには、通常DSレジスタとオフセット値にあるセグメント開始アドレスが必要です。 このオフセット値は、*有効アドレス*とも呼ばれます。
直接アドレス指定モードでは、オフセット値は通常、変数名で示される命令の一部として直接指定されます。 アセンブラは、オフセット値を計算し、プログラムで使用されるすべての変数のオフセット値を格納するシンボルテーブルを維持します。
ダイレクトメモリアドレッシングでは、オペランドの1つがメモリ位置を参照し、他のオペランドがレジスタを参照します。
例えば、
直接オフセットアドレッシング
このアドレス指定モードでは、算術演算子を使用してアドレスを変更します。 たとえば、データのテーブルを定義する次の定義を見てください-
次の操作は、メモリ内のテーブルからレジスタにデータにアクセスします-
間接メモリアドレス指定
このアドレス指定モードは、コンピューターの_Segment:Offset_アドレス指定機能を利用します。 一般に、メモリ参照用の角括弧内にコード化されたベースレジスタEBX、EBP(またはBX、BP)およびインデックスレジスタ(DI、SI)がこの目的に使用されます。
間接アドレス指定は通常、配列などのいくつかの要素を含む変数に使用されます。 アレイの開始アドレスは、たとえばEBXレジスタに保存されます。
次のコードスニペットは、変数のさまざまな要素にアクセスする方法を示しています。
MOV命令
あるストレージスペースから別のストレージスペースにデータを移動するために使用されるMOV命令をすでに使用しています。 MOV命令は2つのオペランドを取ります。
構文
MOV命令の構文は-
MOV命令は、次の5つの形式のいずれかを持つことができます-
次のことに注意してください-
- MOV操作のオペランドは両方とも同じサイズでなければなりません
- ソースオペランドの値は変更されません
MOV命令は、あいまいさを引き起こすことがあります。 たとえば、ステートメントを見てください-
110に相当するバイトを移動するのか、ワードに相当するのを移動するのかは明確ではありません。 そのような場合、 type specifier を使用するのが賢明です。
次の表は、一般的な型指定子の一部を示しています-
Type Specifier | Bytes addressed |
---|---|
BYTE | 1 |
WORD | 2 |
DWORD | 4 |
QWORD | 8 |
TBYTE | 10 |
例
次のプログラムは、上記で説明した概念の一部を示しています。 メモリのデータセクションに「Zara Ali」という名前を保存し、プログラムで値を別の名前「Nuha Ali」に変更し、両方の名前を表示します。
上記のコードをコンパイルして実行すると、次の結果が生成されます-