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

是 AT&T 的“比例、索引、基数”(SIB) 寻址语法。 %esi是基地址,%ebx是索引,而 4 是“比例”(应用于索引以生成基地址的字节偏移量的乘数)。

(等效的 Intel 语法等效更明确:mov edx, dword ptr [esi+ebx*4].)

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

可能不是,因为这种寻址模式下的有效地址计算是以字节为单位工作的,而 C 数组索引是以数组元素的大小为单位工作的。

如果%esiA内存中的基地址,并且%ebx是,并且(ie )n的单个元素的大小是4,那么给出的地址;所以指令在这种情况下意味着。Asizeof(MyType_t)%esi + %ebx * 4A[n]%edx = A[n]

于 2012-04-17T22:46:27.873 回答