2

これは、関数を呼び出した後の部分的なコードです。

movl   12(%ebp),%ecx  
movl   8(%ebp),%esi    
movl   (%esi,%ebx,4),%edx  

これは対応するC関数です:

void  foo(MyType_t A[], int n);

つまり、基本的に、%esiA[] 、であり%ecxn

3行目はどういう意味ですか?左側のオペランドには3つのサブオペランドがあることに注意してください。

%edx = A[4 * %ebx + %esi] ? 

よろしく

4

1 に答える 1

3
movl   (%esi,%ebx,4),%edx

「スケール、インデックス、ベース」(SIB)アドレス指定のAT&T構文です。 %esiはベースアドレス、%ebxはインデックス、4は「スケール」(ベースアドレスへのバイトオフセットを生成するためにインデックスに適用される乗数)です。

(同等のIntel構文の同等物はより明確です:mov edx, dword ptr [esi+ebx*4]。)

%edx = A[4 * %ebx + %esi] ?

このアドレッシングモードでの有効なアドレス計算はバイト単位で機能するのに対し、C配列のインデックス付けは配列要素のサイズ単位で機能するため、おそらくそうではありません。

がメモリ内の%esiベースアドレスであり、がであり、 (すなわち)の単一要素のサイズが4である場合、 ;のアドレスを与えます。その場合、指示は意味します。A%ebxnAsizeof(MyType_t)%esi + %ebx * 4A[n]%edx = A[n]

于 2012-04-17T22:46:27.873 に答える