什么操作
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包含成员数组的字节偏移量。
一般都是这样的。。。不过要看情况。。。