我在C#我是否正確理解這個MSIL代碼?
// test.Program
private static void Main()
{
int x = 5;
int y = 100;
Console.WriteLine(y + ", " + x);
}
下面的代碼,我正在讀的IL代碼,所以之前我問,如果我每行確實是正確的我從來沒有編程組件。
.method private hidebysig static
void Main() cil managed
{
// Method begins at RVA 0x2058
// Code size 33 (0x21)
.maxstack 3 // maximum stack in this method is 3
.entrypoint // method is initial entry point
.locals init (// reserves memory for x and y variables
[0] int32 x, // x variable is reserved on position 0 of the stack
[1] int32 y // y variable is reserved on position 1 of the stack
)
IL_0000: ldc.i4.5 // integer of 4 bytes in size and the value of 5 is loaded onto the evaluation stack position 0
IL_0001: stloc.0 // put evaluation stack position 0 into the stack position 0, the evaluation stack is emptied
IL_0002: ldc.i4.s 100 // integer of 4 bytes in size and the value of 100 is loaded onto the evaluation stack position 0
IL_0004: stloc.1 // put evaluation stack position 0 onto the stack position 1, the evaluation stack is emptied
IL_0005: ldloc.1 // load stack position 1 into the evaluation stack position 0
IL_0006: box [mscorlib]System.Int32 // box last valuetype placed on evaluation stack, replace valuetype with reference on evaluation stack position 0, do not empty stack
IL_000b: ldstr ", " // put reference to string on evaluation stack position 1
IL_0010: ldloc.0 // load stack position 0 into the evaluation stack position 2
IL_0011: box [mscorlib]System.Int32 // box last valuetype placed on evaluation stack, replace valuetype with reference on evaluation stack position 0, do not empty stack
IL_0016: call string [mscorlib]System.String::Concat(object, object, object) // call Concat, pass values on evaluation stack, empty evaluation stack, put result of concat on evaluationstack
IL_001b: call void [mscorlib]System.Console::WriteLine(string) // pass first value in evaluation stack
IL_0020: ret // return
} // end of method Program::Main
我對此程序的理解是否正確?
當n個職位被某些東西消耗(例如調用)時,只有最高職位被消費了嗎?然後將一些數值放回評估堆棧中?我想這是真的,因爲畢竟它是一個'疊加',但我只是要求確定。 – ProgrammerAtWork
是的。讀取A,B,C,D併產生Y,Z的假設操作會從堆棧*中彈出4個條目,計算結果*,然後將2個新條目推送到其上。 (*)並不一定按順序排列,但推動總是最後一個。 – quetzalcoatl