Un "hello world" sous linux (utilise l'assembleur as et le linker ld)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 386 fois - Téléchargée 28 fois

Contenu du snippet

C'est juste pour montrer comment faire un simple "Hello World" avec AS.
Comme ceci, le code montre la syntaxe AT&T. Une petite modification a été apportée pour calculer la taille des chaînes automatiquement, merci à _DUNE2_ pour l'apport de cette ajout !

Source / Exemple :


.section .text
   .global _start
   _start:
       movl    $4, %eax
       movl    $1, %ebx
       movl    $chaine1, %ecx
       movl    $(chaine2-chaine1), %edx ; calcul de la taille automatique
       int    $0x80

       movl $4,%eax
       movl $1,%ebx
       movl $chaine2,%ecx
       movl $(chaine3-chaine2),%edx ; calcul de la taille automatique
       int $0x80

       movl    $1, %eax
       int    $0x80

   .section .data ; section ki sert a déclarer des variables initialisés
   chaine1:    .string    "Voici une première chaine\n"
   chaine2:    .string    "Et en voici une seconde\n"
   chaine3:

   .section .bss
   nbr3:    .long ; sert a rien, c juste pour montrer que ce segment sert a mettre des varibles non initialisés

Conclusion :


Bon, c'est simple, on utilise l'appel system "write" pour afficher deux chaines.
On fait appel à l'interruption 0x80, c'est le kernel.
Voila, pour compiler on fait:
as -o prog.o prog.asm
ld -s -o prog prog.o

Voila
Bonne Prog
Bouba

A voir également

Ajouter un commentaire

Commentaires

cs_bouba
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3 -
Ok, merci pour ces précisions, je modifie le code tout de suite en fonctions de tes remarques.
Thanks.

Bouba
_dune2_
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
-
Une autre précision, il n'est pas nécéssaire de préciser la taille du mov (movl pour mov long) à partir du moment où un registre en opérande lève toute ambiguité.

dune2.
_dune2_
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
-
Bonjour suite à une relecture des sources, j'ai juste une précision à ajouter à ce code :
Dans l'appel système "write", les paramètres sont eax="appel système write" , ebx="le file descriptor (1 = stdout)", ecx="pointeur vers le buffer" et edx="taille du buffer".
C'est sur la taille du buffer pour la 2ème chaine que je ne suis pas d'accord. Pour éviter tout problème de calcul de taille de chaine, on peut laisser le compilateur effectuer le calcul à notre place. Pour celà, nous utiliserons la soustraction de label :

.section .text
.global _start
_start:
movl $4, %eax
movl $1, %ebx
movl $chaine1, %ecx
movl $(chaine2-chaine1), %edx ; calcul de la taille automatique
int $0x80

movl $4,%eax
movl $1,%ebx
movl $chaine2,%ecx
movl $(chaine3-chaine2),%edx ; calcul de la taille automatique
int $0x80

movl $1, %eax
int $0x80

.section .data ; section ki sert a déclarer des variables initialisés
chaine1: .string "Voici une première chaine\n"
chaine2: .string "Et en voici une seconde\n"
chaine3:

.section .bss
nbr3: .long ; sert a rien, c juste pour montrer que ce segment sert a mettre des varibles non initialisés


dune2.
cs_bouba
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3 -
Malheuresement je ne pourrai pas de dire quelle version j'ai utilisé pour compiler cette source car y'a bien longtemps que j'ai changé ma distribution linux.
Sinon, pour de la doc en asm tu trouveras tout ça sur le net facilement en faisant une recherche sur google, ou alors sur le super site du "Linux Documentation Project". En tout cas si tu trouves pas de doc en Français c'est u pe normal, de tout de façon les meilleurs docs sont en Anglais, alors ne t'entêtes pas a en chercher en français.
Voilà, bonne prog.
Bouba
cs_PierreF
Messages postés
33
Date d'inscription
mercredi 15 mai 2002
Statut
Membre
Dernière intervention
24 octobre 2003
-
Salut
J'aurais deux petites questions:

1) Je n'arrive pas a complier ton code, il ne veut pas des chaines de caractères avec ' (il veut ") et les commentaire il veut pas de // mais un point-virgule.
Alors je voudrais savoir si tu a fait une erreur, où si je n'ai pas la même version de as que toi (j'ai GNU assembler version 2.13.90.0.18 (i586-mandrake-linux-gnu))

2) Plus important: Où peut-on trouver des documents sur la programmation en asm sous linux?

Merci d'avance

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.