conversion ASM en C (sauf reverse engineer))
j'ai cherché sur Google et je vois une quantité surprenante de réponses désinvoltes en riant essentiellement de l'asker pour avoir posé une telle question.
Microchip fournit gratuitement du code source (Je ne veux pas le poster ici au cas où ce serait un non-non. Fondamentalement, google AN937, cliquez sur le premier lien et il ya un lien pour "code source" et son un fichier zippé). C'est en ASM et quand je le regarde, je commence à loucher. J'aimerais le convertir en quelque chose qui ressemble à un langage de type c pour que je puisse suivre le long. Parce que les lignes de tels que:
GLOBAL _24_bit_sub
movf BARGB2,w
subwf AARGB2,f
sont probablement très simples mais elles ne signifient rien pour moi.
il doit y avoir un traducteur automatique ASM to C là-bas mais tout ce que je peux trouver c'est des gens qui disent que c'est impossible. Franchement, c'est impossible que ce soit impossible. Les deux langues ont une structure et cette structure peut certainement être traduite.
je vous remercie.
13 réponses
vous pouvez absolument faire un programme c de assembleur. Le problème est qu'il ne peut pas ressembler à ce que vous pensez, ou peut-être il sera. Mon PIC est rouillé mais en utilisant un autre monteur, dire que vous aviez
add r1,r2
EN C, disons que ça devient
r1 = r1 + r2;
peut-être plus lisible. Vous perdez tout sens des noms de variables peut-être que les valeurs sautent de la mémoire aux registres et en arrière et les registres sont réutilisés. Si tu parles de anciennes photos qui avait que deux enregistre un accumulateur et un autre, en fait, il pourrait être plus facile parce que les variables étaient en mémoire pour la plupart, vous regardez l'adresse, quelque chose comme
q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;
longueur mais il est clair que mem[0x12] = mem[0x12] + mem[0x13];
ces emplacements de mémoire sont des variables probables qui ne sauteront pas autour comme le code C compilé pour un processeur avec un tas de registres. Le pic pourrait rendre plus facile de comprendre les variables et ensuite de faire une recherche et remplacer pour les nommer à travers le fichier.
ce que vous recherchez s'appelle une traduction binaire statique, pas nécessairement une traduction d'un binaire à un autre (d'un processeur à un autre) mais dans ce cas une traduction de pic binaire à C. Idéalement, vous voudriez prendre l'assembleur donné dans la note d'application et l'assembler à un binaire en utilisant les outils de micro puce, puis faire la traduction. Vous pouvez faire la traduction binaire dynamique aussi bien, mais vous êtes encore moins susceptibles de trouver l'un des ceux-ci et il ne résulte pas normalement en C mais un binaire à l'autre. Tu t'es déjà demandé comment fonctionnaient ces joysticks à 15 $à wal-mart avec pac-man et galaga? Le rom de l'arcade a été converti en utilisant la traduction binaire statique, optimisé et nettoyé et le C ou n'importe quel langage intermédiaire compilé pour le nouveau processeur cible dans la boîte de main. J'imagine qu'ils n'ont pas tous été faits de cette façon, mais je suis sûr que certains l'ont été.
la question du million de dollars, pouvez-vous trouver un binaire statique traducteur pour un pic? Qui sait, tu devras probablement en écrire un toi-même. Et devinez ce que cela signifie, Vous écrivez un désassembleur, et au lieu de désassembler à une instruction dans la syntaxe de l'assembleur natif comme add r0,r1 vous avez votre désassembleur imprimer r0=r0+r1; au moment où vous terminez ce désassembleur bien que vous connaîtrez le langage d'assemblage pic si bien que vous n'aurez pas besoin du traducteur asm to c. Vous avez de la poule et de l'oeuf problème.
Pour le exactement le même le retour du code source d'un programme compilé est fondamentalement impossible. Mais les décomposeurs ont été un domaine de recherche en informatique (par exemple le dcc decompiler, qui était un projet de doctorat).
il existe différents algorithmes qui peuvent être utilisés pour faire la correspondance des motifs sur le code d'assemblage et générer du code C équivalent, mais il est très difficile de le faire d'une manière générale qui fonctionne bien pour toutes les entrées.
Vous pourriez vouloir découvrez Boomerang pour un semi-récent open source effort généralisé decompiler.
Vous vous ne pouvez pas de façon déterministe convertissez le code d'assemblage en C. interruptions, code modificateur automatique, et autres choses de bas niveau n'ont pas de représentation autre que l'assemblage en ligne en C. Il n'y a qu'une certaine mesure dans laquelle un processus d'assemblage en C peut fonctionner. Sans compter que le code C résultant sera probablement plus difficile à comprendre que la lecture du code assembleur... a moins que vous ne l'utilisiez comme base pour commencer la réimplantation du code d'assemblage en C, alors il est quelque chose d'utile. Regardez le plugin Hex-Rays pour IDA.
j'ai travaillé une fois sur un projet où une partie importante de la propriété intellectuelle était des algorithmes importants codés dans le code d'assemblage x86. Pour porter le code à un système embarqué, le développeur de ce code (pas moi) a utilisé un outil D'un ensemble appelé MicroAPL (si je me souviens bien):
j'ai été très, très surpris à quel point l'outil n'.
en revanche, je pense que c'est un de ces "si vous avez à demander, vous ne pouvez pas vous le permettre" type de choses (leurs fourchettes de prix pour une conversion unique d'un projet se déroulent à environ 4 lignes d'assemblage traitées pour un dollar).
mais, souvent les routines d'assemblage que vous obtenez d'un fournisseur sont empaquetées comme des fonctions qui peuvent être appelées à partir de C - donc aussi longtemps que les routines font ce que vous voulez (sur le processeur que vous voulez utiliser), vous pourriez juste avoir besoin de les assembler et plus ou moins les oublier - ils sont juste une bibliothèque fonctions que vous appelez de C.
Oui, il est très possible de le désosser code assembleur de bonne qualité en C.
je travaille pour une MicroAPL, une entreprise qui produit un outil appelé Relogix pour convertir le code assembleur en C. Il a été mentionné dans l'un des autres postes.
s'il vous Plaît prendre un coup d'oeil sur les exemples sur notre site web:
il doit y avoir un traducteur automatique ASM to C là-bas mais tout ce que je peux trouver c'est des gens qui disent que c'est impossible. Franchement, c'est impossible que ce soit impossible.
Non, il n'est pas. La Compilation perd de l'information: il y a moins d'information dans le code objet final que dans le code source C. Un décompilateur ne peut pas magiquement créer cette information à partir de rien, et donc la décompilation vraie est impossible.
ce n'est pas impossible, juste très difficile. Un programmeur d'assemblage et de C qualifié pourrait probablement le faire, ou vous pourriez envisager d'utiliser un Decompiler. Certains d'entre eux font un assez bon travail de conversion de l'asm en C, bien que vous devrez probablement renommer certaines variables et méthodes.
découvrez ce site pour une liste de décompilation disponibles pour l'architecture x86.
extraire ceci: decompiler
Un decompiler est le nom donné à un programme d'ordinateur qui effectue la opération inverse à celle d'un compilateur. Qui est, elle se traduit par une fichier contenant des informations à un niveau d'abstraction relativement faible (généralement conçus pour être ordinateur lisible plutôt que lisible par l'homme) dans une forme ayant un niveau plus élevé de abstraction (généralement conçue pour être lisible par l'homme).
pas facilement possible.
l'un des grands avantages de C par rapport à ASM, outre la lisibilité, était qu'il empêchait les astuces de programmation "intelligentes".
il y a de nombreuses choses que vous pouvez faire en assembleur qui n'ont pas d'équivalent C direct, ou impliquent une syntaxe tortueuse en C.
l'autre problème est celui des types de données la plupart des assembleurs n'ont essentiellement que deux types de données interchangeables: les octets et les mots. Il peut y avoir des constructions de langage pour définir ints et floats etc. mais aucune tentative n'est faite pour vérifier que la mémoire est utilisée comme définis. Il est donc très difficile d'associer le stockage ASM aux types de données c.
en outre, tout stockage assembleur est essentiellement une "structure"; le stockage est étalé dans l'ordre où il est défini (contrairement à C où le stockage est commandé au gré de l'exécution). De nombreux programmes ASM dépendent de la disposition exacte du stockage - pour obtenir le même effet en C, vous devez définir tout le stockage comme faisant partie d'une seule structure.
également là sont beaucoup d'instructions absused (sur Olde worlddy IBM manframes LA, l'adresse de charge, l'instruction a été régulièrement utilisé pour effectuer arithmétique simple car il était plus rapide et n'avait pas besoin d'un registre de débordement )
bien qu'il puisse être techniquement possible de traduire en C le code C résultant serait moins lisible que le code ASM qui a été transalé.
je peux dire qu'avec une garantie de 99%, Il n'y a pas de convertisseur prêt pour ce langage d'assemblage, donc vous devez en écrire un. Vous pouvez simplement l'implémenter en remplaçant la commande ASM par la fonction C:
movf BARGB2,w -> c_movf(BARGB2,w);
subwf AARGB2,f -> c_subwf(AARGB2,f);
Cette partie est facile :) Ensuite, vous devez mettre en œuvre chaque fonction. Vous pouvez déclarer des registres en tant que globals pour rendre les choses faciles. Vous pouvez aussi utiliser non pas des fonctions, mais #defines, appelant des fonctions si nécessaire. Cela aidera avec le traitement des arguments/résultats.
#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here
Spécial le cas est ASM directives / labels, je pense qu'il peut être converti avec #defines seulement.
L'amusement commence quand vous atteindrez des fonctionnalités spécifiques au CPU. Cela peut être des appels de fonction simples avec des opérations de pile, certaines opérations IO/mémoire spécifiques. Les opérations avec le programme Counter register, utilisé pour les calculs, ou en utilisant/comptant tiques/latences sont plus amusantes.
mais il y a un autre moyen, si ce hardcore se produit. C'est hardcore aussi. :) Il y a une technique nommée dynamique la recompilation existe. Il est utilisé dans de nombreux émulateurs.
Vous n'avez pas besoin de recompiler votre ASM, mais l'idée est presque la même. Vous pouvez utiliser tous vos #defines à partir de la première étape, mais ajouter le support des fonctionnalités nécessaires à eux (incrementing PC/tics). Vous devez aussi ajouter de l'environnement virtuel pour votre code, comme les gestionnaires de mémoire/IO, etc.
Bonne chance :)
je pense qu'il est plus facile de prendre un livre sur l'assemblage PIC et apprendre à le lire. L'assembleur est généralement assez simple à apprendre, car elle est si bas niveau.
il est difficile de convertir une fonction de asm en C mais faisable à la main. Convertir un programme entier avec un décompilateur vous donnera du code qui peut être impossible à comprendre puisque la plupart de la structure a été perdue pendant la compilation. Sans noms de variables et de fonctions significatifs, le code C qui en résulte est encore très difficile à comprendre.