# [ASM] Kit de base ## Introduction Le **langage d'assembleur** est le langage le plus bas-niveau et le plus proche du langage machine. Cependant, contrairement aux autres langage, chaque **architecture** possède son **jeu d'instruction** et donc son propre langage d'assembleur. Ce cours traitera essentiellement de l'architecture **Intel** et peut-être **AT&T**. [](https://wiki.neopipe.fr/uploads/images/gallery/2023-12/YZAimage.png) ## Installation d'un assembleur (nasm) #### Linux Pour installer **nasm** sur Debian : ```bash sudo apt install -y nasm build-essential ``` ## Registres #### Registres de données Un registre de données permet de stocker 16 bits soit 2 octets avec les bits forts placés à gauche et les bits faibles à droite.
**Nom raccourcis** | **Nom complet** | **Fonction** |
AX | Accumulator | Opérations arithmétiques et d'entrées/sorties. |
BX | Base register | Adressage mémoire. |
CX | Count register | Compteur de boucle. |
DX | Data register | Extension d'AX. |
La valeur **0A** correspond au caractère **\\n** et le **h** spécifie qu'il s'agit d'une valeur hexadécimale.
#### Text C'est ici que nous définissons le point d'entrée (le label qu'il faut lancer pour démarrer le programme) : ``` SECTION .text global _start ``` ## Convention d'appel Voici la liste des registres et leur utilité lors de l'appel à vos fonctions :arch | syscall NR | return | arg0 | arg1 | arg2 | arg3 | arg4 | arg5 |
---|---|---|---|---|---|---|---|---|
arm | r7 | r0 | r0 | r1 | r2 | r3 | r4 | r5 |
arm64 | x8 | x0 | x0 | x1 | x2 | x3 | x4 | x5 |
x86 | eax | eax | ebx | ecx | edx | esi | edi | ebp |
x86\_64 | rax | rax | rdi | rsi | rdx | r10 | r8 | r9 |
**Instructions** | **Descriptions** |
**MOV** | Déplace une valeur dans un registre sous le format suivant : MOV dst, src |
**CALL** | Fait appel à une subroutine (fonction) |
**INT** | Fait une interruption (pour appeler la libc) |
**PUSH** | Pousse une valeur sur la stack |
**POP** | Retire une valeur de la stack (format LIFO) |
**SUB** | Effectue une soustraction entre deux adresses |
**ADD** | Effectue une addition entre deux adresses |
**CMP** | Compare deux valeurs |
**JE** | "Jump if Equal". Se rend sur la routine ou le label indiqué si les deux valeurs comparées sont identiques. |
**JZ** | "Jump if the Zero flag is set". Se rend sur la routine ou le label indiqué si le flag zero est définit. |
**JMP** | Saute à la routine ou au label mentionné. |
**INC** | Incrémente une valeur ou une adresse. |
**RET** | Définit la fin d'une fonction. |