bonjour.
J'ai pour projet de traduire un programme écrit de assembleur vers le C.
Je cherche un équivalent en C du nop en asm.
Après quelque recherche, je n'ai pas trouvé de solution... Si quelqu'un a une petite idée, je suis preneur
merci d'avance![]()
bonjour.
J'ai pour projet de traduire un programme écrit de assembleur vers le C.
Je cherche un équivalent en C du nop en asm.
Après quelque recherche, je n'ai pas trouvé de solution... Si quelqu'un a une petite idée, je suis preneur
merci d'avance![]()
Le C est beaucoup plus expressif que l'assembleur.
Un nop assembleur est un détail d'optimisation.
Le plus proche est une instruction vide, c'est à dire un point virgule isolé.
Pour traduire de l'assembleur en C, il "suffit" de réécrire les controles de flux, puis de discerner des variables.
Concrêtement, tu ne trouveras pas de logiciel.
Ce que tu cherches s'appelle de la décompilation, et c'est extrèmement expérimental.
Le problème est de retrouver de l'information perdue: les commentaires (impossible), les variables (très délicats), les boucles (pour cause d'optimisations), les fonctions inlines, les constantes, etc.
Bon courage!
Je suis encore débutant en programmation, je cherche un équivalent en C de l'instruction assembleur nop.
Que veut tu dire pas un point virgule isolé?
Une ligne vide avec juste un point-virgule dessus.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Certaines instructions Assembleur n'existent pas en C même si le C est bas niveau. C'est pourquoi dans certains cas dans l'embarqué par exemple, du code assembleur est inséré à certains endroits, le cas d'utilisation le plus fréquent est pour de l'optimisation.
Soit conscient que tu ne pourras pas toujours trouver ton bonheur à ce sujet![]()
Oui ChipsAlaMenthe, je pense que je vais inséré du code assembleur pour ce genre de chose...
Merci pour l'aide en tout cas![]()
Le programme en assembleur que j'ai à traduire contient des nop pour écouler le temps d'un tour de cycle d'horloge.
IL me permet de créé de toute petite base de temps.
http://herve.hollard.perso.sfr.fr/do...%20C_temps.pdf
Je viens de trouver ce lien qui parle des nop.
PS: j'utilise un microcontrôleur.
hmm.. est-on bien sûr qu'un nop consomme exactement 1 cycle d'horloge, d'ailleurs je crois me souvenir que non selon le nop utilisé, mais admettons
au plus simple je pense que j'utiliserais explicitement de l'assembleur inline, justement pour éviter toute optimisation qui le ferait sauter, donc un truc simple genre asm("nop"); devrait faire l'affaire, à vérifier.
Je doute qu'il soit sage de tenter de re-créer de la temporisation au cycle près dans tout autre langage que l'assembleur.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Ce qu’il faut savoir aussi c’est selon l’option de compilation que tu utilises, le code assembleur généré ne sera pas le même (avec les options –O2, -O3, etc…). Et admettons que le code C soit bel et bien généré, c’est délicat dans la mesure où ce sera sûrement difficilement lisible car les noms de variables seront choisies différemment d’un humain. ^^
Et comme le disais Médinoc, étant donné que le programmeur C ne prend pas en charge les cycles d’horloge comparé à l’assembleur, les performances seront sont plus difficiles à maîtriser ^^. Un exemple concret est l’utilisation du pipeline en assembleur, il n’est à priori pas possible de le reproduire en C (du moins à ma connaissance ^^). De plus tu peux avoir certains microcontrôleurs vectoriels ou super scalaires, ce qui complique encore plus les choses pour gérer l’utilisation des NOP. ^^
Si jamais tu te lance tout de même dans ce projet, sache qu’un NOP veut sûrement dire qu’une autre instruction est attendue afin de réaliser une opération. Essaie d’écrire dans un premier temps ton code assembleur sans les NOP et donc je pense sans parallélisme, et après essaie en C.
J’espère avoir été clair![]()
C'est surtout que le C est compilé en assembleur.
Le langage a été créé pour se libérer des contraintes fastidieuses de l'assembleur, en laissant un programme extrêmement controlé (le compilateur) faire les optimisations.
Un NOP n'a pas sa place dans du C.
Quelque chose dans la même philosophie (attendre...) serait wait() ou une variante.








salut,
le NOP en assembleur correspondent à XCHG AX,AX (ou XCHG EAX,EAX en 32bits)
si tu tiens à concerver les NOP remplace les par XCHG AX,AX
Je ne suis pas d'accord avec cette affirmation. En C, un point-virgule isolé sera éliminé par le compilateur, il ne produira pas de code assembleur et le CPU n'aura rien à exécuter. En assembleur, un NOP ne fait rien de concret mais est exécuté et consomme du temps CPU.Le plus proche est une instruction vide, c'est à dire un point virgule isolé.
Le temps d'exécution d'un NOP semble dépendre du CPU d'après Wikipédia.
Vouloir conserver les NOP me semble totalement intéressant voir potentiellement nuisible, comme cela a été dit par d'autres. Traduire un code-assembleur en C ne se fait pas forcément en traduisant instruction par instruction mais en traduisant l'algorithme. Pour le même code C, il n'y a pas forcément un unique code assembleur (c'est le rôle d'un compilateur avec ses niveaux d'optimisations par exemple) ; à l'inverse, il peut y avoir plusieurs codes C pour traduire le même bout d'assembleur.
Bonjour,
Tant qu'à parler d'assembleur, ce serait bien de préciser sur quelle famille de processeur tu travailles (vu que ça semble être de l'assembleur sur un microcontrôleur, je doute que ce soit du x86* dessus, contrairement à ce que tout le monde a l'air de penser ici).
Bref le mieux sur microcontrôleur c'est de se baser sur le timer interne (normalement synchronisé sur l'horloge) pour mesurer le temps comme expliqué en 2ème partie de ton PDF plutôt que d'émettre des nop à tout va pour essayer d'estimer le temps![]()
Partager