私はアセンブリについて非常に簡単な理解を持っていますし、以下のコードが何をするのか混乱していますか?movl(%eax、%edx、4)、%ecx命令は何をしますか?
movl (%eax, %edx, 4), %ecx
私の理解は、%edx
が%ecx
これに格納され、その後4で乗算され、次いで%eax
の値と追加され、その値で指定したテーブルである
答えは0x11ですが、私はその答えを得られません。
私はアセンブリについて非常に簡単な理解を持っていますし、以下のコードが何をするのか混乱していますか?movl(%eax、%edx、4)、%ecx命令は何をしますか?
movl (%eax, %edx, 4), %ecx
私の理解は、%edx
が%ecx
これに格納され、その後4で乗算され、次いで%eax
の値と追加され、その値で指定したテーブルである
答えは0x11ですが、私はその答えを得られません。
EDXが4倍され、EAXに追加され、そのアドレスのメモリから4バイトの値が読み出され、ECXに配置されます。
MOVは、一般に、アドレス計算が行われていない限り算術演算を実行しません。あなたの特定のケースで
:edx = 3
、eax = 0x100
、temporary_address_in_CPU_during_mov = eax + edx * 4 = 0x100 + 3*4 = 0x10C
。アドレス0x10C
のメモリの値は0x11
です。 CPUは、アドレス計算を行いますとき
このアドレス演算は、lea
命令を介してそれ自体を使用することができ、その代わりに、メモリからのロード値はちょうどそう、計算されたアドレスを格納する。
leal (%eax, %edx, 4), %ecx
がロードされecx
の値が0x10C
(メモリにアクセスしない)。これは、eax = 5*eax
:lea (eax,eax,4),eax
のような簡単な算術演算を行う場合には「トリック」されることがあります(imul
より速くてもよく、フラグレジスタは変更されません。
AT&Tの構文では、 '(..)'を使用すると、メモリ内容がフェッチ/書き込まれていることがわかります。残念なことに、そのルールはどこにも追随していませんが、特定の命令は '()'構文なしで(命令が非メモリ使用に対して意味がない場合)メモリの使用を強制します。 Intel構文では、メモリアクセスは '[]'でマークされ、すべての(?)命令( 'lea'は' mov'構文を使用した例外ですが、メモリへのアクセスではありません)でより厳密に使用されます。だからAT&Tの構文では、メモリがアクセスされているかどうかを知るために命令を完全に読まなければなりませんが、 '()'は安全な賭けです。 – Ped7g