IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Introduction à l'Assembleur GNU sous un système GNU/Linux sur architecture Intel 80386
Par Issam Abdallah

Le , par Alcatîz

0PARTAGES

6  0 
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 ?

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de
https://www.developpez.com
Le 12/02/2014 à 7:10
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
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
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
3  0 
Avatar de Alcatîz
Responsable Pascal, Lazarus et Assembleur https://www.developpez.com
Le 01/06/2014 à 9:45
Le tutoriel vient d'être copieusement complété et corrigé par son auteur.

http://asm.developpez.com/cours/gas/
3  0 
Avatar de Alcatîz
Responsable Pascal, Lazarus et Assembleur https://www.developpez.com
Le 27/07/2013 à 11:28
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
2  0 
Avatar de kiradessu
Futur Membre du Club https://www.developpez.com
Le 12/02/2014 à 21:03
Je me disais aussi que ça devait être tout bête ^^'
Merci beaucoup je comprend mieux maintenant je ferais plus attention la prochaine fois =)
1  0 
Avatar de
https://www.developpez.com
Le 15/02/2014 à 7:40
Bonjour,

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

Code : Sélectionner tout
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!
1  0 
Avatar de kripteks
Membre habitué https://www.developpez.com
Le 07/04/2014 à 3:27
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
1  0 
Avatar de tartine
Nouveau membre du Club https://www.developpez.com
Le 02/10/2013 à 23:27
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.
0  0 
Avatar de
https://www.developpez.com
Le 03/10/2013 à 15:48
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
0  0 
Avatar de kiradessu
Futur Membre du Club https://www.developpez.com
Le 11/02/2014 à 1:00
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
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
0  0 
Avatar de kiradessu
Futur Membre du Club https://www.developpez.com
Le 13/02/2014 à 17:18
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
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
0  0