35

次の宣言があるとします。

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値 3 を配列の 0 番目のインデックスに入れます
  • の後add edi, 3edi配列の 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をリンクしています)

4

4 に答える 4

26

角括弧は、本質的に逆参照演算子のように機能します (たとえば、*C のように)。

だから、次のようなもの

mov REG, x

xの値を に移動しますがREG

mov REG, [x]

xが指すメモリ位置の値を に移動しますREGxがラベルの場合、その値はそのラベルのアドレスであることに注意してください。

あなたの質問については:

bl には値 5 が含まれ、cl には変数バッファーのメモリ アドレスが含まれることを理解しているのは正しいですか?

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

于 2012-04-28T10:13:11.550 に答える
4

RAM ロケーションに値を書き込む (またはその中で計算する) ためのオペランドとして即値を使用するすべての命令では、アクセスするバイト数を指定する必要があります。次の手順が示すように、アセンブルは、たとえば、即値がより低い値である場合、 1バイトワード、またはドップルワードのみにアクセスする必要があるかどうかを認識できないためです。

array db 0FFh, 0FFh, 0FFh, 0FFh
mov byte [array], 3

結果:

array db 03h, 0FFh, 0FFh, 0FFh

....

mov word [array], 3

結果:

array db 03h, 00h, 0FFh, 0FFh

....

mov dword [array], 3

結果:

array db 03h, 00h, 00h, 00h

ダーク

于 2013-05-05T12:35:21.023 に答える