2016-11-15 5 views
-1

私はアセンブリについて非常に簡単な理解を持っていますし、以下のコードが何をするのか混乱していますか?movl(%eax、%edx、4)、%ecx命令は何をしますか?

movl (%eax, %edx, 4), %ecx 

私の理解は、%edx%ecxこれに格納され、その後4で乗算され、次いで%eaxの値と追加され、その値で指定したテーブルである

Register Values

答えは0x11ですが、私はその答えを得られません。

+0

AT&Tの構文では、 '(..)'を使用すると、メモリ内容がフェッチ/書き込まれていることがわかります。残念なことに、そのルールはどこにも追随していませんが、特定の命令は '()'構文なしで(命令が非メモリ使用に対して意味がない場合)メモリの使用を強制します。 Intel構文では、メモリアクセスは '[]'でマークされ、すべての(?)命令( 'lea'は' mov'構文を使用した例外ですが、メモリへのアクセスではありません)でより厳密に使用されます。だからAT&Tの構文では、メモリがアクセスされているかどうかを知るために命令を完全に読まなければなりませんが、 '()'は安全な賭けです。 – Ped7g

答えて

2

EDXが4倍され、EAXに追加され、そのアドレスのメモリから4バイトの値が読み出され、ECXに配置されます。

MOVは、一般に、アドレス計算が行われていない限り算術演算を実行しません。あなたの特定のケースで


edx = 3eax = 0x100temporary_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*eaxlea (eax,eax,4),eaxのような簡単な算術演算を行う場合には「トリック」されることがあります(imulより速くてもよく、フラグレジスタは変更されません。

関連する問題