金牌会员
 
- 积分
- 1921
- 金钱
- 1921
- 注册时间
- 2013-11-18
- 在线时间
- 268 小时
|
发表于 2014-12-29 17:19:18
|
显示全部楼层
回复【4楼】 geyang1111 :
---------------------------------
上图直接看反汇编的后的代码,地址是0x08000000也就是代码区的最后面0x8013894的地址就是对应0x20000000,大小是0x704,0x8011AE2对应的_decompress1函数,这里就是把0x8013894个地址开始,总共0x704大小的数据搬到内存里去,这区域的数据正好就是已经有初始化的全局变量的数据。
再看偏移0x704之后,对应内存地址变成0x20000704,之后的偏移量是0xc074,调用的0x80111b90(函数_scatterload_zeroinit)
再看0x20000704的地址区域,其实就是没有初始化的全局变量,这里没有数据搬运,只是压栈在这里,并预留了变量的空间在这里。
为了验证这一点,我们再打开对应的Hex文件,来看看
HEX的数据跟反汇编对应地址上的数据是完全相同,而没初始化的全局变量,没有数据自然在HEX文件也找不到,也就是说全局变量的数据也是保存在代码的最后面,然后再搬到内存上去的。这一切都由编译自动完成的,当然我们是看不到代码用户代码的实现。希望对楼主有所帮助,
|
|