第十三讲 数组推算
例如下列函数:
int main(int argc, char* argv[])
{
char a[5];
a[1]=1;
// a[2]=2;
printf("Hello World!\n");
return 0;
}
此处的char为一个字节,(注意:如果是INT 就是4个字节,short就是2个字节
0040D700 push ebp
0040D701 mov ebp,esp
0040D703 sub esp,48h
0040D706 push ebx
0040D707 push esi
0040D708 push edi
0040D709 lea edi,[ebp-48h]
0040D70C mov ecx,12h
0040D711 mov eax,0CCCCCCCCh
0040D716 rep stos dword ptr [edi]
8:
9: char a[5];
10:
11:
12: a[1]=1;
0040D718 mov byte ptr [ebp-7],1
看到上面的汇编代码,一定对0040D718 mov byte ptr [ebp-7],1 中的EBP-7 是怎么来的吧?
0040D709 lea edi,[ebp-48h] 中的ebp-48h 跟char a[5]有何关系呢?
mov ecx,12h 跟ebp-48h 上面关系?在下面一一推演出来。
char a[5]; 中的5是十进制的,这个地球人都知道,问题是大家都知道每条EBP是4个一组的,如下:0012FF7C CC CC CC CC 烫烫
0012FF80 C0 FF 12 00 ....
那么此处的char a[5] 就代表着有两行,转化成十六进制 2*4=8 ,(40是微软在函数头预留的)因此,此处的EBP-48h
48h/4=12h,因为ECX是计数寄存器,此处代表的是要进行12H次 mov eax,0CCCCCCCCh
讲了这么久,0040D718 mov byte ptr [ebp-7],1 中的EBP-7怎么出来的还没有讲大家一定忘记这个数组里面前面有一个a[0]了吧,对了,这个a[0]没有赋值很多人都忘记了,所以,应该是 a[0]的偏移地址是 ebp-8 而 a[1]的偏移地址则是 EBP-7 依此类推就知道了。
int同理去推算。记住INT是占4个字节。取决于前面的是否是SHORT 还是int 或者char等,然后按照其所占几个字节去运算。short a[5] =>5/2≈3*4=12==>0x0cchar a[5] =>5/4≈2*4=8===>0x08int a[5] =>5/1=5*4=20===>0x14
以上计算出来,一眼就可以看出来怎么计算了。