次のように宣言したとします。
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
vs mov cl, [buffer]
更新:回答を読んだ後、私は次の要約が正確だと思います:
mov edi, array
は、0番目の配列インデックスのメモリアドレスをedi
に入れます。つまり、ラベルのアドレス。mov byte [edi], 3
は、VALUE 3を配列の0番目のインデックスに入れますadd edi, 3
の後、edi
には配列の3番目のインデックスのメモリアドレスが含まれるようになりましたmov al, [array]
は、0番目のインデックスのDATAをal
にロードします。mov al, [array+3]
は、3番目のインデックスのDATAをal
にロードします。al
は8ビットのみであり、16ビットアドレッシングでも使用できないため、mov [al], [array]
は無効です。モード。 メモリ位置の内容の参照。(x86アドレッシングモード)mov array, 3
は無効です。「ねえ、array
が格納されているオフセットが好きではないので、3と呼びます」とは言えません。即値はソースオペランドにしかできません。mov byte [array], 3
は、値3を配列の0番目のインデックス(最初のバイト)に入れます。 byte
指定子が必要です メモリ、即値オペランドを使用する命令のバイト/ワード/ dワード間のあいまいさを回避するため。それ以外の場合は、アセンブル時のエラー(あいまいなオペランドサイズ)になります。これらのいずれかが誤りである場合は言及してください。 (編集者注:構文エラー/あいまいさを修正したため、有効なものは実際にare有効なNASM構文です。詳細については、他のQ&Aをリンクしました)
確かに、あなたの考えは正しいです。つまり、blには5が含まれ、clにはbufferのメモリアドレスが含まれます(実際にはラベルバッファ自体がメモリアドレスです)。
さて、あなたが言及した操作の違いを説明しましょう:
レジスタへのイミディエイトの移動は、mov reg,imm
を使用して行うことができます。混乱を招く可能性があるのは、バッファなどのラベルが、アドレスを含むイミディエート値そのものであることです。
即値は2
またはFF1Ah
のような定数であるため、レジスタを即値に実際に移動することはできません。定数を指す場所にレジスタを移動することができます。mov [const], reg
のように実行できます。
mov reg2,[reg1]
などの間接アドレス指定を使用して、reg1が有効な場所を指すようにすることもできます。これにより、reg1が指す値がreg2に転送されます。
したがって、mov cl, buffer
は実際の値を取得しますが、mov cl, [buffer]
はバッファのaddressをclに移動します(clは1バイトしかないため、正しいアドレスを提供する場合としない場合があります)。
F5B1
の場合、[a]は[〜のアドレスF5B1を参照します#〜] ram [〜#〜]。F5B1
のような値です。角括弧は基本的に逆参照演算子のように機能します(例:*
in C)。
だから、のようなもの
mov REG, x
x
の値をREG
に移動しますが、
mov REG, [x]
x
が指すメモリ位置の値をREG
に移動します。 x
がラベルの場合、その値はそのラベルのアドレスです。
あなたは質問です:
Blには値5が含まれ、clには変数バッファのメモリアドレスが含まれることを理解しても正しいですか?
はい。それで合っています。ただし、CL
の幅は8ビットしかないため、buffer
のアドレスの最下位バイトのみが含まれることに注意してください。
あなたはアイデアを得ています。ただし、覚えておくべき詳細がいくつかあります。
cl
は8ビット、cx
は16ビット、ecx
は32ビット、rcx
は64ビットです)。したがって、cl
は変数buffer
のアドレスと等しくない可能性があります。アドレスの最下位8ビットのみが含まれます。buffer
にアクセスしたりできる割り込みルーチンまたはスレッドがある場合、bl
の値は5とは異なる場合があります。壊れた割り込みルーチンは、レジスタ値を保持します。Ramの場所に値を書き込むため(またはその中で計算するため)のオペランドとして即値を使用するすべての命令では、アクセスするバイト数を指定する必要があります。私たちのアセンブルは、1つのbyte、Word、またはdopplewordの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
ダーク