在调用函数之后,这是一些部分代码。
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] ?
此致
答案 0 :(得分:3)
movl (%esi,%ebx,4),%edx
是"比例,索引,基数"的AT& T语法(SIB)寻址。 %esi
是基地址,%ebx
是索引,4是"比例" (应用于索引的乘数,以生成到基址的字节偏移量)。
(等效的英特尔语法等效更明确:mov edx, dword ptr [esi+ebx*4]
。)
%edx = A[4 * %ebx + %esi] ?
可能不是,因为此寻址模式下的有效地址计算以字节为单位工作,而C数组索引以数组元素大小为单位工作。
如果%esi
是内存中A
的基地址,%ebx
是n
,则A
的单个元素的大小(即sizeof(MyType_t)
)为4,然后%esi + %ebx * 4
提供A[n]
的地址;所以在这种情况下,指令意味着%edx = A[n]
。