Ensamblador en .NET

Iniciado por LastDragon, 19 Agosto 2006, 00:30 AM

0 Miembros y 1 Visitante están viendo este tema.

LastDragon

Un ensamblador orientado a objetos =)

.assembly HelloWorld
{
}

.namespace ilamscosa
{
.class private auto ansi beforefieldinit MainClass
{
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack  1
ldstr      "Hola Ensamblador de .NET"
call       void [mscorlib]System.Console::WriteLine(string)
ret
}
}
}

JuanK_Solocodigo

#1
 :D Hola mundo. un exe
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
  .ver 2:0:0:0
}

.assembly extern System.Windows.Forms
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
  .ver 2:0:0:0
}

//Mi Ensamblado
.assembly HM
{
  .hash algorithm 0x00008004
  .ver 1:0:0:0
}

.module HM.exe
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0002       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY


.class private auto ansi beforefieldinit HolaMundo
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  Main(string[] Args) cil managed
  {
    //Establece que este metoido es el metodo de entrada ppal del
    //ensamblado
    .entrypoint
    // Code size       19 (0x13)
    .maxstack  8
   
    ldstr \\\"CIL, bacano\\\"
    call valuetype[System.Windows.Forms]
           System.Windows.Forms.DialogResult
           [System.Windows.Forms]
           System.Windows.Forms.MessageBox::Show(string)       
    pop
    ret
  } // end of method HolaMundo::Main

  //Contructor por defecto de la clase
  .method public hidebysig specialname rtspecialname
          instance void  .ctor() cil managed
  {
    // Code size       7 (0x7)
    .maxstack  8
    ldarg.0
    call       instance void [mscorlib]System.Object::.ctor()
    ret
  } // end of method HolaMundo::.ctor

} // end of class HolaMundo
Juan Carlos Ruiz
Ingeniero de Sistemas
Mi Blog Técnico

JuanK_Solocodigo

Ejercicio creando una dll.

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
  .ver 2:0:0:0
}

//Referenciar System.Windows.Forms
.assembly extern System.Windows.Forms
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
  .ver 2:0:0:0
}

//Definiendo ensamblado simple de un archivo
.assembly CILCars
{
  .hash algorithm 0x00008004
  .ver 1:0:0:0
}
.module CILCars.dll

//Implementacion
.namespace CILCars
{
   .class public auto ansi beforefieldinit CILCar
          extends [mscorlib]System.Object
   {
      //Definicion de campos
      .field public string petName
      .field public int32 currSpeed
     
      //Constructor sencillo
      .method public hidebysig specialname rtspecialname
              instance void .ctor(int32 c, string p)cil managed
      {
         .maxstack 8
         
         //Cargar primer argumento al stack
         ldarg.0// es el objeto this, siempre pasado como oculto de primer parametro
         //llamar al constructor de la clase padre
         call instance void[mscorlib]System.Object::.ctor();
         
         //Ahora cargar 1er y 2do argumento al stack
         ldarg.0//this siempre se pasa como parametro
         ldarg.1//int32
         
         //almacenar la punta de la pila (int 32) a la variable miembro (field) currSpeed
         stfld int32 CILCars.CILCar::currSpeed
         
         //Asignar ahora la variable petName
         ldarg.0//this siempre se pasa como parametro
         ldarg.2//string
         
         stfld string CILCars.CILCar::petName
         ret
      }     
   }
   
   .class public auto ansi beforefieldinit CILCarInfo
          extends [mscorlib]System.Object
   {
      //Definiendo un mestodo estatico
      .method public hidebysig static void
              Display(class CILCars.CILCar c) cil managed
      {
         .maxstack 8
         
         //definiendo variable local
         .locals init ([0] string caption)
         
         //Cargar el valor de CILCar del auto en el stack
         ldstr \"{0}\'s speed is:           \"
         //Manda del CILCar al stack (el puntero desde luego)
         ldarg.0
         
         //Ahora se coloca el valor de CILCar.petName en el stack
         //y se llama a statis String.Format(string, object)
         ldfld string CILCars.CILCar::petName
         call  string [mscorlib]System.String::Format(string, object)
         stloc.0
         
         //Ahora cargo el valor de currSpeed en el stack y obtengo su representacion
         //alfabetica
         //Enviar el objecto que accedere al stack (CILCar)
         ldarg.0
         //Enviar la direccion de la variable que necesito ya que
         //ToString requiere la direccion en la cima del stack
         ldflda int32 CILCars.CILCar::currSpeed
         //ahora llamo a ToString
         call instance string [mscorlib]System.Int32::ToString()
         //Lo guardo en mi variable local
         ldloc.0
         
         //Ahora llamo al msgbox par que muestre lo necesario
         call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult
              [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string, string)
             
         pop
         ret
      } 
   }
}
Juan Carlos Ruiz
Ingeniero de Sistemas
Mi Blog Técnico

JuanK_Solocodigo

#3
 :D Una interfaz en una dll.

.assembly extern mscorlib{}

//Mi ensamblado
.assembly CILTypes
{
  .ver 1:0:0:0
}
.module CILTypes.dll

//Ensamblado de Windows GUI
.subsystem 0x0002

.namespace Entrenamiento
{
  .namespace MiNamespace{}
}

.namespace MiNamespace
{
  //Definicion de tipos base 
  .class public MiClaseBase{} 
  .class public interface IMiInterface{}
 
  //Definicion de tipos heredados | implementados
  .class public MiClaseDerivada
         extends MiNamespace.MiClaseBase
         implements MiNamespace.IMiInterface{}
         
   //Definicion de una estructura
   .class public sealed MiEstructura1 extends [mscorlib]System.ValueType{}
   .class public value MiEstructura2{}
   
   //Definicion de enums
   .class public sealed MiEnum1 extends [mscorlib]System.Enum{}
   .class public enum MiEnum2{}
}
Juan Carlos Ruiz
Ingeniero de Sistemas
Mi Blog Técnico

JuanK_Solocodigo

Cita de: JuanK_solocodigo en 19 Agosto 2006, 00:38 AM
:D Una interfaz en una dll.

.assembly extern mscorlib{}

//Mi ensamblado
.assembly CILTypes
{
  .ver 1:0:0:0
}
.module CILTypes.dll

//Ensamblado de Windows GUI
.subsystem 0x0002

.namespace Entrenamiento
{
  .namespace MiNamespace{}
}

.namespace MiNamespace
{
  //Definicion de tipos base 
  .class public MiClaseBase{} 
  .class public interface IMiInterface{}
 
  //Definicion de tipos heredados | implementados
  .class public MiClaseDerivada
         extends MiNamespace.MiClaseBase
         implements MiNamespace.IMiInterface{}
         
   //Definicion de una estructura
   .class public sealed MiEstructura1 extends [mscorlib]System.ValueType{}
   .class public value MiEstructura2{}
   
   //Definicion de enums
   .class public sealed MiEnum1 extends [mscorlib]System.Enum{}
   .class public enum MiEnum2{}
}

Juan Carlos Ruiz
Ingeniero de Sistemas
Mi Blog Técnico

Robokop

una duda eso como se compila , en que tipo de próyecto. :P

JuanK_Solocodigo

#6
teniendo instalado el .net framework sdk:

ilasm /exe ensamblado.il

las librerias

ilasm /dll ensamblado.il

eso es lo básico desde luego hay opciones mas avanzadas para las referencias etc.

En Visual Studio no hay ninguna opcion que te permita hacer proyectos con IL, pero en Sharp Develop hay una, no muy completa pero si muy estable.
Juan Carlos Ruiz
Ingeniero de Sistemas
Mi Blog Técnico