次のように宣言したとします。
section .bss
buffer resb 1
そして、これらの指示は次のように続きますsection .text
:
mov al, 5 ; mov-immediate
mov [buffer], al ; store
mov bl, [buffer] ; load
mov cl, buffer ; mov-immediate?
bl には値 5 が含まれ、cl には変数のメモリ アドレスが含まれるという理解で正しいでしょうかbuffer
?
私は次の違いについて混乱しています
- 即値をレジスタに移動する、
- レジスタを即値に移動する(データとアドレスのどちらが入るか?)
- 括弧なしで即値をレジスタに移動する
- 例えば
mov cl, buffer
、mov cl, [buffer]
- 例えば
更新: 回答を読んだ後、次の要約が正確であると思われます。
mov edi, array
0 番目の配列インデックスのメモリ アドレス (edi
つまりラベル アドレス) を配置します。mov byte [edi], 3
配列の0番目のインデックスに値3を入れます- 以降
add edi, 3
、edi
配列の3番目のインデックスのメモリアドレスが含まれるようになりました。 mov al, [array]
ゼロ番目のインデックスの DATA を にロードしますal
。mov al, [array+3]
3番目のインデックスのデータを にロードしますal
。mov [al], [array]
無効ですx86 は 2 つの明示的なメモリオペランドをエンコードできませんは 8 ビットしかないためal
、16 ビット アドレッシング モードでも使用できません。メモリ位置の内容を参照します。(x86 アドレッシング モード)mov array, 3
は無効です。なぜなら、「格納されているオフセットが気に入らないarray
ので、3 と呼ぶことにします」と言うことはできないからです。即値はソース オペランドとしてのみ使用できます。mov byte [array], 3
配列の 0 番目のインデックス (最初のバイト) に値 3 を格納します。指定子byte
が必要ですメモリ、即値オペランドを持つ命令のバイト/ワード/ダブルワード間の曖昧さを回避するためです。そうしないと、アセンブル時エラー (オペランド サイズが曖昧) が発生します。
これらが間違っている場合は、お知らせください。(編集者注:構文エラーや曖昧さを修正したので、有効なものは実際にはは有効なNASM構文。詳細については他のQ&Aにリンクされています。
ベストアンサー1
角括弧は基本的に逆参照演算子のように機能します (たとえば、*
C の場合のように)。
つまり、
mov REG, x
の値x
は に移動しますREG
が、
mov REG, [x]
x
が指すメモリ位置の値を に移動しますREG
。x
がラベルの場合、その値はそのラベルのアドレスであることに注意してください。
あなたの質問に関して:
bl には値 5 が含まれ、cl には変数 buffer のメモリ アドレスが含まれるという理解で正しいでしょうか?
はい、その通りです。ただし、CL
は 8 ビット幅しかないため、 のアドレスの最下位バイトのみが含まれることに注意してくださいbuffer
。