YASM/NASM x86アセンブリにおける即値と角括弧の基本的な使用法 質問する

YASM/NASM x86アセンブリにおける即値と角括弧の基本的な使用法 質問する

次のように宣言したとします。

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, buffermov cl, [buffer]

更新: 回答を読んだ後、次の要約が正確であると思われます。

  • mov edi, array0 番目の配列インデックスのメモリ アドレス (ediつまりラベル アドレス) を配置します。
  • mov byte [edi], 3配列の0番目のインデックスに値3を入れます
  • 以降add edi, 3edi配列の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が指すメモリ位置の値を に移動しますREGxがラベルの場合、その値はそのラベルのアドレスであることに注意してください。

あなたの質問に関して:

bl には値 5 が含まれ、cl には変数 buffer のメモリ アドレスが含まれるという理解で正しいでしょうか?

はい、その通りです。ただし、CLは 8 ビット幅しかないため、 のアドレスの最下位バイトのみが含まれることに注意してくださいbuffer

おすすめ記事