一.数组简介
<1>.简单介绍
数组:把相同类型的变量放在一起
数组是从0开始的
常常这样定义,譬如int a[10],最小是a[0],最大是a[9]
<2>.如何看变量的类型?把变量去掉即可
数组:把相同类型的变量放在一起
数组是从0开始的
常常这样定义,譬如int a[10],最小是a[0],最大是a[9]
<2>.如何看变量的类型?把变量去掉即可
譬如int a[10][2] ,类型就是int [10][2]
二.数组地址
数组的变量名就是数组的地址,
数组的第一个成员的地址也就是数组的地址
数组的最后一个成员是ebp-4,数组的存放方式反汇编是反着来的
三.计算数组的偏移
用首地址的偏移减去本成员的偏移
<1>.对齐的情况
数组的变量名就是数组的地址,
数组的第一个成员的地址也就是数组的地址
数组的最后一个成员是ebp-4,数组的存放方式反汇编是反着来的
三.计算数组的偏移
用首地址的偏移减去本成员的偏移
<1>.对齐的情况
用首地址的偏移减去本成员的偏移
方法: (数组的个数-偏移的个数)*前面类型的大小 得到偏移的位置 只适用int 其他要先计算首地址
int fun1()
{
int a[30];
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
a[5]=6; //4*10-5*4 (10-5)*sizeof(int)
a[6]=7;
a[7]=8;
a[8]=9;
a[9]=10;
a[12]=55;
return 0;
}
如上面代码所示,a[12]的地址怎么算,根据上面的方法:(数组的个数-偏移的个数)*前面类型的大小,
(30-12)*4=72,转换成16进制就是48.那么a[12]的地址就是ebp-0x48,反汇编如下图所示
<2>.如果去计算数组偏移的时候出现没有对齐的情况,那么要先对齐再去计算
int fun1()
{
short a[35];
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
a[5]=6;
a[6]=7;
a[7]=8;
a[8]=9;
a[9]=10;
a[12]=55;
a[23]=66;
return 0;
}
如上面代码所示,a[23]的地址怎么算,先计算首地址,35*2=70 化成16进制结果为46,看过我前面汇编文章的就很容易明白,46是没对齐的,那么就要先对齐为48. 然后23*2=46,转换成16进制位2e,16进制的48减去2e结果为1A.反汇编如下图所示
<3>.基址+偏移的方式进行寻址
int fun1()
{
int a[10];
int i;
for (i=0;i<10;i++)
{
a[i]=i;
printf("%dn",a[i]);
}
return 0;
}
上面代码反汇编如下图所示
ebp-(28-1*4) 相当于 ebp-28+1*4 --->基址+偏移的方式进行寻址
注意:int不用补齐,short char等注意首地址自动补齐的问题
今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!


![[逆向|C语言]C语言数组计算数组的偏移 [逆向|C语言]C语言数组计算数组的偏移](http://www.mshxw.com/aiimages/31/991882.png)
