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 :

Instructions Assembly essentielles (x86-64 NASM)

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

Autres instructions en Assembleur tres utiles:

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

ft_srtrlen


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 :