扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年10月2日
关键字:
在本页阅读全文(共2页)
下面,让我们看看调试时,地址为00975394h、00975390h、0097538ch、00975388h中的内容:
0x00975384 2b 85 bf 79 03 53 97 00 13 53 97 00 23 53 97 00
0x00975394 33 53 97 00 43 53 97 00 00 00 00 00 00 00 00 00
绿色的是Bob.f()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址;
紫色的是Bob.c()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址;
灰色的是Bob.b()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址;
黄色的是Bob.a()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址;
[注]红色的内容则是Bob.x的值哦!不信吗?那你看看下面的调试过程中红色处的值的变化,就明白了:
进入f()前为:
0x00975384 2b 85 bf 79 03 53 97 00 13 53 97 00 23 53 97 00
0x00975394 33 53 97 00 43 53 97 00 00 00 00 00 00 00 00 00
c()加4后变为:
0x00975384 2b 85 bf 79 03 53 97 00 13 53 97 00 23 53 97 00
0x00975394 33 53 97 00 43 53 97 00 04 00 00 00 00 00 00 00
加3后变为:
0x00975384 2b 85 bf 79 03 53 97 00 13 53 97 00 23 53 97 00
0x00975394 33 53 97 00 43 53 97 00 07 00 00 00 00 00 00 00
加2后变为:
0x00975384 2b 85 bf 79 03 53 97 00 13 53 97 00 23 53 97 00
0x00975394 33 53 97 00 43 53 97 00 09 00 00 00 00 00 00 00
下面让我们看看在调用Bob.f()之前存根例程处的内容:
0x00975303 e8 d0 52 7d ff 04 00 10 00 50 20 00 c0 02 00 fe
0x00975313 e8 c0 52 7d ff 05 00 10 00 6c 20 00 c0 03 00 fc
0x00975323 e8 b0 52 7d ff 06 00 10 00 88 20 00 c0 04 00 fa
0x00975333 e8 a0 52 7d ff 07 00 10 00 a4 20 00 c0 05 00 f8
绿色处是Bob.f()的存根例程的内容;
紫色处是Bob.c()的存根例程的内容;
灰色处是Bob.b()的存根例程的内容;
黄色处是Bob.a()的存根例程的内容;
下面让我们看看在进入Bob.f()方法体之后存根例程处的内容:
0x00975303 e8 d0 52 7d ff 04 00 10 00 50 20 00 c0 02 00 fe
0x00975313 e8 c0 52 7d ff 05 00 10 00 6c 20 00 c0 03 00 fc
0x00975323 e8 b0 52 7d ff 06 00 10 00 88 20 00 c0 04 00 fa
0x00975333 e9 40 ad 39 06 07 00 10 00 78 00 d1 06 05 00 f8
易见,只有Bob.f()的存根例程的内容起了变化。这说明,JIT编译器被调用了。同时,编译器将f()的CIL方法体转换为地址空间中的机器码版本。再替换了存根例程的原内容。替换后,f()方法的机器码版本的首地址是0x06d10078(蓝色标注处的内容)。你不信吗?那好,我们看一下0x06d10078处的内存内容:
0x06D10078 55 8b ec ff 15 90 53 97 00 ff 15 8c 53 97 00 ff
0x06D10088 15 88 53 97 00 90 5d c3 00 00 00 00 00 00 00 00
你不妨再回头看看f()的汇编显示,这里:
紫色处不正是对Bob.c()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址;
灰色处不正是对Bob.b()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址;
黄色处不正是对Bob.a()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址;
不正好对应了f()汇编显示中:
//调用Bob.c()方法
call dword ptr ds:[00975390h]
//调用Bob.b()方法
call dword ptr ds:[0097538Ch]
//调用Bob.a()方法
call dword ptr ds:[00975388h]
明白了吧!好了,下面对于c() 、b()、a()的调用也是一样的道理。对于接下来的调试会有如下的内存显示:
接下来的存根例程的内容:
进入c()后变为:
0x00975303 e8 d0 52 7d ff 04 00 10 00 50 20 00 c0 02 00 fe
0x00975313 e8 c0 52 7d ff 05 00 10 00 6c 20 00 c0 03 00 fc
0x00975323 e9 78 ad 39 06 06 00 10 00 a0 00 d1 06 04 00 fa
0x00975333 e9 40 ad 39 06 07 00 10 00 78 00 d1 06 05 00 f8
进入b()后变为:
0x00975303 e8 d0 52 7d ff 04 00 10 00 50 20 00 c0 02 00 fe
0x00975313 e9 a8 ad 39 06 05 00 10 00 c0 00 d1 06 03 00 fc
0x00975323 e9 78 ad 39 06 06 00 10 00 a0 00 d1 06 04 00 fa
0x00975333 e9 40 ad 39 06 07 00 10 00 78 00 d1 06 05 00 f8
进入a()后变为:
0x00975303 e9 d8 ad 39 06 04 00 10 00 e0 00 d1 06 02 00 fe
0x00975313 e9 a8 ad 39 06 05 00 10 00 c0 00 d1 06 03 00 fc
0x00975323 e9 78 ad 39 06 06 00 10 00 a0 00 d1 06 04 00 fa
0x00975333 e9 40 ad 39 06 07 00 10 00 78 00 d1 06 05 00 f8
进入c()后地址为0x06d100a0的内容(Bob.c()的机器码版本)如下:
0x06D100A0 55 8b ec 83 05 9c 53 97 00 04 90 5d c3 00 00 00
进入b()后地址为0x06d100c0的内容(Bob.b()的机器码版本)如下:
0x06D100C0 55 8b ec 83 05 9c 53 97 00 03 90 5d c3 00 00 00
进入a()后地址为0x06d100e0的内容(Bob.a()的机器码版本)如下:
0x06D100E0 55 8b ec 83 05 9c 53 97 00 02 90 5d c3 00 00 00
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者