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.
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 |
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 |
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 |
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) |
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 çaLes 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.