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éer un langage de programmation


Sujet :

Assembleur

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Créer un langage de programmation
    Bonsoir, à tous,
    Si j'ai démarrer cette discussion, c'est pour demander un exemple, juste un exemple, voilà mon problème:
    Je veux donc créer mon langage de programmation, et je veux savoir (un exemple sans commentaire me suffirait):
    Que donnerais un programme assembleur (32 bits / Linux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .global _start #directive
    .text
      mov $0,%eax
    En format objet elf 32 ?

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Et ne me dîtes pas que je n'ai qu'à le compiler moi-même, car tous les docs que j'ai trouver sur le format elf étaient trop flous

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par Michael Douglas Voir le message
    Bonsoir, à tous,
    Si j'ai démarrer cette discussion, c'est pour demander un exemple, juste un exemple, voilà mon problème:
    Je veux donc créer mon langage de programmation, et je veux savoir (un exemple sans commentaire me suffirait):
    Que donnerais un programme assembleur (32 bits / Linux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .global _start #directive
    .text
      mov $0,%eax
    En format objet elf 32 ?
    Ceci :

    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
    26
    27
    28
    29
    30
    0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
    0000010: 0100 0300 0100 0000 0000 0000 0000 0000  ................
    0000020: 6800 0000 0000 0000 3400 0000 0000 2800  h.......4.....(.
    0000030: 0700 0400 b800 0000 0000 0000 002e 7379  ..............sy
    0000040: 6d74 6162 002e 7374 7274 6162 002e 7368  mtab..strtab..sh
    0000050: 7374 7274 6162 002e 7465 7874 002e 6461  strtab..text..da
    0000060: 7461 002e 6273 7300 0000 0000 0000 0000  ta..bss.........
    0000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
    0000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
    0000090: 1b00 0000 0100 0000 0600 0000 0000 0000  ................
    00000a0: 3400 0000 0500 0000 0000 0000 0000 0000  4...............
    00000b0: 0400 0000 0000 0000 2100 0000 0100 0000  ........!.......
    00000c0: 0300 0000 0000 0000 3c00 0000 0000 0000  ........<.......
    00000d0: 0000 0000 0000 0000 0400 0000 0000 0000  ................
    00000e0: 2700 0000 0800 0000 0300 0000 0000 0000  '...............
    00000f0: 3c00 0000 0000 0000 0000 0000 0000 0000  <...............
    0000100: 0400 0000 0000 0000 1100 0000 0300 0000  ................
    0000110: 0000 0000 0000 0000 3c00 0000 2c00 0000  ........<...,...
    0000120: 0000 0000 0000 0000 0100 0000 0000 0000  ................
    0000130: 0100 0000 0200 0000 0000 0000 0000 0000  ................
    0000140: 8001 0000 5000 0000 0600 0000 0400 0000  ....P...........
    0000150: 0400 0000 1000 0000 0900 0000 0300 0000  ................
    0000160: 0000 0000 0000 0000 d001 0000 0800 0000  ................
    0000170: 0000 0000 0000 0000 0100 0000 0000 0000  ................
    0000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
    0000190: 0000 0000 0000 0000 0000 0000 0300 0100  ................
    00001a0: 0000 0000 0000 0000 0000 0000 0300 0200  ................
    00001b0: 0000 0000 0000 0000 0000 0000 0300 0300  ................
    00001c0: 0100 0000 0000 0000 0000 0000 1000 0000  ................
    00001d0: 005f 7374 6172 7400                      ._start.

    Citation Envoyé par Michael Douglas Voir le message
    Et ne me dîtes pas que je n'ai qu'à le compiler moi-même,
    Pourquoi pas ? ELF32 (ou 64) est le format utilisé par défaut par toutes les distributions de Linux. Il te suffit de lancer as --32 tonfichier.asm pour avoir le résultat.

    Qu'est-ce qui t'en empêche ?

    car tous les docs que j'ai trouver sur le format elf étaient trop flous
    C'est une plaisanterie ? C'est par définition l'un des formats les plus ouverts et les plus documentés qui soient. Es-tu sûr d'avoir bien cherché ?

  4. #4
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oui, mais ce que je veux, moi, c'est pouvoir l'intégrer dans mon futur-compilo, donc, il me faut les détails, comme oú sont exactement les opcodes, a quoi servent les '/' oú on met la taille des segments, et surtout, ne me sortez pas man elf ou elf.h, ça ne me servirais a rien. (et si ça pouvait servir dans mon cas, dîtes moi exactement comment faire).

  5. #5
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Cette blague ! comme si c'était aussi simple...

  6. #6
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    À forthman: Si t'as juste ça dire...

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par Michael Douglas Voir le message
    Oui, mais ce que je veux, moi, c'est pouvoir l'intégrer dans mon futur-compilo, donc, il me faut les détails,
    As-tu au moins essayé de saisir « ELF format » dans Google ? Tu obtiens une quantité ahurissante de réponses dans toutes les langues.

    Notamment celle-ci : http://docs.oracle.com/cd/E23824_01/...html#scrolltoc
    Et les pages de Wikipédia en français et en anglais, qui te permettent de rentrer rapidement dedans sans avoir à explorer tous les détails d'un coup.

    Le format ELF est comparable au COFF qui a lui même engendré le PE des exécutables Win32. Ce n'est pas un format simple : il peut embarquer toutes sortes de données, pas seulement du code, et est décomposé en une suite de section et de tables en tous genres.

    comme oú sont exactement les opcodes,
    Le code exécutable se trouve historiquement dans la section « .text » (même si c'est contre-intuitif). Mais il faut plus d'info : l'adresse d'implantation, le point d'entrée, et éventuellement la table des symboles à relocaliser.

    a quoi servent les '/'
    Quels « / » ?

    oú on met la taille des segments, et surtout, ne me sortez pas man elf ou elf.h, ça ne me servirais a rien. (et si ça pouvait servir dans mon cas, dîtes moi exactement comment faire).
    Tu te rends compte que tu veux écrire un langage produisant du code exécutable sans lire une seule man page ni faire une recherche Google ?

    La man page de ELF est pourtant, effectivement, la meilleure source d'informations que tu puisses trouver. Raffinement ultime, tu la trouves ici en français et mise en forme pour le web.

    Si c'est ce qui te pose problème, la syntaxe que tu vois (avec les « { } ») est celle du langage C car son histoire est intimement liée à celle d'UNIX, mais ce n'est pas un problème en soi : « uint32_t » signifie « unsigned int 32 bit type », donc un entier en binaire naturel non signé sur 32 bits (4 octets), typique des formats des registres x86, en particulier.

    Il faut se faire à l'idée, également, qu'à part dans le header principal, il n'y a aucune adresse absolue dans un fichier ELF (pas plus que dans un COFF ou un EXE Win32). Il s'agira à chaque fois d'un offset par rapport au début de la section, elle-même localisée soit relativement aux sections précédentes, soit en fonction de ce qui est indiqué dans une table.

    Au boulot maintenant.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    > On a pas de doc "secret-defense" que d'autres n'ont pas Michael <
    D'ailleurs, tu me fais beaucoup penser à quelqu'un d'autres qui a posé des questions similaires il y a quelques temps.
    Regarde, tu verras qu'on lui a répondu la même chose:
    http://www.developpez.net/forums/sea...archid=9873009
    Et en particulier ce topique pour l'elf:
    http://www.developpez.net/forums/d13...ecutable-unix/

  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 379
    Points
    20 379
    Par défaut
    Citation Envoyé par Michael Douglas Voir le message
    Oui, mais ce que je veux, moi, c'est pouvoir l'intégrer dans mon futur-compilo, donc, il me faut les détails, comme oú sont exactement les opcodes, a quoi servent les '/' oú on met la taille des segments, et surtout, ne me sortez pas man elf ou elf.h, ça ne me servirais a rien. (et si ça pouvait servir dans mon cas, dîtes moi exactement comment faire).
    Les opcodes du CPU ?
    Cela dépend du CPU évidemment ; d'après ce que tu as donné comme code c'est du code Intel donc il faudra décortiquer le jeu d'instruction du x86 .
    A savoir quel code tu vas générer selon que dans le fichier source on trouve mov eax,registre ou mov eax,valeur_immediate.
    Si tu veux créer ton langage de programmation c'est tout un projet qui risque d'être ardu car tu devras d'abord écrire un interpréteur de langage "évolué" genre Basic, Java ou C ou tout ce que tu veux puis générer ce code en code assembleur

  10. #10
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    À obsidian: Je connais dans les grandes lignes le format elf (avec les en-têtes et tout) mais ce que je veux, c'est savoir comment passe de .s a exécutable
    À n5r: AND66 est un compte à moi, mais mon compte Google associé à ce compte s'étant soudainement mît à se vider périodiquement, j'ai jugé bon de recréer un compte mail et aussi de réinitialiser les comptes qui y étaient associés.

  11. #11
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Et je voudrais savoir si je suis le seul (con) à essayer de faire ça de cette manière ou est ce qu'il faut plutôt utiliser ce schéma:
    -créer le programme dans mon langage;
    -le traduire en asm GNU;
    -compiler avec as ou gcc;

    À Obsidian, les slashs dans les fichiers exécutable? T'en as jamais vu (ouvre un fichier exécutable avec gedit ou autre et repose la question, quels '/'.
    Et puis aussi, je sais si tu vois où je veux en venir, mais moi, perso, si je copie-colles ton code, et que je le mets dans un exécutable, je penses pas que ça marche

  12. #12
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Tu es en train de vouloir créer des programmes comme des fichiers *.COM
    à l'époque du DOS quoi...

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par Michael Douglas Voir le message
    À obsidian: Je connais dans les grandes lignes le format elf (avec les en-têtes et tout) mais ce que je veux, c'est savoir comment passe de .s a exécutable
    Ça c'est l'étape d'assemblage. La conversion d'un programme en assembleur vers du code en langage machine et le dépôt de celui-ci dans un fichier sont deux choses distinctes. Tu peux te pencher sur les BFD des binutils de GNU si tu veux savoir comment ces outils s'y prennent, mais puisque ton objectif est d'écrire ton propre compilateur, tu n'en as pas forcément besoin (sauf à vouloir écrire quelque chose de propre et éviter de reproduire les erreurs du passé).

    Le format ELF n'est qu'un container qui te permet de recevoir le code objet produit, ce qui te permet de le manipuler et de le lier au reste. Mais tu aurais tout aussi bien pu compiler ça en « bin » ou « raw », auquel cas tu n'aurais récupéré que les codes opérations correspondant aux instructions du fichier. C'est ce qui se faisait avec les *.com du D.O.S.

    À n5r: AND66 est un compte à moi, mais mon compte Google associé à ce compte s'étant soudainement mît à se vider périodiquement, j'ai jugé bon de recréer un compte mail et aussi de réinitialiser les comptes qui y étaient associés.
    Les règles du forum imposent l'usage d'un compte unique par utilisateur. Nous fusionnerons les deux à l'occasion.

    Citation Envoyé par Michael Douglas Voir le message
    Et je voudrais savoir si je suis le seul (con) à essayer de faire ça de cette manière ou est ce qu'il faut plutôt utiliser ce schéma:
    -créer le programme dans mon langage;
    -le traduire en asm GNU;
    -compiler avec as ou gcc;
    Faire quoi et de quelle façon ? Compiler directement du langage évolué vers le fichier exécutable ?

    Tu en as le droit mais dans le cas de GNU (et d'UNIX en général), il aurait fallu réécrire dans GCC tout le travail déjà abattu pour l'assembleur concernant la génération des fichiers de sortie, écrire directement les code-op plutôt que les mnémoniques ce qui serait revenu exactement au même, il aurait fallu gérer directement les subtilités du style du code 66 sur Intel qui a une signification différente selon les contextes (alors que pour le coup, ça ne concernerait vraiment que l'assembleur) et se priver de la possibilité d'auditer le code généré, voire de l'adapter à la main si nécessaire pour certaines architectures exotiques.

    Alors pourquoi faire ?

    À Obsidian, les slashs dans les fichiers exécutable? T'en as jamais vu (ouvre un fichier exécutable avec gedit ou autre et repose la question, quels '/'.
    Mon garçon, il va falloir que tu changes de ton si tu veux qu'on t'aide à venir à bout de ton problème. Et en ce qui te concerne présentement :

    • Non, des slashes ordinaires, on n'en trouve pas plus dans les exécutables que les autres caractères ;
    • Ouvrir un exécutable — binaire, donc — avec un éditeur de texte est particulièrement stupide, de la part de quelqu'un qui sait comment est construit un programme en langage machine. As-tu essayé avec ghex, par exemple ?
    • Ce que tu vois ne sont pas des « / » mais des « \ » ;
    • Même pour le premier des débutants, il est quand même clair qu'il s'agit des codes hexadécimaux des caractères que ton éditeur ne peut afficher ! Cette syntaxe est de plus utilisée dans pratiquement tous les langages de programmation, y compris en C et en Shell !
    • Tu ne t'es pas rendu compte une seule seconde avant de poster que les chiffres qui suivent ces anti-slashes dans gedit sont exactement les mêmes que ce que je t'ai donnés dans mon commentaire #3 ?


    Et puis aussi, je sais si tu vois où je veux en venir, mais moi, perso, si je copie-colles ton code, et que je le mets dans un exécutable, je penses pas que ça marche
    C'est TON code, gros malin.

    J'ai copié-collé les trois lignes que tu nous as données dans ton post initial et les ai assemblées avec la ligne que je t'ai indiquée ensuite.

    Certes, elles ne suffisent pas à former un exécutable entier mais ça, c'est ta faute. Il n'empêche qu'elles restent parfaitement compilables en elles-mêmes. Le compilateur a généré les codes-opérations correspondants et les a déposés dans un fichier ELF dûment construit. En l'occurrence, ils se trouvent à partir de l'offset 0034h dans ton fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0000030: 0700 0400 b800 0000 0000 0000 002e 7379  ..............sy
    Rassure-moi quand même. Tu as bien compris qu'il s'agissait d'un dump hexadécimal de ton fichier binaire ?

  14. #14
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oui, avec objdump et l'reste... (merci pour l'offset des opcodes)

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Essaie aussi readelf qui donne pas mal d'infos sur la structure d'un fichier ELF donné. Ça avec le reste, tu devrais être capable de tâtonner et de voir facilement ce qui change dans le fichier de sortie quand tu changes un paramètre du fichier source.

    Garde également à l'esprit que l'offset est 0034h dans ce fichier en particulier mais que ce ne sera pas forcément toujours le cas. Ça dépend des autres sections et de leur taille.

    Utilise également xxd depuis la ligne de commande pour obtenir le dump hexadécimal de n'importe quel fichier.

    Bon courage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un langage de programmation
    Par conagui dans le forum Assembleur
    Réponses: 12
    Dernier message: 17/02/2015, 00h44
  2. Comment créer un langage de programmation?
    Par Terfas dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 06/01/2015, 10h53
  3. Comment créer un langage de programmation ?
    Par @v@lon dans le forum Langages de programmation
    Réponses: 27
    Dernier message: 16/06/2014, 22h04
  4. Je souhaite créer un langage de programmation
    Par Tijl12 dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 20/05/2014, 22h32
  5. Créer un langage de programmation pour ensuite interpréter du PHP
    Par psgkiki dans le forum Langages de programmation
    Réponses: 12
    Dernier message: 25/06/2008, 10h08

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