Est-il possible de convertir en C/C++ code source de l'assemblée?
Est-il possible de transformer un simple code C ou C++ (par simple je veux dire: la prise de certains int comme la saisie, l'impression de quelques formes simples qui en dépendent int en sortie) langage d'assemblage? Si il n'y en a pas, je vais juste le faire manuellement, mais depuis que je vais le faire pour les processeurs tels que Intel 8080, il semblait juste un peu fastidieux. Pouvez-vous en quelque sorte d'automatiser le processus?
Aussi, si il ya un moyen, comment bon (comme dans: élégant) la sortie de l'assemblée fichier de code source, lorsqu'il est comparé à la simple traduction manuellement?
- Il y a des programmes que pour ça... ils sont appelés compilateurs ;-). Juste essayer
gcc -S
par exemple. - Le processus de traduction d'une langue à une autre est appelé la compilation, nous avons l'habitude de compiler en C/C++ en binaire, mais la compilation d'une autre langue, que ce soit de l'assemblée ou de java est également tout à fait possible, la plupart des C/C++ toolchains vous permettent de compiler directement à l'assemblée toutefois, dans GCC et Clang, ceci est fait en utilisant l'option-S drapeau.
- Aussi, généralement parlant, nous avons principalement faire des compilations que de réduire les abstractions, et la compilation d'un langage de bas niveau à un niveau élevé, est parfois désigné comme "décompilation" en effet lors de la compilation du langage de bas niveau de la langue, à partir de laquelle le faible niveau de la traduction a été créé. Toutefois, cela signifie généralement une perte de la totalité ou de la plupart des abstractions, comme ce sont généralement perdues en faire la compilation de niveau haut au niveau bas.
- Une dernière remarque, lors de la compilation d'un langage de haut niveau à un faible niveau, il peut être une bonne idée de désactiver les symboles de débogage et d'optimisation, pour la sortie de l'assemblée plus apte pour les lecteurs humains.
Vous devez vous connecter pour publier un commentaire.
La plupart des compilateurs vous permettra de produire de l'assemblée de sortie. Pour un couple d'exemples évidents, Clang et gcc/g++ utilise le
-S
drapeau, et MS VC++ utilise le-Fa
drapeau à le faire.Quelques compilateurs ne prennent pas en charge directement (par exemple, si la mémoire est Watcom n'ai pas). Ceux que j'ai vu comme cela avait vous produire un fichier objet, puis inclus un désassembleur qui serait de produire un langage d'assemblage fichier à partir du fichier de l'objet. Je ne me souviens pas sûr, mais il ne m'étonne pas si c'est ce que vous devez faire avec le Numérique, Mars compilateur.
À quelqu'un qui est habitué à l'écriture de l'assemblée de la langue, de la sortie de la plupart des compilateurs généralement tendance à regarder pour le moins peu inélégant, surtout sur un CPU comme un x86 qui a tout à fait un peu de registres qui sont maintenant vraiment à usage général, mais ont toujours eu plus de sens précis. Par exemple, si un morceau de code a besoin à la fois d'un pointeur et d'un compteur, une personne serait probablement mettre le pointeur dans ESI ou de l'EDI, et le compteur dans ECX. Le compilateur peut facilement inverser ces. Que vais travail amende, mais une expérience de langage assembleur programmateur trouverez sans aucun doute plus lisible à l'aide d'ESI pour le pointeur et ECX pour le compteur.
long
est encore une version 32 bits de type. Cela signifie que votre compilateur doit être en mesure de faire quelque chose qui n'moderne compilateur se soucie de la synthèse de 32 bits opérations à l'aide de seulement 16 bits de registres.Jeter un regard à
gcc -S
:D'autres compilateurs, que de maintenir au moins partielle de la gcc de compatibilité peuvent également accepter ce drapeau. De LLVM
clang
, par exemple, n'.-masm
commutateur choisit asm saveur, il me semble, je n'ai pas utilisé il cependant.-march
drapeau, mais plus ancienne, vous pouvez acieve est probablementi386
.Bien, oui, il y a un tel programme. Il est appelé "Compilateur"
Pour répondre à vos edit: L'élégance de la sortie dépend de l'optimisation de votre compilateur. Habituellement, les compilateurs ne génèrent pas de code nous, les humains appellent "élégant".
La plupart des gens ici sont à droite, mais semblent avoir manqué la remarque sur 8080 (pas étonnant, il n'est pas dans le titre :). Toutefois, Google vient à la rescousse, comme toujours - à la recherche d'
compiler for 8080
produit quelques beaux résultats comme ceux-ci:La plupart de ces sont très anciens, et peut-être mal entretenus. Vous pouvez également essayer de 8085 qui est assez similaire
À la recherche de la sortie d'un x86 compilateur ne va pas être très utile, étant donné que la saisie et la sortie se font par un C ou C++ de la bibliothèque. Avec une 8080 il n'existe pas de bibliothèque donc, vous devez développer votre propre I/O routines pour certains matériels. C'est beaucoup, beaucoup de travail supplémentaire.