什么操作
movl (%esi, %ecx,4), %eax
做?
据我了解,它将存储%eax
在%ecx * 4 + %esi
.
它等效于 Intel 语法中的以下内容:
mov eax,[esi + ecx*4]
它将做的是从内存中读取 32 位,esi + ecx*4
并将该值放入eax
.
是的,你在写。
称为索引寻址方式。
它的语法是:
<constant1/label> (%reg1, %reg2, constant2)
即有constant1
或label
没有<
& >
。
%reg1
并且%reg2
必须是 GPR。
<constant1/label>
是可选的。
%reg1
是可选的。
结果是:constant1 + %reg1 + %reg2 * constant2
通常,constant1 or label
和%reg1
用于数组的基地址。&用于索引%reg2
。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
基地址。
如果您有一个包含数组的全局结构,那么您可以同时使用label
结构 +%reg2
包含成员数组的字节偏移量。
一般都是这样的。。。不过要看情况。。。