9
votes

Générer du code d'assemblage du code C #?

Y a-t-il un moyen de générer du code de montage du code C #? Je sais que cela est possible avec C code C avec du gaz, mais quelqu'un sait-il s'il est possible avec C #?


2 commentaires

Je ne suis pas clair ce que vous demandez. Voulez-vous compiler votre C # à assembler ou souhaitez-vous écrire un programme C # qui génère l'assemblage?


Je veux voir comment mon code C # ressemble à l'assemblage. À des fins éducatives. Prendre une classe d'assemblage en ce moment.


4 Réponses :


4
votes

c # est normalement compilé au bytecode .Net (appelé CIL ou MSIL ), puis < un href = "http://fr.wikipedia.org/wiki/just-in-time_compilation" rel = "nofollow"> JIT ("juste dans le temps") compilé au code natif lorsque le programme est réellement exécuté . Il existe des compilateurs à l'avance pour C # comme AOT de Mono , afin que vous puissiez compiler un programme C # à travers un de ceux-ci puis le désassembler. Le résultat est susceptible d'être très difficile à suivre.

Plus probablement, vous voudrez peut-être examiner les bytecodes qui sont un peu plus haut que le code de l'Assemblée de la CPU, que vous pouvez faire en utilisant ildasme sur un compilé d'un programme C #.


0 commentaires

4
votes

C # Code compile dans MSIL (langue intermédiaire MS) qui n'est en fait pas vraiment code ASM que vous obtenez du compilateur C. En savoir plus sur la manière dont .NET Framework applications exécutées.

Si vous voulez regarder le code IL généré, voir Question .


0 commentaires

2
votes

Vous pouvez le faire en un peu indirectement en utilisant le NGen outil puis démonter le binaire produit. Sinon, vous pouvez utiliser un débogueur pour inspecter le code JIT créé à partir du MSIL, OLLYDBG 2 est un tel débogger capable de faire cela.


0 commentaires

5
votes

Vous pouvez utiliser Benchmarkdototnet avec le drapeau de l'impression défini sur true.

[DisassemblyDiagnoser(printAsm: true, printSource: true)] // !!! use the new diagnoser!!
[RyuJitX64Job]
public class Simple
{
    int[] field = Enumerable.Range(0, 100).ToArray();

    [Benchmark]
    public int SumLocal()
    {
        var local = field; // we use local variable that points to the field

        int sum = 0;
        for (int i = 0; i < local.Length; i++)
            sum += local[i];

        return sum;
    }

    [Benchmark]
    public int SumField()
    {
        int sum = 0;
        for (int i = 0; i < field.Length; i++)
            sum += field[i];

        return sum;
    }
}


0 commentaires