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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2015
    Messages : 21
    Points : 21
    Points
    21

    Par défaut Du langage assembleur vers un binaire en hexadécimal

    Bonjour, pour un projet, je dois assembler un fichier en langage assembleur afin de créer un binaire constituer de valeurs hexadécimales qui sera exécuté dans un machine virtuelle. Malgré mes recherches sur internet et différents forum, je reste confus sur la méthode a adoptée. J'ai cru comprendre que la transcription était différente selon l'architecture des processeurs mais je n'ai rien a appris de concret.
    Pourriez-vous m'éclairer ?
    Merci.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    10 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 10 604
    Points : 23 662
    Points
    23 662

    Par défaut

    Il te faut un assembleur.

    Celui-ci va transformer ton source assembleur qui n'est qu'un fichier texte en fichier binaire.

    En général, chaque assembleur fonctionne pour une architecture processeur précise. (exemple Intel x86, ARM, MIPS, etc.).

    Qu'appeles-tu machine virtuelle ? un système complet virtualisé dans un hyperviseur ou une machine virtuelle dans le sens machine vituelle Java ?

    Si c'est le deuxième cas, ton assembleur doit être capable de générer un binaire à destination de la machine virtuelle utilisée. Vu que tu es étudiant, c'est un exercice ? Dois-tu créer la machine virtuelle ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2015
    Messages : 21
    Points : 21
    Points
    21

    Par défaut

    Oui je dois créer la machine virtuelle qui doit être une machine capable de faire tourner plusieurs programmes avec un nombre de registres prédéfinis.
    De plus, c'est a moi de créér l'assembleur et c'est là que je bloque car je ne comprends pas comment "traduire" un fichier en langage assembleur en fichier avec des valeurs hexadécimales.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2015
    Messages : 21
    Points : 21
    Points
    21

    Par défaut

    Je précise que j'ai à disposition une table de conversion. Par exemple "add" vaut 0x07 et "or" vaut 0x09

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

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 587
    Points : 7 897
    Points
    7 897

    Par défaut

    On ne traduit pas en hexadécimal , l’hexadécimal c'est juste une représentation d'un nombre , le nombre 42 tu peux l'écrire 42 ou quarante deux ,0x2A ou 101010b.
    Parce que quand je comprend convertir en hexadécimal , je comprend que tu vas écrire pour 0x2A , 0 puis x puis 2 et ensuite A , ce qui n'est pas demandé je pense

    Sinon un cpu ne comprend que le langage machine , ça veut dire une suite d'opcode qui exécute des choses très simple (lire ,écrire additionner etc etc).

    Dans ton exemple 0x07 ou 7 ou 0000 0111b quand tu tombera sur ce nombre ça veut dire que tu devra faire une addition.

    Pour la traduction d'un texte ,ben il faudra parser , donc faire un code qui puisse récupérer les mnémoniques + argument et faire un fputc(0x07,file); quand tu tombera sur un add (je met 0x07 mais tu pourrais écrire 7 tout court en décimal c'est pareil :p ).
    Et pour ton émulateur inversement tu fera un "if(opcode == 0x07)" , pour savoir si tu dois faire une addition (d'un registre ou de la mémoire).

  6. #6
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 587
    Points : 7 897
    Points
    7 897

    Par défaut

    Ben en quelque ligne impossible de te l'expliquer , je te l'ai dit plus haut tu dois créer un programmer qui parse ton code et qui récupère les mnémoniques + arguments
    Quand tu aura ça , ben ça sera facile de traduire en une suite d'opcode compréhensible , si tu le fait en C ça donnerai un truc dans le genre :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(strcmp(str_opcode,"ADD") == 0)
    {
         //du code
         fputc(0x07,file);
         //d autre fputc pour les arguments
    }
    Mais normalement , on va pas gaspiller un octet en entier pour indiquer un add ou mov etc etc , il y'aura quelque bits réservé pour les registres /autre :p

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2015
    Messages : 21
    Points : 21
    Points
    21

    Par défaut

    Oui je n'avais pas vu la dernière partie de ton message ducoup j'ai supprimer le miens désolé. Je vais voir plus en profondeur ce que tu m'a expliqué merci beaucoup.

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    10 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 10 604
    Points : 23 662
    Points
    23 662

    Par défaut

    Mais normalement , on va pas gaspiller un octet en entier pour indiquer un add ou mov etc etc , il y'aura quelque bits réservé pour les registres /autre :p
    Pour une machine virtuelle de type Java, je pense qu'il peut utiliser des octets entiers.

    En assembleur, pour remplacer une instruction de type mov ax,[variable] qui va charger le contenu de l'adresse variable dans le registre ax, l’assembleur va non seulement devoir remplacer l'instruction mov ax,... par le bon mnémonique, mais aussi remplacer [variable] par une adresse mémoire qu'il devra calculer par rapport au reste du code généré. Comme celui-ci connait le nombre d'octets utilisé par chaque instruction, il peut le faire. Et avant ceci, comme l'a évoqué Kaganni, il devra y avoir une vérification syntaxique et lexicale. Mais ça ne t'ai pas forcément demandé dans ton exercice.

    pour créer une machine virtuelle, tu devras faire plus ou moins la même chose, à l’exception prêt que pour les variables, les mvvont plutôt utiliser une table de correspondance, ton code contenant l'offset de cette table, la table contenant les adresses des variables. Après, il existe des machines virtuelles à pile ou à registre.

    Tu peux regarder la structure d'une classe Java.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Assembleur vers langage C
    Par benjaminadv dans le forum Autres architectures
    Réponses: 12
    Dernier message: 28/05/2015, 07h25
  2. Langage C vers Assembleur pile
    Par bobthebob dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 09/10/2013, 22h31
  3. Coder en langage Assembleur
    Par sone47 dans le forum Assembleur
    Réponses: 7
    Dernier message: 23/05/2007, 00h18
  4. [langage] opérateur d'affectation binaires
    Par biglebowski13 dans le forum Langage
    Réponses: 6
    Dernier message: 21/11/2006, 09h51
  5. Un logiciel qui traduit les langages évolués vers l'asm
    Par Cygnus Saint dans le forum Assembleur
    Réponses: 6
    Dernier message: 13/06/2005, 09h02

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