首先我们要知道,数组的元素储存的地址是连续的。
一维数组很好理解,接下来看看二维数组的空间分布:
对于上面这个例子, 我们可以将A看成具有五个元素,且每个元素都是3个int长度的一维数组存储。
分析例子
int main(){ int a[5]; int i,sum; for(i = 0 ; i < 5; i++){ a[i] = i * 3; } for(i = 0 ; i < 5; i++){ sum += a[i]; } return sum; }
翻译成汇编:
main: pushl %ebp movl %esp, %ebp//到此准备好栈帧 subl $32, %esp//分配32个字节的空间 leal -20(%ebp), %edx//将帧指针减去20赋给%edx寄存器 movl $0, %eax//将%eax设置为0,这里的%eax寄存器是重点 .L2: movl %eax, (%edx)//将0放入帧指针减去20的位置? addl $3, %eax//第一次循环时,%eax为3,对于i来说,%eax=(i+1)*3。 addl $4, %edx//将%edx加上4,第一次循环%edx指向帧指针-16的位置 cmpl $15, %eax//比较%eax和15? jne .L2//如果不相等的话就回到L2 movl -20(%ebp), %eax//下面这五句指令已经出卖了leal指令,很明显从-20到-4,就是数组五个元素存放的地方。下面的就不解释了,直接依次相加然后返回结果。 addl -16(%ebp), %eax addl -12(%ebp), %eax addl -8(%ebp), %eax addl -4(%ebp), %eax leave ret