2012-04-17 68 views
2

這是一些部分代碼,在函數調用之後。帶有3個子操作數的左操作數的movl?

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] ? 

問候

+0

myType有多大? – chikuba 2012-04-17 22:35:08

+1

@chikuba:對於目前的練習,myType的大小並不重要。 – ron 2012-04-17 22:41:08

回答

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

是AT爲 「標度,指數,基」(SIB)尋址& T語法。 %esi是基地址,%ebx是索引,而4是「scale」(乘數應用於索引以生成基地址的字節偏移量)。

(等效Intel語法等價物是更加明確:mov edx, dword ptr [esi+ebx*4]

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

可能不會,因爲在此尋址模式中的有效地址計算工作以字節爲單位,而C則數組索引中的單元工作數組元素的大小。

如果%esi是在存儲器A的基地址,並且%ebxn,和A(即sizeof(MyType_t))的單個元件的尺寸爲4,則%esi + %ebx * 4給出A[n]的地址;所以在這種情況下,指令意味着%edx = A[n]

相關問題