• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

悠悠客

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

第十三讲 数组推算

例如下列函数:
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==>0x0c
char  a[5] =>5/4≈2*4=8===>0x08
int   a[5] =>5/1=5*4=20===>0x14

以上计算出来,一眼就可以看出来怎么计算了。



来自为知笔记(Wiz)


posted on 2014-04-25 17:07  悠悠客  阅读(167)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3