这是一个简单的问题,但我在谷歌上找不到可靠的答案。
这个指令是什么意思:
movl %eax, (%esi, %ecx, 4)
是否将寄存器eax
中的值也移动到内存中(%esi, %ecx, 4)
指向的值?
(%esi, %ecx, 4)
是一个数组。所以这意味着 Array[Xs + 4i] 其中 Xs 是 Array 在内存中的起点,而 i 只是整数数组中的偏移量。
完全正确。这是 AT&T 语法,因此源在前,然后是目标。因此,它将eax
寄存器的内容存储到内存位置esi + 4*ecx
。
如果您想将此视为一个数组,它会存储eax
到ecx
基于 at 的 4 字节对象数组的第 th 项esi
。
是的,就是这样。在 AT&T 语法中,内存寻址写为:
offset(base, index, multiplier)
offset
是一个有符号常数,指定从 的偏移量base
,base
是从哪里开始index
的寄存器,是指定在乘以 后要从数组开始后多远的寄存器multiplier
,可以是 1、2、4 或 8。
您必须至少指定offset
、base
和之一index
。要不使用index
,base
您需要在其前面加上逗号 ( (, index)
)。如果不指定multiplier
,则默认为 1。
在 Intel 语法中,这写为:
[base + index*multiplier + offset]
这更容易理解,因为它只是一个数学问题。