这是调用函数后的部分代码。
movl 12(%ebp),%ecx
movl 8(%ebp),%esi
movl (%esi,%ebx,4),%edx
这是对应的 C 函数:
void foo(MyType_t A[], int n);
所以基本上,%esi
是A[]
,%ecx
是n
第3行是什么意思?请注意,左操作数有 3 个子操作数。
%edx = A[4 * %ebx + %esi] ?
问候
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 数组索引是以数组元素的大小为单位工作的。
如果%esi
是A
内存中的基地址,并且%ebx
是,并且(ie )n
的单个元素的大小是4,那么给出的地址;所以指令在这种情况下意味着。A
sizeof(MyType_t)
%esi + %ebx * 4
A[n]
%edx = A[n]