我剛開始注意IL,我很好奇如果我的嘗試(如下所示)從編譯器的輸出中刪除多餘的代碼有任何意外的副作用。關於基於反彙編簡單C#代碼的手編IL的問題
一個關於結果的情侶quesiton的:
- 什麼是在原有的NOP操作的目的是什麼?
- brs在原始方法結束時的目的是什麼?
- 重寫的版本有什麼不妥之處?
原始C#代碼:
class Program {
public static int Main() {
return Add(1, 2);
}
public static int Add(int a, int b) {
return a + b;
}
}
編譯時csc.exe
並用ildasm.exe
(原始)拆開它:
.method public hidebysig static int32 Main() cil managed
{
.entrypoint
.maxstack 2
.locals init (int32 V_0)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: ldc.i4.2
IL_0003: call int32 Program::Add(int32, int32)
IL_0008: stloc.0
IL_0009: br.s IL_000b
IL_000b: ldloc.0
IL_000c: ret
}
.method public hidebysig static int32 Add(int32 a,
int32 b) cil managed
{
.maxstack 2
.locals init (int32 V_0)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: add
IL_0004: stloc.0
IL_0005: br.s IL_0007
IL_0007: ldloc.0
IL_0008: ret
}
重新編寫(產生相同的輸出):
.method public hidebysig static int32 Main() cil managed
{
.entrypoint
.maxstack 2
ldc.i4.1
ldc.i4.2
call int32 Program::Add(int32, int32)
ret
}
.method public hidebysig static int32 Add(int32 a, int32 b) cil managed
{
.maxstack 2
ldarg.0
ldarg.1
add
ret
}
nop「no operation」是您可以在調試過程中設置斷點的位置。嘗試編譯發佈。 – Johnny