2011-09-22 148 views
0

这是一个简单的问题,但我无法在google上找到可靠的答案。x86简单的mov指令

这是什么意思的指令:

movl %eax, (%esi, %ecx, 4) 

是它在寄存器eax移动值的值在内存中(%esi, %ecx, 4)指向呢?

(%esi, %ecx, 4)用于数组。所以它意味着数组[Xs + 4i],其中Xs是数组的内存起点,而我只是整数数组中的偏移量。

+0

只是一件事:代码并不意味着eax代表整数数组。它可能是一个指针向量。否则,是的:源头第一,目的地第二。自从英特尔/微软以其他方式做到这一点之后,总是感到困惑。 –

回答

4

是正确的。这是AT语法,因此源代码先到达目的地。因此,它将eax寄存器的内容存储到内存位置esi + 4*ecx

如果您想将此视为一个数组,它将eax存储到基于esi的4字节对象数组的ecx th条目中。

2

是的,就是这样。在AT & T语法,内存寻址写为:

offset(base, index, multiplier) 

offset是一个符号常量,指定偏移basebase是哪里在开始寄存器,index是寄存器多远开始后指定阵列看,由multiplier相乘之后,其可以是1,2,4,或8

必须指定的offset至少一个,base,和index。若要在不使用base的情况下使用index,则需要在逗号前加上逗号((, index))。如果不指定multiplier,则默认为1

在Intel语法,这可以写成:

[base + index*multiplier + offset] 

这是比较容易理解,因为它是一个简单的数学问题。