9
votes

Comment devenir un msil pro?

J'ai passé des heures sur un problème de débogage uniquement pour avoir un gars plus expérimenté sur l'IL (quelque chose comme 00400089 MOV DWORD PTR [EBP-8], EDX) et signalez le problème. Honnêtement, cela ressemble à l'hébreu à moi - je n'ai aucune idée de ce que ça disait.

Où puis-je en savoir plus sur ce genre de choses et impressionner tout le monde autour de moi? Mon objectif est de lire des choses comme suit et de faire un commentaire comme: Yeh, vous avez une condition de course. P>

.maxstack 2
.entrypoint
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass) 

ldloca mclass
ldc.i4 5


1 commentaires

Haha, "Où puis-je en savoir plus sur ce genre de choses et impressionner tout le monde autour de moi." Ce sont deux complètement différentes questions, mon ami;) à moins que vous ne sortez exclusivement avec Nerds (comme moi), je suppose ...


4 Réponses :


7
votes

Ce n'est pas mail, c'est la langue d'assemblage 80x86.


1 commentaires

Après avoir travaillé dans l'assemblée depuis plusieurs années, il y a de nombreuses années, plus récemment sur une routine cryptographique AES, je peux vous dire que vous ne devriez pas tenter de diluer vos efforts d'apprentissage C # en essayant d'incliner l'assembleur. Si votre code d'origine était en C #, vous auriez dû être capable de détecter une condition de course dans le code d'origine.



4
votes

Pour obtenir de superbe, commencez avec cet article fantastique: Introduction à la langue d'assemblage IL . Bien que cela dit "Introduction", c'est tout ce dont vous avez besoin pour commencer à vous mettre à l'aise.

L'autre partie de ce dont vous avez besoin est la pratique et beaucoup de cela. Utilisez réflecteur .NET et commencez à regarder le code démonté en IL. (Astuce: lorsque vous allez le télécharger, vous n'avez pas à fournir un jet de courrier électronique réel.) En outre, jouez avec le Reflexil Plugin dans le réflecteur. Voici un bon point de départ pour cela: Manipulation de l'assemblage et injection C # / VB.NET .

Pas nécessaire mais un bonus: le réflexil est open source. Vous pouvez obtenir la source ici .


0 commentaires

3
votes

Je peux vous donner une réponse qui gère les deux sens.

D'une part, il n'y a rien de tel que de bonnes compétences linguistiques de montage pour vous apprendre à quel point un ordinateur fonctionne vraiment. MSIL est, dans une certaine mesure, une langue semblable à un montage. Au bas, il existe très peu de possibilités de faire ce genre de développement.

D'autre part, le recours à la recherche du MSIL pour résoudre un problème n'est pas nécessairement le moyen le plus direct ou le plus éducatif de comprendre un problème. En cinq ans de programmation .NET, je n'ai jamais ressenti le besoin d'y aller. Une seule fois une fois qu'un collègue (qui avait travaillé chez Microsoft sur le test du compilateur) est allé là-bas avec un problème que j'essayais de résoudre et, à la fin, sa réponse était trompeuse, car le véritable problème était basé sur la conception et les contraintes de CLR. . Une meilleure connaissance du CLR et C # aurait conduit à une meilleure compréhension et à une véritable solution.

(au cas où vous vous demandez, le problème était que je voulais utiliser "comme" pour casting en toute sécurité avec un générique. "Comme" ne fonctionnait pas, mais "est" a fait. Mon collègue a noté que " est "et" comme "utilise le même msil. Le vrai problème est que" comme "ne fonctionne" que "uniquement pour casting de classes, et sans la contrainte appropriée sur la déclaration générique, c # ne sait pas si votre type générique sera une classe. Dans Fait, les types que j'utilisais avec des génériques étaient des types de valeur; "comme" ne pouvait pas fonctionner pour ceux du tout.)

Plutôt que d'aller pour les compétences de MSL, je recommande vivement le livre de Jeffrey Richter CLR via C #. Même après des années de creuser fort dans C #, ce livre est toujours plein de révélations - j'apprends quelque chose de chaque page.


2 commentaires

La raison comme ne fonctionne pas avec les types de valeur est parce que les types de valeur ne peuvent pas être null , mais comme veut retourner null si la variable n'est pas du type fourni. Si vous savez que votre paramètre de type générique t est un type de valeur (c'est-à-dire que vous avez spécifié la contrainte struct ), vous pouvez utiliser comme t? Au lieu de comme t et cela fonctionnera même si l'instance est en réalité de type t et non t? . Cependant, il s'agit d'une question de langue purement c # et a peu à voir avec IL ou le CLR ...


@Timwi, exactement juste; "Comme" ne peut pas retourner une nulle sur un type de valeur, et cela a absolument rien à voir avec IL. C'est le but; Apprendre IL ne vous aide pas à résoudre des cas comme celui-ci. Que ce soit purement une question de langue, ou implique la mise en œuvre du CLR des génériques, je ne pouvais pas dire, mais je noterai que la manipulation de la moulage VB.NET (via Directcast ou Trycast) a beaucoup le même problème.



3
votes

ne peut pas dire que je suis un il "pro", mais j'ai réussi à m'appeler à peu près tout en procédant comme suit:

  • Écrivez un programme C # très court (deux ou trois lignes) que vous êtes curieux de savoir comment écrire dans IL.

  • compilez le programme.

  • Ouvrez l'exe compilé dans réflecteur .NET .

  • Regardez le code IL pour la méthode dans le réflecteur.

  • Survolez votre souris sur un opcode IL (par exemple "LDLOC"). Il y a une info-bulle décrivant chaque instruction IL.


0 commentaires