这是一个简单的问题,但我无法在google上找到可靠的答案。x86简单的mov指令
这是什么意思的指令:
movl %eax, (%esi, %ecx, 4)
是它在寄存器eax
移动值的值在内存中(%esi, %ecx, 4)
指向呢?
(%esi, %ecx, 4)
用于数组。所以它意味着数组[Xs + 4i],其中Xs是数组的内存起点,而我只是整数数组中的偏移量。
这是一个简单的问题,但我无法在google上找到可靠的答案。x86简单的mov指令
这是什么意思的指令:
movl %eax, (%esi, %ecx, 4)
是它在寄存器eax
移动值的值在内存中(%esi, %ecx, 4)
指向呢?
(%esi, %ecx, 4)
用于数组。所以它意味着数组[Xs + 4i],其中Xs是数组的内存起点,而我只是整数数组中的偏移量。
是正确的。这是AT语法,因此源代码先到达目的地。因此,它将eax
寄存器的内容存储到内存位置esi + 4*ecx
。
如果您想将此视为一个数组,它将eax
存储到基于esi
的4字节对象数组的ecx
th条目中。
是的,就是这样。在AT & T语法,内存寻址写为:
offset(base, index, multiplier)
offset
是一个符号常量,指定偏移base
,base
是哪里在开始寄存器,index
是寄存器多远开始后指定阵列看,由multiplier
相乘之后,其可以是1,2,4,或8
必须指定的offset
至少一个,base
,和index
。若要在不使用base
的情况下使用index
,则需要在逗号前加上逗号((, index)
)。如果不指定multiplier
,则默认为1
在Intel语法,这可以写成:
[base + index*multiplier + offset]
这是比较容易理解,因为它是一个简单的数学问题。
只是一件事:代码并不意味着eax代表整数数组。它可能是一个指针向量。否则,是的:源头第一,目的地第二。自从英特尔/微软以其他方式做到这一点之后,总是感到困惑。 –