0

这是一个简单的问题,但我在谷歌上找不到可靠的答案。

这个指令是什么意思:

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

是否将寄存器eax中的值也移动到内存中(%esi, %ecx, 4)指向的值?

(%esi, %ecx, 4)是一个数组。所以这意味着 Array[Xs + 4i] 其中 Xs 是 Array 在内存中的起点,而 i 只是整数数组中的偏移量。

4

2 回答 2

4

完全正确。这是 AT&T 语法,因此源在前,然后是目标。因此,它将eax寄存器的内容存储到内存位置esi + 4*ecx

如果您想将此视为一个数组,它会存储eaxecx基于 at 的 4 字节对象数组的第 th 项esi

于 2011-09-22T16:49:33.033 回答
2

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

offset(base, index, multiplier)

offset是一个有符号常数,指定从 的偏移量basebase是从哪里开始index的寄存器,是指定在乘以 后要从数组开始后多远的寄存器multiplier,可以是 1、2、4 或 8。

您必须至少指定offsetbase和之一index。要不使用indexbase您需要在其前面加上逗号 ( (, index))。如果不指定multiplier,则默认为 1。

在 Intel 语法中,这写为:

[base + index*multiplier + offset]

这更容易理解,因为它只是一个数学问题。

于 2011-09-22T16:53:56.627 回答