Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I have to do ldarg.0 before calling a field in MSIL?

Tags:

I want to call a function, with as parameters a string and an Int32. The string is just a literal, the Int32 should be a field. So I thought it should be something like:

.method public hidebysig instance string TestVoid() cil managed {     .maxstack 1     .locals init (         [0] string CS$1$0000)     L_0000: nop      L_0001: ldstr "myString"     L_0006: ldfld int32 FirstNamespace.FirstClass::ByteField     L_000b: call string [Class1]Class1.TestClass::Functie<int32>(string, int32)     L_0010: ret  } 

But this throws the error that this is not valid code. When adding

ldarg.0  

before ldfld it runs just fine. Why is this, and is this going to get me into trouble when having more fields?

like image 620
Jan Jongboom Avatar asked Nov 23 '09 19:11

Jan Jongboom


1 Answers

Instance methods have an implicit parameter called "this". It is loaded as the first argument to the stack, thus you have ldarg.0 for "this".

like image 78
Joel Marcey Avatar answered Sep 27 '22 18:09

Joel Marcey