IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

de l'assembleur vers le C


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut de l'assembleur vers le C
    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

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    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!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    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é?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    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.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par benjaminadv Voir le message
    je cherche un équivalent en C de l'instruction assembleur nop.
    est-ce que tu sais ce que fait l'instruction NOP au moins ?

  6. #6
    Membre averti
    Avatar de ChipsAlaMenthe
    Homme Profil pro
    Ingénieur en eau chaude et ballon rond
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur en eau chaude et ballon rond
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Points : 394
    Points
    394
    Par défaut
    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

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Oui ChipsAlaMenthe, je pense que je vais inséré du code assembleur pour ce genre de chose...

    Merci pour l'aide en tout cas

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 387
    Points : 23 700
    Points
    23 700
    Par défaut
    Bonjour,

    Citation Envoyé par benjaminadv Voir le message
    Oui ChipsAlaMenthe, je pense que je vais inséré du code assembleur pour ce genre de chose...

    Merci pour l'aide en tout cas
    Posons la question d'une autre manière, dans ce cas : pourquoi veux-tu insérer un NOP dans ton programme C ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    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.

  10. #10
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    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.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    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.

  12. #12
    Membre averti
    Avatar de ChipsAlaMenthe
    Homme Profil pro
    Ingénieur en eau chaude et ballon rond
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur en eau chaude et ballon rond
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Points : 394
    Points
    394
    Par défaut
    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

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    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.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  14. #14
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 18
    Points : 35
    Points
    35
    Par défaut
    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

  15. #15
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Le plus proche est une instruction vide, c'est à dire un point virgule isolé.
    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 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.

  16. #16
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    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
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

Discussions similaires

  1. [Tutoriel] Pas à Pas vers l'Assembleur par Lord Noteworthy
    Par Noteworthy dans le forum Assembleur
    Réponses: 23
    Dernier message: 20/09/2020, 23h01
  2. Assembleur vers langage C
    Par benjaminadv dans le forum Autres architectures
    Réponses: 12
    Dernier message: 28/05/2015, 07h25
  3. traduction d'assembleur vers du C - probleme 32 vers 64 bits
    Par nicolasprogrammeur dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 24/02/2011, 09h23
  4. Code C vers Assembleur
    Par Invité dans le forum Autres architectures
    Réponses: 3
    Dernier message: 06/03/2009, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo