+ Répondre à la discussion Actualité déjà publiée
  1. #1
    Responsable Pascal, Delphi et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    7 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 7 354
    Points : 51 496
    Points
    51 496
    Billets dans le blog
    2

    Par défaut Introduction à l'Assembleur GNU sous un système GNU/Linux sur Intel 80386, par Issam Abdallah

    Introduction à l'Assembleur GNU
    Sous un système GNU/Linux sur Intel 80386

    L'assembleur est un langage dit bas niveau, c'est-à-dire qu'il est très proche du langage machine.
    Autrement dit, pour programmer en assembleur vous devez :
    • apprendre une architecture : Intel par exemple ;
    • avoir quelques connaissances basiques sur les systèmes d'exploitation : Linux par exemple ;
    • maîtriser un assembleur : l'assembleur GNU par exemple.

    Apprendre une architecture, c'est comprendre le fonctionnement d'un processeur : les registres, l'adressage et l'organisation de la mémoire, les interruptions… et tout ce que vous avez appris dans le cours d'architecture des ordinateurs. Vous avez, sans doute, une idée claire et suffisante sur l'architecture Intel (IA ou x86) pour aborder ce tutoriel. D'autre part, apprendre un assembleur c'est apprendre une syntaxe pour programmer. C'est l'objectif de ce tutoriel !

    Un langage assembleur, ou simplement un assembleur, est une représentation symbolique du langage machine (données binaires et instructions du processeur). Il existe deux styles d'assembleurs :
    • l'assembleur Intel : l'assembleur principal utilisant ce style est NASM ;
    • l'assembleur AT&T : l'assembleur principal est l'assembleur GNU ou simplement as.

    Dans ce tutoriel, Issam Abdallah va vous donner la description minimale pour coder en assembleur GNU sous un système GNU/Linux en utilisant le jeu d'instructions Intel 80386.

    http://asm.developpez.com/cours/gas/

    Qu'en pensez-vous ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

  2. #2
    Responsable Pascal, Delphi et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    7 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 7 354
    Points : 51 496
    Points
    51 496
    Billets dans le blog
    2

    Par défaut

    Bonjour,

    Le tutoriel vient d'être complété, avec un nouvel exemple détaillé sur la conception d'un programme d'amorçage :

    http://asm.developpez.com/cours/gas/#LV-D

    Retrouvez les codes sources des exemples de cet ouvrage sur l'application de téléchargements :
    http://asm.developpez.com/telecharge...ces-Assembleur
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

  3. #3
    Nouveau membre du Club
    Inscrit en
    avril 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 31
    Points : 31
    Points
    31

    Par défaut

    Bonjour !
    Il semble qu'il y ai un probleme sur le premier programme ( outre le fait que je ne trouves pas le lien de telechargement de l'archive .tar.gz mentionnée dans le cours) en effet, lorsque que je le copie, le linkage me renvois une erreur sur $msg_ qui n'est pas defini dans _start.
    je résous le tout en enlevant les $ dans la section .data , mais je ne suis pas sur que ce sois la meilleur solution .

    Tartine

    [EDIT] Precisions.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    novembre 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2012
    Messages : 89
    Points : 969
    Points
    969
    Billets dans le blog
    1

    Par défaut

    Salut,

    Vous avez raison, il y a un $ qui manque. Il parait que c'est une faute de frappe.

    Avant d'exécuter l'appel système 4 (EAX <-- 4) pour afficher la chaîne des caractères, le registre ECX doit être chargé par son adresse qui est : $msg_. Donc, on doit transférer cette quantité (l'adresse et n'est pas le contenu de l'adresse) au registre ECX avec l'instruction : movl $$msg_, %ecx .

    Donc pour le moment vous devez ajouter le caractère $ comme indiqué ci-dessus.

    Merci pour votre remarque

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2014
    Messages : 4
    Points : 7
    Points
    7

    Par défaut Probleme d'affichage de chaine de caractere

    Bonjours,
    j'ai un problème avec mon programme, je sais pas si je peux le poster ici mais je suis le tuto et j'essaye d'afficher un autre message a la suite du premier "hello world" cependant il affiche le message deux fois de suite.
    Ainsi j'ai en sortit:
    Hello world!
    Loading system...
    Loading system...
    Voici le programme:
    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
     
    .data
    $msg_ :               .asciz "Hello, World !\n" 
    $bootmsg :          .asciz "Loading system...\n"
    len1 = . - $msg_
    len2 = . - $bootmsg 
                        .text 
                        .global main 
    main : 
                         movl $$msg_,%ecx 
                         movl $len1,%edx
                         movl $1,%ebx 
                         movl $4,%eax 
                         int $0x80
                         movl $$bootmsg,%ecx
                         movl $len2,%edx
                	       movl $1,%ebx
    	       movl $4,%eax ; int $0x80
    Je vois pas du tout l'erreur de plus le .saut : byte '\n ne s'affichait pas j'ai donc rajouter le \n directement au message et retirer le .saut.
    Merci d'avance

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    novembre 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2012
    Messages : 89
    Points : 969
    Points
    969
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    L'affichage que vous avez obtenu est absolument raisonnable!

    Vous avez défini les constantes len1 et len2 comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .data
    $msg_ :             .asciz "Hello, World !\n" 
    $bootmsg :          .asciz "Loading system...\n"
    len1 = . - $msg_
    len2 = . - $bootmsg
    Ainsi, la valeur de len1 sera égale à la taille des deux messages: len1 = 33 (en comptant les deux '\n)
    Pas de problème avec len2, sa valeur égale à 18 et c'est exactement le nombre de caractères du deuxième message !

    Ainsi, le premier appel système va afficher les deux messages (msg puis bootmsg, ECX = len1 = 33) et le deuxième va
    afficher seulement le deuxième (bootmsg, ECX = len2 = 18). C'est exactement le résultat que vous avez obtenu.

    Alors pour corriger ça et afficher, une seule fois, chaque message vous devez placer la déclaration de len1 juste après celle du premier message, comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .data
    $msg_ :             .asciz "Hello, World !\n" 
    len1 = . - $msg_
    $bootmsg :          .asciz "Loading system...\n"
    len2 = . - $bootmsg
    Lisez la section http://asm.developpez.com/cours/gas/#Lno-IV-D-1, pour bien comprendre.
    C'est simple!

    Bonne chance

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2014
    Messages : 4
    Points : 7
    Points
    7

    Par défaut

    Je me disais aussi que ça devait être tout bête ^^'
    Merci beaucoup je comprend mieux maintenant je ferais plus attention la prochaine fois =)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2014
    Messages : 4
    Points : 7
    Points
    7

    Par défaut

    Je comprend plus rien j'ai pourtant suivi ce que vous m'avez dit, j'ai essayer de compiler mais voila un message d'erreur:
    start.s: Erreur: opérandes invalides (sections .data et *UND*) pour «*-*» en définissant «*len1*»
    voici le code:
    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
     
              .data
    $msg_ :             .asciz "Hello, World !\n" 
    len1 = . - $mgs_ 
    $bootmsg :         .asciz "Loading system...\n"
    len2 = . - $bootmsg 
             .text 
             .global main 
    main : 
                         movl $$msg_,%ecx 
                         movl $len1,%edx
                         movl $1,%ebx 
                         movl $4,%eax 
                         int $0x80
                         movl $$bootmsg,%ecx
                         movl $len2,%edx
                	       movl $1,%ebx
                         movl $4,%eax ; int $0x80
    Pourtant là j'ai respecter la syntaxe?
    merci d'avance

  9. #9
    Membre éprouvé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    novembre 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2012
    Messages : 89
    Points : 969
    Points
    969
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    Si vous vérifiez dans ces deux lignes vous trouverez la source d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $msg_ :             .asciz "Hello, World !\n" 
    len1 = . - $mgs_
    Eh ... c'est un erreur dans la syntaxe: vous avez déclarez une constante $msg_ mais vous avez écrit $mgs comme
    deuxième opérande dans l'expression! N'est pas ?
    Ok, pas de problème.

    D'autre part, je vous en prie d'éviter, prochainement, d'utiliser les $, les . et les _ (à la fin) dans les
    étiquettes tel que: $bootmesg, $msg et msg_ ! On peut le faire mais c'est pas pratique! J'ai utilisé ces
    caractères ($msg_) seulement dans le premier exemple du tutoriel, à titre explicatif!

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2014
    Messages : 4
    Points : 7
    Points
    7

    Par défaut

    désolé... je crois que je vais beaucoup plus dormir dorénavant afin d'éviter ce genre d'erreur stupide =S
    Merci ^^

  11. #11
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    janvier 2013
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : janvier 2013
    Messages : 170
    Points : 146
    Points
    146

    Par défaut

    Salut.
    Merci pour le tutoriel.

    Je penses qu'il y a une petite erreur (d'orthographe) ici:
    - IV. Syntaxe de l'assembleur
    -- IV-H. Les directives
    --- .set symbol, expression et .equ symbol, expression
    "Ceux deux directives sont similaires à l'expression : symbol = expression."
    "Ceux deux directives" <-- le "ceux" devrait être remplacé par "ces" si je me trompe pas.


    Merci encore pour le tutoriel

  12. #12
    Responsable Pascal, Delphi et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    7 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 7 354
    Points : 51 496
    Points
    51 496
    Billets dans le blog
    2

    Par défaut

    Bonjour,
    Citation Envoyé par kripteks Voir le message
    Je pense qu'il y a une petite erreur (d'orthographe) ici:
    "Ceux deux directives" <-- le "ceux" devrait être remplacé par "ces" si je me trompe pas.
    Merci d'avoir signalé l'erreur, c'est corrigé.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

  13. #13
    Responsable Pascal, Delphi et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    7 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 7 354
    Points : 51 496
    Points
    51 496
    Billets dans le blog
    2

    Par défaut

    Le tutoriel vient d'être copieusement complété et corrigé par son auteur.

    http://asm.developpez.com/cours/gas/
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/06/2014, 15h49
  2. Publication de logiciel sous licence freeware GNU
    Par greg13 dans le forum Licences
    Réponses: 3
    Dernier message: 25/08/2005, 11h05
  3. Une introduction à l'assembleur 80x86, 32 bits, GNU GCC
    Par pierre.jourlin dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 04/04/2005, 17h34

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