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 :

Hello world avec GAS sous mingw


Sujet :

Assembleur

  1. #1
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut Hello world avec GAS sous mingw
    Bonjour !

    j essaye d'assembler un hello world trouve ici http://www.tldp.org/HOWTO/Assembly-HOWTO/hello.html
    je suis la procédure a la lettre (page suivante du tuto, Building an executable)

    L exécutable est créé, mais quand je le lance ca plante (fenêtre "hello a rencontre un probleme et doit fermer...).

    Cela plante peut être car je suis sous Windows avec MinGW pour utiliser GCC et as et que les interruptions ne sont donc plus bonne ?
    Avez vous une solution ou un autre code ?
    all your base are belong to us.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par TheDrev Voir le message
    Cela plante peut être car je suis sous Windows avec MinGW pour utiliser GCC et as et que les interruptions ne sont donc plus bonne ?
    Avez vous une solution ou un autre code ?
    Extrait de l'exemple en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           mov	ebx,0	;first syscall argument: exit code
           mov     eax,1   ;system call number (sys_exit)
           int     0x80	;call kernel
    Le code assembleur en question appelle directement le noyau. Donc, si tu ne travailles pas sous Linux, ce morceau de code-là ne pourra pas fonctionner.

  3. #3
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    C'est ce que je pensais... je suis débutant en assembleur (je viens du C/C++).
    - Que dois je faire quand je développe sous Windows ? existe il d'autres tables d'interuption (spécifique a DOS et/ou NT ? ).
    -J imagine que le code ne pourra pas etre portable si j utilise les interuptions.
    - J'ai essaye d'autres méthodes comme passer par du C mais je trouve ca plus lourd a mettre en place que les interruptions, y a t il d autres voie ?

    J ai trouve de la doc, je doit utiliser l interupt 21,2 pour afficher tu texte... mais je doit traduire la syntaxe intel en syntaxe AT&T, il doit etre plus courant d utiliser la syntaxe intel pour programmer sous DOS/NT ?
    all your base are belong to us.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par TheDrev Voir le message
    C'est ce que je pensais... je suis débutant en assembleur (je viens du C/C++).
    - Que dois je faire quand je développe sous Windows ? existe il d'autres tables d'interuption (spécifique a DOS et/ou NT ? ).
    -J imagine que le code ne pourra pas etre portable si j utilise les interuptions.
    - J'ai essaye d'autres méthodes comme passer par du C mais je trouve ca plus lourd a mettre en place que les interruptions, y a t il d autres voie ?

    J ai trouve de la doc, je doit utiliser l interupt 21,2 pour afficher tu texte... mais je doit traduire la syntaxe intel en syntaxe AT&T, il doit etre plus courant d utiliser la syntaxe intel pour programmer sous DOS/NT ?
    Tu peux utiliser les directives

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    asm (".intel_syntax noprefix");//passage en syntaxe intel
    asm (".att_syntax noprefix");//passage en syntaxe at & t
    si tu veux faire de l'inline à la mode Intel sous GCC (je ne m'en prive pas).

    Ensuite, les interruptions en soi ne sont pas des appels systèmes. Elles sont utilisées en tant que telles parce que c'est le moyen le plus conçis d'appeler une même routine, étant donné qu'elles sont invoquées très fréquemment. Elles sont d'autres part un moyen simple pour le programmeur de franchir la barrière entre segment privilégiés et non-privilégiés (typiquement, le passage en mode noyau sous Linux) lorsque tu tournes en mode protégé (soit pour ainsi dire tout le temps depuis le milieu des années 90).

    Enfin, il est assez rare que tu fasses appel en temps normal aux appels système directement. La plupart du temps, tu t'appuieras sur les bibliothèques, fussent-elles standard ou non, proposées par le système. Généralement écrites en C, tu passes habituellement les arguments dans la pile et tu appelles la fonction avec un simple call, puisque la routine concernée se trouve dans l'espace de ton programme.

    Essaie de faire un printf("Bonjour") en C et de compiler avec l'option -S sous GCC. Tu obtiendras le source assembleur de l'exécutable produit et tu verras ainsi comme il fonctionne.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Tu peux utiliser les directives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    asm (".intel_syntax noprefix");//passage en syntaxe intel
    asm (".att_syntax noprefix");//passage en syntaxe at & t
    si tu veux faire de l'inline à la mode Intel sous GCC (je ne m'en prive pas).

    Merci pour l'astuce Obsidian !!! Je ne connaissais pas l'existence de cette directive. Si j'avais su...
    Bon, allez, je vais retourner me coucher en me répétant mentalement : rtfm, rtfm, rtfm...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par milouz123 Voir le message

    Merci pour l'astuce Obsidian !!! Je ne connaissais pas l'existence de cette directive. Si j'avais su...
    Bon, allez, je vais retourner me coucher en me répétant mentalement : rtfm, rtfm, rtfm...
    Ben, pour être tout-à-fait honnête, c'est ici que j'ai dû la découvrir aussi :-) Sinon, tu peux utiliser NASM aussi ...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Points : 170
    Points
    170
    Par défaut
    Oui, mais pour utiliser inline dans gcc, je ne pense pas qu'on puisse... ou alors j'ai encore loupé quelque chose

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par milouz123 Voir le message
    Oui, mais pour utiliser inline dans gcc, je ne pense pas qu'on puisse... ou alors j'ai encore loupé quelque chose
    « inline », ça veut dire « inséré entre les lignes ». C'est un adjectif. Donc, selon le contexte, c'est soit de l'assembleur au milieu du code en C, soit une fonction directement insérée au milieu du reste plutôt qu'appelée avec un saut vers son emplacement.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Points : 170
    Points
    170
    Par défaut
    Oui, euh.... pourquoi cette précision ?

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par milouz123 Voir le message
    Oui, euh.... pourquoi cette précision ?
    Parce qu'au vu de ton post #7, il me semblait que tu confondais les deux cas de figure. En matière d'assembleur, donc, oui : on peut faire de l'asm inline dans GCC.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Points : 170
    Points
    170
    Par défaut
    D'accord, je crois que je comprends mieux le quiproquo.

  12. #12
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    Re,

    J'apprend toujours et j ai compris mon erreur avec les interruptions

    J essaye d'afficher un hello world avec nasm et alink,

    le code asm est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    global start
     
    section .text
    start:
    mov edx,msg
    mov ah,9
    int 21h
     mov ah,4Ch
     int 21h
     
    section .data
    msg db 'hello', '$'
    Je fait
    nasm -f coff first.asm
    alink first.o -o first.exe

    ALINK v1.6 (C) Copyright 1998-9 Anthony A.J. Williams.
    All Rights Reserved

    Loading file first.o
    matched Externs
    matched ComDefs
    Warning, no entry point specified
    Warning - no stack

    first.exe me donne un bip suivit de :

    ▬♦V☺▬♦▬♦☺☺☺ ☻***************?♣Þ*(¶ ↑ ↑**** ♣ ═!╦
    ║► ┤ ═!┤L═! hello

    Qu es ce qui ne va pas avec ce code ou mon assembleur, linkeur ? C'est peut être en rapport avec les warning du linker...
    all your base are belong to us.

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par TheDrev Voir le message
    first.exe me donne un bip suivit de :

    ▬♦V☺▬♦▬♦☺☺☺ ☻***************?♣Þ*(¶ ↑ ↑**** ♣ ═!╦
    ║► ┤ ═!┤L═! hello

    Qu es ce qui ne va pas avec ce code ou mon assembleur, linkeur ? C'est peut être en rapport avec les warning du linker...
    Apparement, l'interruption commence à lire ton texte en mémoire bien avant l'emplacement où il débute réellement. Vérifie que ton segment de données débute bien au bon endroit.

  14. #14
    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
    Ça marchera peut-être mieux en disant à NASM de générer du code 16 bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BITS 16
     
    global start
     
    section .text
    start:
    mov edx,msg
    mov ah,9
    int 21h
     mov ah,4Ch
     int 21h
     
    section .data
    msg db 'hello', '$'
    Il y a un très bon tutoriel qui explique comment faire de l'assembleur "moderne" ici : http://beuss.developpez.com/tutoriels/pcasm/
    :wq

Discussions similaires

  1. Hello world avec MASM32
    Par Menontona dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 24/02/2010, 18h30
  2. [Visual Web] Mon premier Hello world avec netbeans
    Par programaniac dans le forum NetBeans
    Réponses: 10
    Dernier message: 09/04/2009, 06h24
  3. compilation avec gcc sous MinGW
    Par mackla dans le forum MinGW
    Réponses: 0
    Dernier message: 09/11/2008, 10h34
  4. compiler un hello world avec cl
    Par elekis dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/03/2008, 07h40
  5. Hello world avec JCreator
    Par skunkies dans le forum Environnement de Développement Intégré (EDI)
    Réponses: 4
    Dernier message: 22/09/2006, 12h54

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