En Assembleur tu travailles avec des registres au lieu de variables
Qu’est ce qu’un registre ?
Un registre est une petite zone de mémoire ultra rapide située directement dans le processeur (CPU).
C’est là où le CPU travaille réellement.
On peut voir ça comme :
| Instruction | Type | Rôle | Ce que ça fait concrètement | Exemple |
|---|---|---|---|---|
mov |
Données | Copier | Copie une valeur d’une source vers une destination | mov rax, rdi |
add |
Arithmétique | Addition | Additionne la source à la destination | add rax, rsi |
sub |
Arithmétique | Soustraction | Soustrait la source de la destination | sub rax, 1 |
cmp |
Comparaison | Comparer | Compare deux valeurs et met à jour les flags (sans stocker le résultat) | cmp rax, rbx |
jmp |
Contrôle | Saut inconditionnel | Saute directement à un label | jmp loop |
je / jne |
Contrôle | Saut conditionnel | je saute si égal (ZF=1), jne saute si différent (ZF=0) |
je equal |
call |
Fonction | Appel | Appelle une fonction (empile l’adresse de retour puis saute) | call printf |
ret |
Fonction | Retour | Revient à l’adresse sauvegardée par call |
ret |
push |
Stack | Empiler | Place une valeur au sommet de la pile | push rax |
pop |
Stack | Dépiler | Retire la valeur au sommet de la pile | pop rax |
Registres principaux (x86-64)
| Registre | Rôle principal |
|---|---|
rax |
Valeur de retour |
rdi |
1er argument |
rsi |
2e argument |
rdx |
3e argument |
rcx |
4e argument |
r8 |
5e argument |
r9 |
6e argument |
rbp |
Base pointer |
rsp |
Stack pointer |
rip |
Instruction pointer |
| Keyword | Type | Définition simple | Exemple |
|---|---|---|---|
mov |
Données | Copie une valeur d’une source vers une destination | mov rax, rdi |
lea |
Adresse | Charge une adresse calculée (ne lit pas la mémoire) | lea rax, [rbx+4] |
add |
Arithmétique | Additionne deux opérandes | add rax, rsi |
sub |
Arithmétique | Soustrait | sub rax, 1 |
imul |
Arithmétique | Multiplication signée | imul rax, rsi |
idiv |
Arithmétique | Division signée (divise rdx:rax) | idiv rbx |
inc |
Arithmétique | Incrémente de 1 | inc rax |
dec |
Arithmétique | Décrémente de 1 | dec rax |
cmp |
Comparaison | Compare deux valeurs (modifie les flags) | cmp rax, rbx |
test |
Comparaison | AND logique sans stocker le résultat | test rax, rax |
jmp |
Saut | Saut inconditionnel | jmp label |
je |
Saut | Saut si égal (Zero Flag = 1) | je equal |
jne |
Saut | Saut si différent | jne not_equal |
jg |
Saut | Saut si plus grand (signé) | jg greater |
jl |
Saut | Saut si plus petit (signé) | jl smaller |
call |
Appel | Appelle une fonction (push RIP + jump) | call printf |
ret |
Retour | Retourne d’une fonction | ret |
push |
Stack | Empile une valeur sur la pile | push rax |
pop |
Stack | Dépile une valeur | pop rax |
and |
Logique | AND binaire | and rax, 1 |
or |
Logique | OR binaire | or rax, rbx |
xor |
Logique | XOR binaire | xor rax, rax |
not |
Logique | Inverse les bits | not rax |
shl |
Bitwise | Décalage à gauche | shl rax, 1 |
shr |
Bitwise | Décalage à droite (non signé) | shr rax, 1 |
sar |
Bitwise | Décalage à droite signé | sar rax, 1 |
syscall |
Système | Appel système Linux | syscall |
Directives NASM (très importantes aussi)
| Directive | Rôle | Définition |
|---|---|---|
section .text |
Code | Section contenant le code exécutable |
section .data |
Données | Variables initialisées |
section .bss |
Données | Variables non initialisées |
global |
Export | Rend un symbole visible au linker |
extern |
Import | Déclare une fonction externe |
db |
Donnée | Define byte |
dw |
Donnée | Define word (2 bytes) |
dd |
Donnée | Define double word (4 bytes) |
dq |
Donnée | Define quad word (8 bytes) |
equ |
Constante | Définit une constante |
rdi: premier argument ici *str;
rax: valeur de retour: -> tu dois mettre le nombre de caracteres du mot dans rax
mov al, [rdi] -> pour acceder a la memoire
[rdi] : signifie "va a l'adresse contenue dans rdi"
Lis 1 octet
mets-le dans al
un caracter = 1 octet
Sur macOS :
_