Skip to main content

[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.

image.png

Installation d'un assembleur (nasm)

Linux

Pour installer nasm sur Debian :

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.

Registre d'états

Ce type de registre contient des flags permettant de suivre des états.

Sections

Data

C'est ici que nos constantesseront définies dans le code commae dans l'exemple ci-dessous :

SECTION .data
msg     db      'Hello world!', 0Ah

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 :

archsyscall NRreturnarg0arg1arg2arg3arg4arg5
armr7r0r0r1r2r3r4r5
arm64x8x0x0x1x2x3x4x5
x86eaxeaxebxecxedxesiediebp
x86_64raxraxrdirsirdxr10r8r9

Libc

En architecture Intel x86, selon la convention d'appel, nous devons procédé comme suit pour afficher "Hello world" à l'écran :

_start:
        MOV eax, 4   ; Appel à SYS_WRITE (OPCODE 4 définit dans la libc)
        MOV ebx, 1   ; La valeur 1 correspond à la sortie standard STDOUT
        MOV ecx, msg ; Met le contenu de la constante msg dans le registre ecx
        MOV edx, 13  ; Indique la taille de la chaîne de caractère incluant le null byte (ici 13)
        INT 80h      ; Lance une interruption de la libc pour exécuter nos instructions

Voici comment fermer un programme proprement avec la libc :

_start:
        ; Close program
        MOV eax, 1 ; Appel à SYS_CLOSE dans la libc (OPCODE 1) 
        MOV ebx, 0 ; Code de retour 0
        INT 80h

Les jeux d'instructions

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
CMPCompare 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é. 
INCIncrémente une valeur ou une adresse.
RETDéfinit la fin d'une fonction.