这是一个简单的问题,但我无法在谷歌找到可靠的答案。
这条指令意味着什么:
movl %eax, (%esi, %ecx, 4)
它是否将寄存器eax
的值移动到(%esi, %ecx, 4)
指向的内存中的值?
(%esi, %ecx, 4)
用于数组。所以它意味着Array [Xs + 4i],其中Xs是数组内存的起点,而i只是整数数组中的偏移量。
答案 0 :(得分:4)
完全正确。这是AT& T语法,因此源首先出现,然后是目的地。因此,它将eax
寄存器的内容存储到存储单元esi + 4*ecx
。
如果您想将此视为一个数组,它会将eax
存储到基于ecx
的4字节对象数组的esi
条目中。
答案 1 :(得分:2)
是的,这就是它的本质。在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]
这更容易理解,因为它只是一个数学问题。