操作是什么
movl (%esi, %ecx,4), %eax
吗?
根据我的理解,它会在%eax
中存储相当于%ecx * 4 + %esi
。
答案 0 :(得分:3)
它与英特尔语法中的以下内容相同:
mov eax,[esi + ecx*4]
它将做的是从esi + ecx*4
形成的地址的内存中读取32位,并将该值放在eax
中。
答案 1 :(得分:1)
是的,你是写的。
它被称为索引寻址模式。
它的语法是:
<constant1/label> (%reg1, %reg2, constant2)
即。 constant1
或label
没有<
&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}}包含成员数组的字节偏移量。
这就是一般情况......但这取决于具体情况......