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. #21
    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
    Citation Envoyé par da_latifa Voir le message
    j'obtienne une chaine de 0 et 1 de 32bits,
    Je trouve la formulation étrange c'est comme si je disais "j’obtiens une chaine de 0 à 9" , ça s'appelle un nombre
    Et dans ton cas c'est un nombre (binaire) , sauf si tu parle de chaine de caractère ?


    Tu as fait quel vérification ?
    Parce que je viens de tester a l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int i=0 ;
    i= i | (0x20 << 26);
     
    printf("%x\n",i);
     
    // résultat : 80000000
    Testé sur un processeur MIPS en plus :p
    (le int fait 4 octet)

  2. #22
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    0x20 est un le nombre binaire 0100 0000 (chaque caractère hexadécimal correspond à un entier à 4 bits).
    le décalage de 26 bits donne:
    0100 0000 suivi de 0000 0000 0000 0000 0000 0000 00
    et un nombre 32 bits n'a que 32 bits, c'est à dire les 32 "0" de valeur faible. C'est parfaitement normale d'obtenir 0.
    (32 = 26 + 6, et 0x20 a ses six premiers bits nuls)
    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. #23
    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
    Citation Envoyé par ternel Voir le message
    0x20 est un le nombre binaire 0100 0000 (chaque caractère hexadécimal correspond à un entier à 4 bits).
    Hmm... 0x20, ce n'est pas 0010 0000?

  4. #24
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    si.
    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. #25
    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
    Citation Envoyé par ternel Voir le message
    si.
    Ok , c' est ce que je pensais ;-)

    Donc 0x20 << 26 est acceptable dans un nombre à 32 bits. Du coup, montre nous un code complet où tu vois que cela te donne quand même un 0. Il y a quelque chose d'autre qui se passe ;-)

  6. #26
    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 ça donne 0x80000000 x)

    Je vois pas pourquoi on doute autant de mon résultat
    Donnait par mon ordinateur en plus

  7. #27
    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
    Citation Envoyé par Kannagi Voir le message
    En gros ça donne 0x80000000 x)

    Je vois pas pourquoi on doute autant de mon résultat
    Donnait par mon ordinateur en plus
    J'avais fait le même test sur le mien . Mais c'est à cause du résultat que je me demande pourquoi da_latifa obtient 0

  8. #28
    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
    oui vous avez raison, j'avais fait une erreur, mais là ça fonctionne, Merci beaucoup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    donc si j'ai l'instruction suivante:
     
    sub $t0,$zero,$t2
     
    selon le tableau 
    		opcode rs  rt  rd  shamt  funct
    		0x00   0   10  8   0x00   0x22 
    décalage	26     21  16  11   6      0
     
    en faisant le décalage de tout ça, j'aurais
     
    0
    0
    a0000
    4000
    0
    22
     
    comment je fais pour avoir un résultat de 4 octets seulement avec ces nombres obtenus?

    Merci à vous

  9. #29
    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
    C'est une question de décalages et masques en fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int instruction = ((opcode & 0x3F) << 25) | ((rs & 0x1F) << 20) | ((rt &0x1F) <<  15) | ((rd & 0x1F) <<< 10) | ((shamt & 0x3F) << 5) | (funct & 0x3F);
    Il faudrait vérifier mes décalages et mes masques, je fais cela dans le bus

    Jc

  10. #30
    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 pour ta réponse rapide,

    pourrais tu juste m'expliquer

    1) pourquoi tu as fait 25 au lieu de 26 et 20 au lieu de 21 ....

    2) les 0x3F et 0x1F pour quelle raison

    3) je penses que pour le shamt , c'est 0x1F au lieu de 0x3F puisuqe c'est sur 5bits, même c'est pas clair pour moi pourquoi tu l'as fait

    Merci beaucoup

  11. #31
    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
    J'ai fait cela trop vite

    Quand j'ai regardé la page:
    https://www.d.umn.edu/~gshute/mips/i...n-coding.xhtml

    J'ai vu le nombre de bits pour chaque partie:
    opcode: 6 bits
    rs: 5 bits
    rt: 5 bits
    rd: 5 bits
    shamt: 5 bits
    funct: 6 bits

    - Pour 6 bits, ce sera donc 0x3F et 0x1F pour 5 bits (donc oui pour shamt c'est 0x1F ).
    - Ensuite c'est une question de décalage. Prenons le cas de shamt qui commence en fait au 6ème bit et va jusqu'au 10ème.

    Du coup, pour arriver au 6ème bit, si tu voulais mettre juste un 1 au bit de poids faible. Tu vas vouloir avoir:
    1 000000 et donc ce serait 1 << 6 (et non le 5 que j'avais mis).

    Donc, tu as raison, la bonne opération serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int instruction = ((opcode & 0x3F) << 26) | ((rs & 0x1F) << 21) | ((rt &0x1F) <<  16) | ((rd & 0x1F) <<< 11) | ((shamt & 0x1F) << 6) | (funct & 0x3F);

  12. #32
    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
    Parfait

    donc juste pour être sûre, les variables opcode , rs ... que tu as mis dans l'orépration est ce que ce sont les variables
    que j'ai obtenues en haut avec le 1er décalage fait ? (et qui m'a donné 0, 0, a0000, 4000, 0, 22) ?

    Merci

  13. #33
    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
    Exactement, je te conseille de faire des petites fonctions qui tu font cela via des paramètres. Ce sera plus facile à gérer après

  14. #34
    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, puisque je vais lire des instructions mips différents, et que je ne sais pas si il va s,agir de add ou sub ou lw ou lb ....., je dois faire le traitement pour toutes les opérations
    et donc j'ai pensé à faire une boucle de ce genre, pour traiter tous les registres , il ne faut pas oublier que je suis débutante en C
    s1 contient l'opération et s2 contient la liste de tous ses registres , j'avoue que je suis un peu perdue sur le comment les extraire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
     if (strcmp(s1, "add")==0){
    		   opcode = opcode | (0x00<<21);
    		   shamt= 0x00;
    		   funct=0x20;
    }
     
    for (k=0 ; s2[k] != ' '; k++){
    			{
    			a= a + s2[k];
     
    			if (strcmp(s2[k], ',')==0){
     
    				k=k+1;
     
    				if (a== "$t3"){
    		  			 instruction = instruction | (11<<20);
    				}else if (a== "$s3"){
    		  			 instruction = instruction | (19<<15);
    				}else if (a== "$s5"){
    		  			 instruction = instruction | (21<<10);					
    				}
    			}
    		}

  15. #35
    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
    Tu peux effectivement faire comme ca mais ton code va être long, pas forcément très facile à lire et les instructions mips seront codées en dure (dans le code source donc non modifiable par un utilisateur lambda).

    Si je peux me permettre, même si tu es débutante en C, regarde le principe des tables de HASH. Ca te permettra d'avoir un code bien plus simple. Tes tables pourront être remplies via des fichiers textes qui eux contiendront les instructions/registres mips. Il sera alors simple d'en modifier les informations.


  16. #36
    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
    Citation Envoyé par fearyourself Voir le message
    J'ai fait cela trop vite

    Quand j'ai regardé la page:
    https://www.d.umn.edu/~gshute/mips/i...n-coding.xhtml

    J'ai vu le nombre de bits pour chaque partie:
    opcode: 6 bits
    rs: 5 bits
    rt: 5 bits
    rd: 5 bits
    shamt: 5 bits
    funct: 6 bits

    - Pour 6 bits, ce sera donc 0x3F et 0x1F pour 5 bits (donc oui pour shamt c'est 0x1F ).
    - Ensuite c'est une question de décalage. Prenons le cas de shamt qui commence en fait au 6ème bit et va jusqu'au 10ème.

    Du coup, pour arriver au 6ème bit, si tu voulais mettre juste un 1 au bit de poids faible. Tu vas vouloir avoir:
    1 000000 et donc ce serait 1 << 6 (et non le 5 que j'avais mis).

    Donc, tu as raison, la bonne opération serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int instruction = ((opcode & 0x3F) << 26) | ((rs & 0x1F) << 21) | ((rt &0x1F) <<  16) | ((rd & 0x1F) <<< 11) | ((shamt & 0x1F) << 6) | (funct & 0x3F);

    Bonjour fearyourself,

    J'imagine que quand j'ai une valeur immédiate qui est sur 16bits je doits utiliser 0xFFFF et pour 26bits mettre 0x3FFFFFF c'est bien ça ???? Merci d'avance

    Citation Envoyé par gerald3d Voir le message
    Tu peux effectivement faire comme ca mais ton code va être long, pas forcément très facile à lire et les instructions mips seront codées en dure (dans le code source donc non modifiable par un utilisateur lambda).

    Si je peux me permettre, même si tu es débutante en C, regarde le principe des tables de HASH. Ca te permettra d'avoir un code bien plus simple. Tes tables pourront être remplies via des fichiers textes qui eux contiendront les instructions/registres mips. Il sera alors simple d'en modifier les informations.


    Bonjour gerald3d ,

    Merci pour ta réponse, oui j'ai pensé à l'utilisation d'une fonction avec paramètre et qui me retourne le bon numéro de registre, je ne sais pas si c'est faisable en C, comme je suis débutante et en plus j'ai pas assez de temps car je dois rendre ce projet ce lundi qui s'en vient

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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