movl与左操作数有3个子操作数?

时间:2012-04-17 22:31:05

标签: c assembly x86

在调用函数之后,这是一些部分代码。

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

此致

1 个答案:

答案 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的基地址,%ebxn,则A的单个元素的大小(即sizeof(MyType_t))为4,然后%esi + %ebx * 4提供A[n]的地址;所以在这种情况下,指令意味着%edx = A[n]