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

Générateurs de compilateur Discussion :

Traduire des instructions en binaire


Sujet :

Générateurs de compilateur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut Traduire des instructions en binaire
    Bonjour à tous,

    Je voudrais coder ces instructions en Binaire avec le langage C, Quelqu'un pourrais m'aider avec explications SVP ? Merci d'avance.

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    add $t1,$s2,$s5
    sub $t0,$zero,$t2
    nor $s0,$s3,$s2
    andi $v1,$a2,8
    addi $v0,$s1,14
    or $s0,$s0,$s2     
    sh $v0,7($s0)
    lw $t0,0($s0)   
    lh $s5,32($t0)
    sw $v0,49($t1)
    sb $a0,0($t5)    
    lb $t0,0($a0)

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 368
    Points : 23 616
    Points
    23 616
    Par défaut
    Bonjour,

    Ces instructions ne sont pas du langage C. Cela ressemble plutôt à de l'assembleur MIPS.

    Peux-tu nous décrire plus précisément ton problème ? Est-ce que tu veux simplement assembler ce programme ou as-tu besoin de l'insérer spécifiquement au sein d'un programme C plus général (auquel cas il faudra faire de l'assembleur inline) ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    Je te remercie pour ta réponse rapide, en faite oui c'est de l'assembleur MIPS, ce que je voudrais c'est de lire ces instructions avec le langage C ( ils vont être comme des paramètres rentrés ou fichier à lire) et de les encoder en binaire avec C. j'espère que c'est plus clair maintenant, Merci

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 188
    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 188
    Points : 17 136
    Points
    17 136
    Par défaut
    Par "en binaire", tu entends quoi?
    • les opérations bit-a-bit, auquel cas, regarde la liste des opérateurs disponibles en C (notamment |, &, ^, << et >>)
    • le code binaire généré, et là, on ne peut rien pour toi. Tu auras quelque chose d'équivalent, mais pas forcément très précisément celles-ci (pour des raisons d'optimisations)
    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

  5. #5
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Moi j'ai pas compris ?
    Tu veux mettre de l’assembleur en binaire ? la il faut juste regarder les opcodes correspondant (ou utiliser un programme assembleur).

    Tu veux traduire de l'assembleur en C ?
    c’est pas super compliqué : add c'est l'addition , sub la soustraction , and le & , or le | etc , mais pour ça il faut savoir lire l'assembleur d'abord :p

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    Merci d'avoir pris le temps de me répondre,

    en fait,ce que je veux c'est faire un algorithme qui va me permettre la chose suivante:
    si je lui donne par exemple la chaîne add $t3,$s3,$s5 il doit me retourner la chaine en binaire (en mips) suivante
    000000 10011 10101 01011 00000 010100

    Vous comprenez? Merci

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 188
    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 188
    Points : 17 136
    Points
    17 136
    Par défaut
    en vrai binaire ou en texte écrit avec des 0 et des 1?
    Le code sera très différent.

    Ce que tu cherches, cela dit, c'est passer de l'assembleur au langage machine.
    Sache que tous les compilateurs le font déjà.
    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

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    Merci termel pour ta réponse,
    je sais que les compilateurs le font déjà, mais moi j'ai besoin de le faire de cette façon dans mon projet , et en vrai binaire , Merci

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 368
    Points : 23 616
    Points
    23 616
    Par défaut
    Bonsoir,

    Citation Envoyé par da_latifa Voir le message
    Merci termel pour ta réponse,
    je sais que les compilateurs le font déjà, mais moi j'ai besoin de le faire de cette façon dans mon projet , et en vrai binaire , Merci
    C'est par cela qu'il aurait fallu commencer dans ce cas.
    Tu cherches donc à réécrire un assembleur pour MIPS ? Ce n'est pas très difficile en soi, mais cela peut être assez long et ça peut être un problème si tu as une échéance à court terme pour rendre ton projet.

    Lorsque tu écris un compilateur ou un interpréteur, il te faut en général rédiger une grammaire pour pouvoir décrire ton langage. As-tu le droit d'utiliser Lex & Yacc ? (flex et bison sous GNU/Linux).

  10. #10
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    En gros tu veux créer un programme assembleur ?

    Il existe le GNU assembleur pour le MIPS.
    Si tu veux un peu coder (mettre juste les mnémonique et opcode) tu as le code source de VASM ici : http://sun.hasenbraten.de/vasm/
    Si tu veux recréer de zero , ben dit nous ce qui te bloque (parce que la reconnaissance de mnémonique c'est pas super compliquée...) , si t'as vraiment aucune idée de comment faire je pense que le projet n'est pas a ta porté.

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je pense que si tu expliques un peu pourquoi tu veux réinventer la roue et comment cela s'intégre dans ton projet, on serait plus à même de t'aider

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    Bonjour à vous,
    en fait, je penses que je vais poster un autre sujet, car c'est pas vraiment ce que j'avais dit que ce qu'on me demande de faire, je viens d'avoir plus de précisions , il faut que je crée un fichier sortie en binaire et non pas qu'il contient des 0 et des 1...

    par exemple, il peut contenir des caractères du genre
    Xu"@ $Pl%€U'€²"˜ "H˜

    Je ne sais pas si quelqu'un sait de quoi je parle, Merci

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 368
    Points : 23 616
    Points
    23 616
    Par défaut
    Bonjour,

    Citation Envoyé par da_latifa Voir le message
    il faut que je crée un fichier sortie en binaire et non pas qu'il contient des 0 et des 1...
    par exemple, il peut contenir des caractères du genre
    Xu"@ $Pl%€U'€²"˜ "H˜
    Je ne sais pas si quelqu'un sait de quoi je parle, Merci
    C'est la même chose : par « 000000 10011 10101 01011 00000 010100 », on entendait la valeur des octets de ton fichier, pris individuellement. Il ne s'agissait pas d'aller écrire le caractère « 0 » ou le caractère « 1 » en particulier.

    Le projet n'est pas très difficile en soi, mais c'est vrai que si tu ne sais pas encore ce qu'est un fichier texte, par exemple, ni comment il est globalement structuré, etc., alors tu commences vraiment de très bas, et il va falloir que tu tires cela au clair avant de te lancer dans la rédaction de ton projet proprement dit.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    Merci Obsidian pour ta réponse rapide,

    je dois absolument travailler ce projet, alors pourrais tu stp me donner des liens pour soit cours, exemple, explication qui pourront m'aider à apprendre le principe de ce genre de fichiers, ça serait vraiment très apprécié, Merci d'avance

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 368
    Points : 23 616
    Points
    23 616
    Par défaut
    Fais une recherche avec « MIPS instruction set » et visite la section 6 de cette page : https://en.wikipedia.org/wiki/MIPS_i...embly_language (nommée « MIPS Assembly Language »).

    Le listing que tu nous a présenté en début de fil est un morceau d'assembleur pour micro-processeur MIPS. L'assembleur est la liste des instructions proposées par un micro-processeur donné, soit les opérations qu'il peut physiquement accomplir. Quand tu programmes en langage machine, tu pilotes en fait directement le composant électronique.

    Tu t'apercevras qu'il s'agit en majorité d'instructions arithmétiques et logiques, comme « add » pour « addition », « sub » pour « substraction », « nor » pour « Not OR » (un NON-OU logique), etc. ou de la manipulation de données (charger une donnée dans un registre, la réécrire ailleurs, etc.). Tous les ordinateurs, aussi sophistiqués soient-ils, fonctionnent à partir d'un jeu d'instructions similaire.

    Évidemment, le micro-processeur n'interprête pas directement les instructions en question, en toutes lettres. Il utilise à la place un code de taille fixe pour chaque opération qu'il est capable d'effectuer. Par exemple « 1 » pour l'addition, « 2 » pour la soustraction, « 3 » pour un ET logique, etc. Ces codes-là ne sont eux-mêmes pas choisis au hasard : ils utilisent une combinaison de bits qui les rendent faciles à implémenter électroniquement. Tu t'apercevras aussi qu'en assembleur, il y a une instruction par ligne, car cette même ligne peut contenir d'autres informations une fois compilée.

    Le lien que je te donne au début de ce message te présente un tableau qui montre comment chaque instruction est codée. Ton travail consiste donc à écrire un programme C qui :
    1. Lise une ligne depuis un fichier passé en paramètre (ou redirigé vers l'entrée standard) ;
    2. Vérifie si cette ligne est syntaxiquement valide (c'est-à-dire : si elle est correctement écrite et si elle correspond à un cas de figure exposé dans le tableau) ;
    3. Soit capable de lire l'instruction et les paramètres qui s'y trouve, de reconnaître le bon cas de figure, et le cas échéant, de construire une valeur binaire qui corresponde à ce qui se trouve à droite du tableau ;
    4. Ajoute ces valeurs binaires à un fichier de sortie ;
    5. Passe à la ligne suivante en retournant à l'étape 1.


    Si tu n'as jamais fait de C, voire n'a jamais fait de programmation du tout, essaie déjà d'écrire un programme qui te permette de lire un fichier texte ligne par ligne et d'afficher celles-ci à l'écran, sans les traiter. Cela se fait avec while(), avec fgets() et avec printf().

    Bon courage.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    Merci beaucoup Obsidian, je vais voir ton lien, je connais un peu le langage C, je programme plus avec VB et un peu en Java... Merci

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    Auriez vous une idée comment je peux utiliser le tableau des numéros des registres MIPS d'une façon plus pratique, c'est à dire trouver pour chaque registre son numéro sans le hard-coder ?? Merci

  18. #18
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par da_latifa Voir le message
    Bonjour,

    Auriez vous une idée comment je peux utiliser le tableau des numéros des registres MIPS d'une façon plus pratique, c'est à dire trouver pour chaque registre son numéro sans le hard-coder ?? Merci
    Bonjour.

    Il me semble que le plus simple et le plus souple aussi est de créer un fichier texte (ou plusieurs selon) dans lequel(s) on codera les traductions des instructions et des registres.

    Par exemple ce fichier pour être de la forme suivante :
    Ainsi pour l'instruction add on sait qu'elle attend 3 données à sa suite et que son opcode et 2016

    Pour les registres on peut continuer d'une manière identique dans une autre fichier ou à la suie du premier :
    Ainsi la correspondance de $v0 sera $2.

    L'avantage d'avoir tout ceci dans un ou plusieurs fichiers textes et de pouvoir modifier les opcodes et les différentes valeurs sans toucher au moteur de traduction.

    J'espère avoir un peu éclairer ta lanterne .

  19. #19
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Si c'est le cas c'est le principe de VASM d’où pourquoi je l'ai proposé (on peut lire le code source) et modifier des fichiers textes pour les opcodes.
    Cela pourrait servir a OP pour s'y inspirer peut être.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut
    ok, Merci

    autre question svp, j'obtienne une chaine de 0 et 1 de 32bits, on me demande de la mettre dans les 32bits d'un int avec shift (<<) , mais quand je fais ça dans mon programme en c, il me donne toujours la valeur 0 ??
    par exemple
    int i=0 ;
    i= i | (0x20 << 26);

    pourquoi il me retourne 0 ?
    est ce que je le fais pas correctement? Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Traduire des instructions Mysql en Access ?
    Par Ishiru dans le forum MySQL
    Réponses: 8
    Dernier message: 24/12/2015, 01h48
  2. [telnet] Exécuter des instructions en cas d'echec
    Par xjinh dans le forum Modules
    Réponses: 3
    Dernier message: 15/11/2005, 17h43
  3. Liste des instructions de la bibl. std c++
    Par BBric dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/10/2004, 00h02
  4. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39
  5. Mesurer le temps des instructions
    Par luckylucke dans le forum Assembleur
    Réponses: 9
    Dernier message: 03/09/2003, 21h23

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