Acabo de comenzar a buscar IL un poco y tengo curiosidad si mi intento (mostrado a continuación) para eliminar el exceso de código de la salida del compilador tuvo efectos secundarios no deseados.Preguntas sobre IL codificado a mano basado en código simple desensamblado de C#
Un par de quesiton acerca de los resultados:
- ¿Cuál es el propósito de las operaciones nop en el original?
- ¿Cuál es el propósito de los br.s al final de los métodos en el original?
- ¿Es incorrecta la versión reescrita de alguna manera?
original C# Código:
class Program {
public static int Main() {
return Add(1, 2);
}
public static int Add(int a, int b) {
return a + b;
}
}
compilado con csc.exe
y desmontado con ildasm.exe
(original):
.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
}
reescrito (produce una salida idéntica):
.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
}
el nop "sin operación" es donde puede establecer su punto de interrupción durante la depuración. Intenta compilarlo para su lanzamiento. – Johnny