1

什么操作

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

据我了解,它将存储%eax%ecx * 4 + %esi.

4

2 回答 2

3

它等效于 Intel 语法中的以下内容:

mov eax,[esi + ecx*4]

它将做的是从内存中读取 32 位,esi + ecx*4并将该值放入eax.

于 2013-11-08T08:19:39.173 回答
1

是的,你在写。
称为索引寻址方式。

它的语法是:

<constant1/label> (%reg1, %reg2, constant2)

即有constant1label没有<& >

%reg1并且%reg2必须是 GPR。
<constant1/label>是可选的。
%reg1是可选的。

结果是:constant1 + %reg1 + %reg2 * constant2

通常,constant1 or label%reg1用于数组的基地址。&用于索引%reg2constant2

例如:

假设您有一个全局数组:

.section .data
    .globl   arr
    .type    arr,    @object
    .size    arr,    20
    .align   4
arr:
    .long    10, 20, 30, 40, 50

那你可以写...

movl    $2,    %eax                # Move the index into %eax
movl    arr( , %eax, 4),    %edx

这意味着:%edx = arr + %eax * 4。即基地址+ 8 个字节。
你可能会认为它像%edx = arr[2]

一般来说,

如果您有一个带有标签的全局数组,那么您可以使用label基地址。
如果你有一个本地数组,那么你使用%reg2基地址。
如果您有一个包含数组的全局结构,那么您可以同时使用label结构 +%reg2包含成员数组的字节偏移量。

一般都是这样的。。。不过要看情况。。。

于 2013-11-08T08:33:41.010 回答