汇编代码说明

时间:2013-11-08 08:06:36

标签: assembly x86 ia-32

操作是什么

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

根据我的理解,它会在%eax中存储相当于%ecx * 4 + %esi

2 个答案:

答案 0 :(得分:3)

它与英特尔语法中的以下内容相同:

mov eax,[esi + ecx*4]

它将做的是从esi + ecx*4形成的地址的内存中读取32位,并将该值放在eax中。

答案 1 :(得分:1)

是的,你是写的。
它被称为索引寻址模式。

它的语法是:

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

即。 constant1label没有<&amp; >

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

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

通常,constant1 or label%reg1用于数组的基址。 %reg2&amp; constant2用于索引。

例如:

比方说,你有一个全局数组:

.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 fot 如果你有一个包含数组的全局结构,那么你使用结构+ label的{​​{1}}包含成员数组的字节偏移量。

这就是一般情况......但这取决于具体情况......