次の宣言があるとします。
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
値 3 を配列の 0 番目のインデックスに入れます- の後
add edi, 3
、edi
配列の 3 番目のインデックスのメモリ アドレスが含まれるようになりました mov al, [array]
0 番目のインデックスの DATA を にロードしますal
。mov al, [array+3]
3 番目のインデックスの DATA を にロードしますal
。mov [al], [array]
x86 は 2 つの明示的なメモリ オペランドをエンコードできず、al
は 8 ビットしかなく、16 ビット アドレッシング モードでも使用できないため、無効です 。メモリ位置の内容を参照します。(x86 アドレッシング モード)mov array, 3
は無効です。「格納されているオフセットが気に入らないarray
ので、3 と呼びます」とは言えないからです。即値は、ソース オペランドのみにすることができます。mov byte [array], 3
値 3 を配列の 0 番目のインデックス (最初のバイト) に入れます。 指定子は、メモリ、即値オペランドを使用する命令のバイト/ワード/dword 間のあいまいさを回避するために必要です。byte
そうしないと、アセンブル時のエラー (あいまいなオペランド サイズ) になります。
これらのいずれかが間違っている場合は言及してください。(編集者注:構文エラー/あいまいさを修正したため、有効なものは実際には有効なNASM構文です。詳細については、他のQ&Aをリンクしています)