【发布时间】:2015-12-29 00:40:25
【问题描述】:
我知道其他人写过类似的问题,但我认为我的情况不同,因为我找不到任何解决方案。
我有一个对象分配,像这样非常简单:
_buffer3 = buffer; //they are just simple reference types
生成的汇编代码如下
mov edx,dword ptr [ebp-3Ch]
mov eax,dword ptr [ebp-40h]
lea edx,[edx+4]
call 69C322F0
现在,为了了解发生了什么,我想进入调用内部(为什么要在分配中使用调用?)。但是,该地址的代码不存在,我无法介入。 如果我在地址代码字段中输入地址,就会显示:
69C322F0 ???
对解决这个谜团有什么帮助吗? :)
Edit..显然,当在类的方法内分配引用时,添加了神秘的调用。
如果我有这门课:
private class Test
{
int _X;
int _Y;
Test _t;
public void SetValues(int x, int y, Test t)
{
_X = x;
_Y = y;
}
}
为方法 SetValues 生成的程序集是:
_X = x;
00000028 mov eax,dword ptr [ebp-3Ch]
0000002b mov edx,dword ptr [ebp-40h]
0000002e mov dword ptr [eax+8],edx
_Y = y;
00000031 mov eax,dword ptr [ebp-3Ch]
00000034 mov edx,dword ptr [ebp+0Ch]
00000037 mov dword ptr [eax+0Ch],edx
有道理
但是如果我写这个
private class Test
{
int _X;
int _Y;
Test _t;
public void SetValues(int x, int y, Test t)
{
_X = x;
_Y = y;
_t = t;
}
}
神秘的召唤出现
_X = x;
00000028 mov eax,dword ptr [ebp-3Ch]
0000002b mov edx,dword ptr [ebp-40h]
0000002e mov dword ptr [eax+8],edx
_Y = y;
00000031 mov eax,dword ptr [ebp-3Ch]
00000034 mov edx,dword ptr [ebp+0Ch]
00000037 mov dword ptr [eax+0Ch],edx
_t = t;
0000003a mov edx,dword ptr [ebp-3Ch]
0000003d mov eax,dword ptr [ebp+8]
00000040 lea edx,[edx+4]
00000043 call 515E2E48
恕我直言,这与垃圾收集有关,但我不明白它是什么,我真的很想弄清楚。我知道你们中一定有人知道:)
答案的附录,这是我通过 C# 从 CLR 的 Google Books 中摘录的:
【问题讨论】:
-
嗯,不,我实际上是故意禁用它的。我试试看!
-
@AlexD,您是否在项目属性(“调试”选项卡)中选中“启用非托管代码调试”?
-
可能与this question重复
-
@alexD 对不起,我看错了,是的,它没有被选中,是的,启用非托管代码调试被选中
-
调用是更新卡表以实现写屏障。 Details here.
标签: c# assembly native-code