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

Assembleur Discussion :

Création d'un assembleur


Sujet :

Assembleur

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 263
    Points
    263
    Par défaut Création d'un assembleur
    Bonjour, je suis debutant en assembleur. Mon projet [de l'ecole] est de creer un assembleur qui va interpreter mon code assembleur et le traduire en hexadecimal qui sera interpreter par une machine virtuelle.

    J'ai par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    l2:
             sti    r1,%:live, %1
             and  r1,%0, r1
    live:    live %1
             zjmp %:live
    Mon parseur doit trouver combien d'octet il ya entre par exemple le :live et son label :live. Mais je sais pas du tout comment faire.
    Quelqu'un aurait une idee ?

    ps : j'ai un clavier qwerty, donc je ne peux pas faire d'accent

  2. #2
    Membre actif Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Points : 224
    Points
    224
    Par défaut
    Tu n'a pas vraiment d'autre choix que de prendre toutes les instruction entre celle qui t'intéresse et le label et de calculer leur taille. Cela dépend tellement du processeur qu'on ne peux pas être plus précis.
    Par exemple, si les instructions de ton processeur font toutes disons 4 octets et qu'il y a 10 instructions entre l'instruction où apparait :live et le label live et bien cela fait 40 octets.
    Mais une petite question me vient à l'esprit: pourquoi faire cela dans le parseur ? Je dis cela car manifestement ce n'est pas son but à moins que tu n'es utilisé ce terme pour désigner ton projet en général.
    Enfin je dirais qu'il a manifestement une imprécision dans ce que tu dis car tu veux le nombre d'octets entre :live et le label live mais :live n'est qu'un bout d'une instruction donc à partir d'où est-ce que l'on commence à compter ??

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 263
    Points
    263
    Par défaut
    J'ai avance un peu. En fait c'est pas un pearseur, mais un scanner plutot.
    Donc je scanne les fichier assembleur, et je range les label, instructions et autres dans un liste chainee.

    Le probleme vien maintenant d'une fonction encode() que je dois faire, elle a pour but de transformer chaque elements en hexadecimal. Certains element je sais sur combien d'octet ils sont codes, mais certains non !

    J'espere que vous comprenez le probleme, je n'utilise peut etre pas les bons termes...

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par jayfaze Voir le message
    J'ai avance un peu. En fait c'est pas un pearseur, mais un scanner plutot.
    Donc je scanne les fichier assembleur, et je range les label, instructions et autres dans un liste chainee.

    Le probleme vien maintenant d'une fonction encode() que je dois faire, elle a pour but de transformer chaque elements en hexadecimal. Certains element je sais sur combien d'octet ils sont codes, mais certains non !

    J'espere que vous comprenez le probleme, je n'utilise peut etre pas les bons termes...
    Il faut toi même définir ton jeu d'instruction et utiliser - par exemple - le système du code d'opération expansif.

    Ainsi, certaines instructions n'ont pas de d'arguments (instruction niladique), certaines en ont un seul (nonadique), deux (diadique), trois (triadique) etc.

    Suivant le nombres d'arguments, on codera différemment les instructions.

    A l'intérieur de ces groupes, il faudra créer des sous-groupe, par exemple, un sous groupe pour le mode d'adressage, un pour la taille des valeurs immédiates, etc.

    C'est tout de même un sacré boulot d'écrire un assembleur, vous n'avez eu aucun cours sur le domaine de la compilation ?

    [edit]

    J'ai trouvé cette page qui explique bien le principe du codage d'instruction :

    http://marpix1.in2p3.fr/calo/my-web/...ap7/page8.html

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 263
    Points
    263
    Par défaut
    Ok merci, je regarde ton lien !
    Ben je sais pas si tu connais Epitech, mais on a pas de cours, on a un mois pour coder un assembleur, une machine virtuelle qui va interpreter le code genere par l'assembleur, et un petit jeu sur la machine virtuelle ! Et pendant ce temps, on doit aussi faire plusieurs mini projet dont en C, un minishell, un minitchat et un my_printf, qui seront a rendre pour cette semaine.

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par jayfaze Voir le message
    Ok merci, je regarde ton lien !
    on a un mois pour coder un assembleur, une machine virtuelle qui va interpreter le code genere par l'assembleur, et un petit jeu sur la machine virtuelle !
    question : le programme qui interprête les codes d'instructions est-il à développer en C ou dans un assembleur lui-même ( TASM, MASM ,NASM ???)
    Si tu dois le faire en C c'est relativement aisé, il faut créer des "hash-tables".
    Selon la mnémonique que tu interpretes tu regardes dans une table de chaines de caractères et en fonction de cela tu donnes un code assembleur.
    Par exemple NOP ( NO OPERATION ) du 8086 c'est 96h en hexa ou CALL c'est cdh si je ne me trompe donc tu fais une table de mnémonique tu regardes dans cette table si tu trouves NOP , CALL ou MOV AX, et tu retournes un code...
    Après si c'est une opération d'affectation d'un registre par exemple, tu écris le code pour l'instruction d'affectation exemple LOAD = 10h suivi de la valeur big endian ou non...
    En C++ cela est encore plus facilité parce que tu as des conteneurs tout faits pour les hash-tables.

    Pour compter les octets tout dépend de la codification des instructions comme le dit Neitsa ;
    en 8086 il y en a qui prennent 1 ,2 ou 3 octets voire plus ( comme le doc donné en lien par Neitsa ) il faut gérer une sorte de pointeur d'instruction

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 263
    Points
    263
    Par défaut
    La VM sera en C ! Merci ppur les infos, des que je commence la VM je chercherais des infos sur les hash tables

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Foe,
    Citation Envoyé par jayfaze Voir le message
    Ok merci, je regarde ton lien !
    Ben je sais pas si tu connais Epitech, mais on a pas de cours, on a un mois pour coder un assembleur, une machine virtuelle qui va interpreter le code genere par l'assembleur, et un petit jeu sur la machine virtuelle ! Et pendant ce temps, on doit aussi faire plusieurs mini projet dont en C, un minishell, un minitchat et un my_printf, qui seront a rendre pour cette semaine.
    Les journées durent 2 semaines ?

    Même en étant déjà assez confirmé en programmation, ça me paraît très court pour faire tout ça.
    Alors, vu que tu sembles être un peu perdu ...
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par jayfaze Voir le message
    La VM sera en C ! Merci ppur les infos, des que je commence la VM je chercherais des infos sur les hash tables
    A ce moment-là ce ne sera pas trop difficile mais demandera un peu de travail

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 263
    Points
    263
    Par défaut
    Ben on est 5 sur le sujet, mais on jamais fait d'assembleur ! Au pire on chope 0, c'est pas important, mais moi je veux au moins comprendre comment ça fonctionne l'assembleur et le langage d'assemblage.

    J'ai réussi a mettre ça dans une liste chaine !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sti r1,%:live,%1
    and r1,%0,r1
    live: live %1
    zjmp %:live
    Maintenant il me faut l'encoder pour donner ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # 0x0b,0x68,0x01,0x00,0x0f,0x00,0x01
    # 0x06,0x64,0x01,0x00,0x00,0x00,0x00,0x01
    # 0x01,0x00,0x00,0x00,0x01
    # 0x09,0xff,0xfb
    C'est la que je coince ! Je ne suis pas sûre de bien comprendre le sujet :
    Je l'ai mis en piece jointe !
    Fichiers attachés Fichiers attachés

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    eh bien par exemple d'après ce qui est donné en doc tu vois que sti correspond à 0x0b.
    Après il faut coder l'expression du registre r1: mais c'est là ou je ne pige pas trop moi non plus parce que c'est un peu confus...
    il faut coder le registre + les expressions suivantes selon les regles suivantes
    01 Registre, Suivie d'un octet (le numéro de registre)
    10 Direct, Suivie de DIR_SIZE octets (la valeur directement)
    11 Indirect, Suivie de IND_SIZE octets (la valeur de l'indirection)
    ce que je ne comprends pas c'est comment il obtient 0x78 dans cette expression-là
    r2,23,%34 Donnera un octet de codage 01 11 10 00 soit 0x78


    Une piste : aller sur le site de Intel prendre tous les PDF sur les instructions du i8086 et sous debug du dos taper par exemple mov ax,10 , cmp ax,10 et voir le code généré par debug et comment debug a codé ces instructions ( comparer avec les tables fournies par Intel )

  12. #12
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Rassure-moi, tu ne dois pas faire la mchine virtuelle toi-même ? Vous avez vu le codage des instructions de la machine cible au cours ?

    Citation Envoyé par Mat.M Voir le message
    ce que je ne comprends pas c'est comment il obtient 0x78 dans cette expression-là
    Quand il y a plusieurs possibilités de paramètres pour un opcode un octet suit avec deux bits pour chaque paramètre (les bits restants sont mis à zéro). D'après ce que j'ai compris le direct c'est quand on utilise une valeur immédiate avec un % (enfin DIRECT_CHAR) comme dans mov eax, 5 et l'indirect c'est la même chose que quand on utilise [] pour faire de l'adressage (mais dans leur format on ne peut pas adresser à partir d'un registre apparemment).
    :wq

  13. #13
    Membre éprouvé

    Homme Profil pro
    Ingénieur logiciel embarqué
    Inscrit en
    Juillet 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2002
    Messages : 386
    Points : 1 164
    Points
    1 164
    Par défaut
    bonsoir,

    j'ai parcourru rapidement le sujet et si j'ai bien compris, tu doit generer du code pour ta propre machine virtuelle et non pour un processeur reel.

    a partir de la, toutes les infos sur les interfaces sont dans le sujet: ton assembleur depend directement de ta vm.

    toujours si j'ai bien compris, le code :
    0x0b,0x68,0x01,0x00,0x0f,0x00,... est en fait le code hexadecimal corespondant au binaire a executer avec ta vm
    tu doit donc coder le code opperation (sti, and,...) en hexa (avec une table de correspondance) et les parametres. Le tout en accord avec la machine virtuelle.

    bref j'espere ne pas avoir embrouiller un peu plus l'affaire


    bon courrage

Discussions similaires

  1. Explication d'un code assembleur et création d'un module du noyau
    Par thoron67 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 29/04/2011, 15h53
  2. Création d'un assembleur
    Par manio dans le forum Autres architectures
    Réponses: 0
    Dernier message: 10/03/2009, 14h37
  3. Réponses: 5
    Dernier message: 08/03/2006, 22h37
  4. ecrire son OS (assembleur ??)
    Par Anonymous dans le forum Programmation d'OS
    Réponses: 9
    Dernier message: 25/11/2002, 19h25

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