一起看看数组在程序中的使用。C语言代码:
#include <stdio.h>
int main()
{
int a[2];
a[1] = 0;
a[a[1]] = 1;
return 0;
}
这段代码定义了一个大小为2的整型数组,给数组下标为1的变量赋值0,然后取数组下标为1的变量的值作为新的下标,给该变量赋值1,这里数组下标为1的变量的值为0,就是说给数组下标为0的变量赋值1,最后退出主函数main()。
载入OD看看反汇编代码:
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 sub esp, 8
这里为数组a开辟内存空间。一个整型变量所占的内存空间为4字节,数组a的大小为2,因此把栈顶向下压8个字节。
text:00401006 mov [ebp+a+1*4], 0
只要知道数组就是一个指针,这句代码就很容易理解了。OD是一个好工具,这里它已经分析出a是一个数组了,而ebp+a是数组的基地址。a是一个整型数组,其中的每一个变量占用的大小都是4字节,因此在数组中下标为i的变量的地址就可以表示为数组的基地址加上数组下标为i的变量与数组下标为0的变量的偏移量,即ebp+a+i*4,这一句代码中的地址ebp+a+1*4就是数组下标为1的变量的地址。
text:0040100D mov eax, [ebp+a+1*4]
.text:00401010 mov [ebp+eax*4+a], 1
这两句代码,获取数组中下标为1的变量的值,把这个值作为新的数组下标eax,并给数组下标为eax的变量赋值1。
.text:00401018 xor eax, eax
.text:0040101A mov esp, ebp
.text:0040101C pop ebp
.text:0040101D retn