L1は通常/おそらくラベルであり、メモリ内の特定のアドレスに関連付けられています。プログラマーは便宜上さまざまなラベルを定義し、そのようなラベルはメモリ内の特定の場所を象徴的に表すために使用されます (L1 はお粗末な名前です。ラベルは通常、場所の根底にある目的を示しています。たとえば、PingCounter、ErrorMessage、Login など)。など)。
1 バイトの静的ストレージのラベルは、C コンパイラがchar L1;
グローバル スコープで実装する方法です。
NASM 構文では、 の形式にmov edi, L1
アセンブルされます。つまり、ラベル アドレスは、マシン コードでは 32 ビットの即値になります。(アセンブラは最終的な数値を認識しませんが、リンカは認識します。) MASM 構文では、これはロードであり、ラベル アドレスを即値として取得する必要があることに注意してください。mov eax, imm32
mov
mov edi, OFFSET L1
ただしmov al, [L1]
、逆参照されるアドレスとしてマシン コードに埋め込まれた 32 ビット アドレスを使用して、別の命令にアセンブルします。この命令は、アドレス L1 から 1 バイトをロードし、それを AL に配置します。
アセンブリ言語では、この間接アドレッシング モードは、特定の命令のソースまたはデスティネーション オペランドを角かっこで囲むことによって示されます。(ただし、両方ではありません。x86 は、命令ごとに最大 1 つの明示的メモリ オペランドのみをサポートします。)
mov al, [L1]
L1 に格納されているアドレスを使用して、メモリ内のある場所を特定し、この場所で 1 バイト (= 8 ビット = AL レジスタのサイズ) を読み取り、それを AL レジスタにロードします。
mov [L1], al
これを逆にします。つまり、具体的には、L1 に格納されているアドレスを読み取り、このアドレスを使用してメモリ内の特定の場所を見つけ、そこに AL レジスタの内容を格納します。
以下の情報が不完全であり、x86 ファミリの新しいプロセッサに関してやや古くなっていることを理解していれば、8086 アーキテクチャに関するこの入門書は、x86 ファミリのアセンブリ言語を始めるのに非常に役立つでしょう。
この「古代の CPU」(実際にはまだ使用されています) から始める利点は、基本的な概念がすべてそこにあり、新しいレジスタ セット、派手なアドレス指定モード、動作モード、およびその他の概念の邪魔にならないことです。新しい CPU のより大きなサイズ、機能、およびモードは、オプションの組み合わせの爆発を導入するだけであり、それらのすべて (ほとんど?) は便利ですが、基本的に開始には関係ありません。