Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Дамп TestClass:
- MT Field Offset Type VT Attr Value Name
- 02ed4e40 4000003 4 ...cation77.MyStruct 1 instance <MyStruct>k__BackingField
- Видно, что бэкинфилд для MyStruct MyStruct {get; set;} живёт по смещению 4 от начала класса TestClass
- Дамп MyStruct:
- MT Field Offset Type VT Attr Value Name
- 72111a90 4000001 4 System.Int32 1 instance <Value>k__BackingField
- 72111a90 4000002 8 System.Int32 1 instance <OtherValue>k__BackingField
- Тут два филда по 4 и 8 смещённые от начала структуры
- ConsoleApplication77.TestClass.DoThings()
- public void TestClass.DoThings() {
- 03130548 55 push ebp
- 03130549 8bec mov ebp,esp
- 0313054b 57 push edi
- 0313054c 56 push esi
- 0313054d 83ec34 sub esp,34h
- 03130550 33c0 xor eax,eax
- 03130552 8945f0 mov dword ptr [ebp-10h],eax
- 03130555 8945f4 mov dword ptr [ebp-0Ch],eax
- 03130558 8945dc mov dword ptr [ebp-24h],eax
- 0313055b 8945c8 mov dword ptr [ebp-38h],eax
- 0313055e 894dc4 mov dword ptr [ebp-3Ch],ecx
- 03130561 833dc042ed0200 cmp dword ptr ds:[2ED42C0h],0
- 03130568 7405 je 0313056f
- 0313056a e861316970 call clr!JIT_DbgIsJustMyCode (737c36d0)
- 0313056f 90 nop
- MyStruct = new MyStruct(0xBEEF);
- 03130570 8d7de8 lea edi,[ebp-18h]
- 03130573 0f57c0 xorps xmm0,xmm0
- 03130576 660fd607 movq mmword ptr [edi],xmm0
- 0313057a 8d4de8 lea ecx,[ebp-18h]
- 0313057d baefbe0000 mov edx,0BEEFh
- 03130582 ff153c4eed02 call dword ptr ds:[2ED4E3Ch] (ConsoleApplication77.MyStruct..ctor(Int32), mdToken: 06000006)
- 03130588 8d45e8 lea eax,[ebp-18h]
- 0313058b 83ec08 sub esp,8
- 0313058e f30f7e00 movq xmm0,mmword ptr [eax]
- 03130592 660fd60424 movq mmword ptr [esp],xmm0
- 03130597 8b4dc4 mov ecx,dword ptr [ebp-3Ch]
- 0313059a ff15b84ded02 call dword ptr ds:[2ED4DB8h] (ConsoleApplication77.TestClass.set_MyStruct(ConsoleApplication77.MyStruct), mdToken: 0600000a)
- 031305a0 90 nop
- Console.WriteLine(MyStruct.Value);
- 031305a1 8d55e0 lea edx,[ebp-20h]
- 031305a4 8b4dc4 mov ecx,dword ptr [ebp-3Ch]
- 031305a7 ff15ac4ded02 call dword ptr ds:[2ED4DACh] (ConsoleApplication77.TestClass.get_MyStruct(), mdToken: 06000009)
- 031305ad 8d7df0 lea edi,[ebp-10h]
- 031305b0 8d75e0 lea esi,[ebp-20h]
- 031305b3 f30f7e06 movq xmm0,mmword ptr [esi]
- 031305b7 660fd607 movq mmword ptr [edi],xmm0
- 031305bb 8d4df0 lea ecx,[ebp-10h]
- 031305be ff15004eed02 call dword ptr ds:[2ED4E00h] (ConsoleApplication77.MyStruct.get_Value(), mdToken: 06000001)
- 031305c4 8945dc mov dword ptr [ebp-24h],eax
- 031305c7 8b4ddc mov ecx,dword ptr [ebp-24h]
- 031305ca e85de2606f call mscorlib_ni+0xb4e82c (7273e82c) (System.Console.WriteLine(Int32), mdToken: 06000b5e)
- 031305cf 90 nop
- MyStruct.SetValue(0xDEAD);
- 031305d0 8d55d4 lea edx,[ebp-2Ch] //кладём в edx указатель на место в стэке куда хотим получить ответ
- 031305d3 8b4dc4 mov ecx,dword ptr [ebp-3Ch] //кладём this в ecx
- 031305d6 ff15ac4ded02 call dword ptr ds:[2ED4DACh] (ConsoleApplication77.TestClass.get_MyStruct(), mdToken: 06000009)
- //к этому моменту мы уже потеряли инфу о том, откуда взяли значения для MyStruct. Дальше мы работаем только с локальным стэком
- 031305dc 8d7df0 lea edi,[ebp-10h] //сохраняем в edi указатель на место в стэке куда скопируем значение MyStruct
- 031305df 8d75d4 lea esi,[ebp-2Ch] //теперь в esi указатель на ответ в текущем стэкфрейме
- 031305e2 f30f7e06 movq xmm0,mmword ptr [esi] //копируем всю MyStruct в xmm0
- 031305e6 660fd607 movq mmword ptr [edi],xmm0 //копируем всю MyStruct туда, куда указывает edi
- 031305ea 8d4df0 lea ecx,[ebp-10h] //Записываем в ecx ссылку в текущем стэкфрейме на MyStruct. Это будет this для MyStruct.SetValue.
- 031305ed baadde0000 mov edx,0DEADh //записыва в edx на что хотим изменить
- 031305f2 ff15304eed02 call dword ptr ds:[2ED4E30h] (ConsoleApplication77.MyStruct.SetValue(Int32), mdToken: 06000005)
- 031305f8 90 nop
- Console.WriteLine(MyStruct.Value);
- 031305f9 8d55cc lea edx,[ebp-34h]
- 031305fc 8b4dc4 mov ecx,dword ptr [ebp-3Ch]
- 031305ff ff15ac4ded02 call dword ptr ds:[2ED4DACh] (ConsoleApplication77.TestClass.get_MyStruct(), mdToken: 06000009)
- 03130605 8d7df0 lea edi,[ebp-10h]
- 03130608 8d75cc lea esi,[ebp-34h]
- 0313060b f30f7e06 movq xmm0,mmword ptr [esi]
- 0313060f 660fd607 movq mmword ptr [edi],xmm0
- 03130613 8d4df0 lea ecx,[ebp-10h]
- 03130616 ff15004eed02 call dword ptr ds:[2ED4E00h] (ConsoleApplication77.MyStruct.get_Value(), mdToken: 06000001)
- 0313061c 8945c8 mov dword ptr [ebp-38h],eax
- 0313061f 8b4dc8 mov ecx,dword ptr [ebp-38h]
- 03130622 e805e2606f call mscorlib_ni+0xb4e82c (7273e82c) (System.Console.WriteLine(Int32), mdToken: 06000b5e)
- 03130627 90 nop
- }
- 03130628 90 nop
- 03130629 8d65f8 lea esp,[ebp-8]
- 0313062c 5e pop esi
- 0313062d 5f pop edi
- 0313062e 5d pop ebp
- 0313062f c3 ret
- ConsoleApplication77.TestClass.get_MyStruct()
- 03130740 55 push ebp
- 03130741 8bec mov ebp,esp
- 03130743 57 push edi
- 03130744 56 push esi
- 03130745 83ec08 sub esp,8
- 03130748 894df4 mov dword ptr [ebp-0Ch],ecx //кладём this в "локальную переменную" ebp-0C
- 0313074b 8955f0 mov dword ptr [ebp-10h],edx //кладём указатель куда вернуть ответ в "локальную переменную" ebp-10
- 0313074e 833dc042ed0200 cmp dword ptr ds:[2ED42C0h],0 //какие-то .net проверки
- 03130755 7405 je 0313075c
- 03130757 e8742f6970 call clr!JIT_DbgIsJustMyCode (737c36d0)
- 0313075c 8b7df0 mov edi,dword ptr [ebp-10h] //теперь в edi указатель на ответ
- 0313075f 8b75f4 mov esi,dword ptr [ebp-0Ch] //в esi указатель на this
- 03130762 83c604 add esi,4 //увеличиваем указатель на this на 4, чтобы получить указатель на бэкинфилд MyStruсt (смотри дамп классов выше)
- 03130765 f30f7e06 movq xmm0,mmword ptr [esi] //копируем сразу 64 бита из того на что указывает esi. Т.е. сразу копируем два инта - как раз всю структуру MyStruct. Не ссылку на неё копируем, а всю её копируем.
- 03130769 660fd607 movq mmword ptr [edi],xmm0 //кладём это в ответ
- 0313076d 8d65f8 lea esp,[ebp-8]
- 03130770 5e pop esi
- 03130771 5f pop edi
- 03130772 5d pop ebp
- 03130773 c3 ret
- ConsoleApplication77.MyStruct.SetValue(Int32)
- Begin 031307b8, size 2c
- public void MyStruct.SetValue(int newValue) {
- 031307b8 55 push ebp
- 031307b9 8bec mov ebp,esp
- 031307bb 83ec08 sub esp,8
- 031307be 894df8 mov dword ptr [ebp-8],ecx //this
- 031307c1 8955fc mov dword ptr [ebp-4],edx //newValue
- 031307c4 833dc042ed0200 cmp dword ptr ds:[2ED42C0h],0
- 031307cb 7405 je 031307d2
- 031307cd e8fe2e6970 call clr!JIT_DbgIsJustMyCode (737c36d0)
- 031307d2 90 nop
- Value = newValue;
- 031307d3 8b4df8 mov ecx,dword ptr [ebp-8] //this
- 031307d6 8b55fc mov edx,dword ptr [ebp-4] //newValue
- 031307d9 e8b2feffff call 03130690 (ConsoleApplication77.MyStruct.set_Value(Int32), mdToken: 06000002)
- 031307de 90 nop
- }
- 031307df 90 nop
- 031307e0 8be5 mov esp,ebp
- 031307e2 5d pop ebp
- 031307e3 c3 ret
- ConsoleApplication77.MyStruct.set_Value(Int32)
- 03130690 55 push ebp
- 03130691 8bec mov ebp,esp
- 03130693 83ec08 sub esp,8
- 03130696 894df8 mov dword ptr [ebp-8],ecx //this
- 03130699 8955fc mov dword ptr [ebp-4],edx //value
- 0313069c 833dc042ed0200 cmp dword ptr ds:[2ED42C0h],0
- 031306a3 7405 je 031306aa
- 031306a5 e826306970 call clr!JIT_DbgIsJustMyCode (737c36d0)
- 031306aa 8b45f8 mov eax,dword ptr [ebp-8] //this
- 031306ad 8b55fc mov edx,dword ptr [ebp-4] //value
- 031306b0 8910 mov dword ptr [eax],edx //this.value = value
- 031306b2 90 nop
- 031306b3 8be5 mov esp,ebp
- 031306b5 5d pop ebp
- 031306b6 c3 ret
- Для сравнения:
- ConsoleApplication77.MyStruct.set_OtherValue(Int32)
- 031306c8 55 push ebp
- 031306c9 8bec mov ebp,esp
- 031306cb 83ec08 sub esp,8
- 031306ce 894df8 mov dword ptr [ebp-8],ecx //this
- 031306d1 8955fc mov dword ptr [ebp-4],edx //value
- 031306d4 833dc042ed0200 cmp dword ptr ds:[2ED42C0h],0
- 031306db 7405 je 031306e2
- 031306dd e8ee2f6970 call clr!JIT_DbgIsJustMyCode (737c36d0)
- 031306e2 8b45f8 mov eax,dword ptr [ebp-8] //this
- 031306e5 8b55fc mov edx,dword ptr [ebp-4] //value
- 031306e8 895004 mov dword ptr [eax+4],edx //this.otherValue = value
- 031306eb 90 nop
- 031306ec 8be5 mov esp,ebp
- 031306ee 5d pop ebp
- 031306ef c3 ret
Add Comment
Please, Sign In to add comment