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

FAQ AssembleurConsultez toutes les FAQ

Nombre d'auteurs : 9, nombre de questions : 56, dernière mise à jour : 8 décembre 2017  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur le forum Assembleur de Developpez.com et de l'expérience personnelle des auteurs. Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être exhaustive ; vous pouvez la compléter avec vos propres questions/réponses ou proposer des corrections ou des compléments à des questions/réponses existantes.

Nous espérons que cette FAQ saura répondre à un maximum de vos questions. Nous vous en souhaitons une bonne lecture.

L'équipe Assembleur de Developpez.com.

SommaireF.A.Q. Assembleur x86Programmation Linux (4)
précédent sommaire suivant
 

Pour utiliser une fonction de la libc en assembleur, il faut empiler les arguments de droite à gauche avant de l'appeler.

Code c : Sélectionner tout
1
2
  
int fonction(arg1,arg2)

donnera un code similaire à ceci :
Code asm : Sélectionner tout
1
2
3
4
5
  
push dword arg2 
push dword arg1 
call fonction 
add esp,8

Exemple complet "Hello Woirld! :"

Code asm : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  
BITS 32 
  
EXTERN puts 
  
SECTION .data 
 chaine db "Hello world !", 0 
  
SECTION .text 
GLOBAL main 
main: 
 push dword chaine 
 call puts 
 add esp, 4                  # dépilement des deux arguments 32 bits précédemment empilés. 
 ret

Pour assembler :
Code shell : Sélectionner tout
1
2
3
 
nasm -f elf hello.asm 
gcc hello.o -o hello

Mis à jour le 8 décembre 2017 chrtophe

Pour appeler une fonction noyau en 32 bits, il faut stoker les arguments dans les registres EAX, EBX, ECX, EDX, RSI, EDI, EBP. Le retour de la fonction se fera dans EAX. Le contenu des registres utilisés sont préservés.

Exemple "Hello world !"

Code asm : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  
BITS 32  
  
SECTION .data  
 chaine db "Hello world !"  
  
SECTION .text  
GLOBAL main  
main:  
 mov eax,4                   # appel système 4 : Write 
 mov ebx,1                   # descripteur de fichier de destination 1=stdout par défaut 
 mov ecx,chaine              # adresse du buffer à écrire 
 mov edx,13                  # taille du buffer à écrire 
 int 0x80

Mis à jour le 8 décembre 2017 chrtophe

Pour appeler une fonction noyau en 64 bits,les registres utilisés sont différents du 32 bits. Il faut stocker les arguments dans les registres RAX, RDI, RSI, RDX, R10, R8, R9. Le retour de la fonction se fera dans RAX. Les registres RAX, RCX, et R11 seront modifiés.

En 64 bits, on utilise plus int 0x80 mais syscall.

Voici l'exemple Hello World en assembleur 64 bits :

Code asm : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  
BITS 64   
  
SECTION .data   
 chaine db "Hello world !"   
  
SECTION .text   
GLOBAL main   
main:   
 mov rax,4                   # appel système 4 : Write  
 mov rdi,1                   # descripteur de fichier de destination 1=stdout par défaut  
 mov rsi,chaine              # adresse du buffer à écrire  
 mov rdx,13                  # taille du buffer à écrire  
 syscall

Mis à jour le 8 décembre 2017 chrtophe

Historiquement, les assembleurs des Unix-like utilisent la syntaxe AT&T et non pas Intel. C'est aussi le cas du GNU Assembler fourni et utilisé par Linux.

Si vous souhaitez utiliser la syntaxe Intel, vous pouvez utiliser l'assembleur Nasm.

exemples de différences entre la syntaxe Intel et AT&T :

Code asm : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
  
# syntaxe Intel : 
mov eax,0xff 
  
# syntaxe AT&T : 
movl  $0xff,%eax 
  
# syntaxe Intel : 
mov byte ptr  [ebx],0xff 
  
# syntaxe AT&T : 
movb  $0xff,(%ebx)

Mis à jour le 8 décembre 2017 chrtophe

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.