次のコードを考えます:
L1 db "Word", 0
mov al, [L1]
mov eax, L1
括弧([L1])は何を表していますか?
[L1]
は、アドレスL1のメモリ内容を意味します。ここでmov al, [L1]
を実行した後、al
レジスタはアドレスL1(文字 'w')でバイトを受信します。
[ebp]
などのこのタイプのオペランドは、 メモリオペランド と呼ばれます。
ここでの答えはすべて良いですが、厳格なルールとしてこれに従うことの注意事項はありません-ブラケット、次にdereference、lea
命令の場合を除きます。
lea
は上記の規則の例外です。言った
mov eax, [ebp - 4]
ebp
の値から4が減算され、括弧は結果の値がアドレスとして取得され、そのアドレスにある値がeax
に格納されることを示します。ただし、lea
の場合、括弧は次のことを意味しません。
lea eax, [ebp - 4]
ebp
の値から4が減算され、結果の値がeax
に格納されます。この命令は、アドレスを計算し、計算された値をデスティネーションレジスタに保存するだけです。詳細については この投稿 をご覧ください。
単に、ラベルL1でマークされたアドレスのメモリを取得することを意味します。
Cが好きなら、次のように考えてください:[L1]
は*L1
と同じです
括弧は、アドレスの参照解除を意味します。例えば
mov eax, [1234]
つまり、アドレス1234の内容をEAXに移動します。そう:
1234 00001
EAXには00001が含まれます。
ダイレクトメモリアドレッシング -al
は、メモリアドレスL1
。
レジスタまたは数値の値を移動する代わりにL1
をレジスタal
に入れ、レジスタ値または数値L1
をメモリへのポインタとして使用して、そのメモリアドレスの内容を取得し、その内容をal
に移動します。
この例では、L1はメモリの場所ですが、レジスタ名が括弧内にある場合は同じロジックが適用されます。
mov al, [ebx]
ロードとも呼ばれます。
多くのアセンブラー言語と同様に、これは間接指定を意味します。つまり、最初のmov
はal
をcontents of L1
(バイト'w'
つまり、アドレスではありません。
2番目のmov
は、実際にeax
をaddressL1
そして、そのコンテンツを取得または設定するために、後でそれを逆参照できます。
どちらの場合も、L1
は、概念的にはアドレスと見なされます。
レジスタ自体に作用するのではなく、レジスタを実際の場所へのポインタとして使用する必要があることを示しています。