Вопрос MSIL (базовый)

Хорошо, скажем, у нас есть этот код С#:

public override void Write(XDRDestination destination)
{
    destination.WriteInt(intValue);
    destination.WriteBool(boolValue);
    destination.WriteFixedString(str1, 100);
    destination.WriteVariableString(str2, 100);
}

IL:

.method public hidebysig virtual instance void 
        Write(class [XDRFramework]XDRFramework.XDRDestination destination) cil managed
{
  // Code size       53 (0x35)
  .maxstack  8
  IL_0000:  ldarg.1
  IL_0001:  ldarg.0
  IL_0002:  call       instance int32 LearnIL.Test1::get_intValue()
  IL_0007:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteInt(int32)
  IL_000c:  ldarg.1
  IL_000d:  ldarg.0
  IL_000e:  call       instance bool LearnIL.Test1::get_boolValue()
  IL_0013:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteBool(bool)
  IL_0018:  ldarg.1
  IL_0019:  ldarg.0
  IL_001a:  call       instance string LearnIL.Test1::get_str1()
  IL_001f:  ldc.i4.s   100
  IL_0021:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteFixedString(string,
                                                                                                 uint32)
  IL_0026:  ldarg.1
  IL_0027:  ldarg.0
  IL_0028:  call       instance string LearnIL.Test1::get_str2()
  IL_002d:  ldc.i4.s   100
  IL_002f:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteVariableString(string,
                                                                                                    uint32)
  IL_0034:  ret
} // end of method Test1::Write

Теперь к вопросу, насколько я понимаю, ldarg.# помещает аргументы, предоставленные методу, в стек, чтобы мы могли с ними работать? Но почему он вызывает ldarg.1 и ldarg.0, если метод принимает только один аргумент?


person Peter    schedule 24.09.2009    source источник


Ответы (2)


Методы экземпляра имеют неявный параметр (this), который передается в качестве первого аргумента каждого метода экземпляра. Инструкция ldarg.0 загружает this в стек. Инструкция ldarg.1 — это загрузка первого реального (явного) аргумента.

person jason    schedule 24.09.2009

Метод экземпляра имеет первый неявный параметр this, загруженный ldarg.0.

person Daniel Brückner    schedule 24.09.2009
comment
Вы можете немного расширить свой ответ? уверен, что это первый, но в данном случае это первый ldarg.1 или ldarg.0? - person Peter; 24.09.2009