2012-03-23 7 views
11

Estoy aprendiendo el lenguaje ensamblador en mi tiempo libre. ¿Alguien puede explicar por qué .maxstack parece ser opcional en este programa? He tratado de encontrar la respuesta en línea y en mi libro con esa suerte es decir, el programa se compila y ejecuta con .Maxstack comentada:¿Por qué la directiva .MaxStack es opcional en el código MSIL?

//Add.il 
//Add Two Numbers 

.assembly extern mscorlib {} 

.assembly Add 
{ 
    .ver 1:0:1:0 
} 
.module add.exe 

.method static void main() cil managed 
{ 
    //.maxstack 2 
    .entrypoint 

    ldstr "The sum of 50 and 30 is = " 
    call void [mscorlib]System.Console::Write (string) 

    ldc.i4.s 50 
    ldc.i4 30  
    add 
    call void [mscorlib]System.Console::Write (int32) 
    ret 
} 

soy compilar el programa en la línea de comandos usando la herramienta y ILASM luego ejecutando el ejecutable generado.

Respuesta

12

Creo que su confusión proviene de un malentendido de lo que realmente hace .maxstack. Es un error fácil de hacer, porque parece que causaría un error al ejecutar. Sorprendentemente, esa directiva en particular tiene que nada tiene que ver con el tamaño de la pila en el tiempo de ejecución, sino que se usa específicamente durante la verificación del código.

de la partición III - Sección 1.7.4

Nota: Maxstack se relaciona con el análisis del programa, no al tamaño de la pila en tiempo de ejecución. No especifica el tamaño máximo en bytes de un marco de pila, sino más bien el número de elementos que una herramienta de análisis debe rastrear.

El código se convierte en no verificable. Esa misma sección, señala que cualquier implementación conforme no necesita admite un método con un valor máximo de pila no válido. Sin embargo, no dice que no debe, y bastante claro, el tiempo de ejecución está ejecutando el código. Entonces, si parece no tener ningún efecto, ¿por qué molestarse en tenerlo?

creas o no, de forma predeterminada , el marco .NET corre no verificable código. En realidad, fue difícil para mí averiguar cómo habilitar la verificación en .NET 4.0, pero si encienda CAS, su programa (con .maxstack 1) dejará de funcionar con

Excepción no controlada: System.InvalidProgramException: Común Language Runtime detectó un programa no válido. al principal()

Teniendo esto en cuenta, no verificable el código no puede funcionar en cualquier entorno que no tiene plena confianza (generalmente asambleas de internet). Si eso no es importante para usted, puede dejar que sea un valor no válido, y realmente no hará la diferencia. Si el código mismo sigue siendo correcto, se ejecutará correctamente; por supuesto, si realmente hay un problema con la pila IL, lanzará un InvalidProgramException.

0

Si no recuerdo mal, el tamaño de pila predeterminado es 8 si se omite la instrucción.

+1

esto es lo que primero pensé, pero el programa aún se ejecuta si establezco el .maxstack en el programa anterior en 1. Debe ser 2 o más para el programa de lo que puedo ver. – w0051977

+0

Solo estoy adivinando aquí, pero tal vez ILASM es lo suficientemente inteligente como para darse cuenta de que 1 no sería suficiente y anula la configuración. –

+2

@ 500-InternalServerError, no lo es. Según ILDASM, el código emitido realmente contiene '.maxstack 1'. Y de acuerdo con la especificación, dicho código debería ser inválido y no verificable. Y PEVerify en realidad falla la verificación del ensamblado. Pero funciona bien de todos modos. – svick

Cuestiones relacionadas