Retour aux projets

Projet 42

Libasm

Une réimplémentation de fonctions standard en Assembly pour comprendre l’exécution au plus près du processeur.

Stack

  • Assembly
  • NASM
  • C
  • Linux
  • Syscall

Skills acquis

  • Comprendre les bases de l’Assembly x86_64
  • Manipuler les registres et respecter les conventions d’appel
  • Interfacer du code Assembly avec du C
  • Utiliser des appels système de manière explicite

Libasm est un projet bas niveau qui consiste à réécrire plusieurs fonctions classiques de la libc directement en Assembly. C’est un projet court, mais très formateur, car il oblige à comprendre précisément la convention d’appel, les registres, la mémoire et les interactions avec le système.

01 — Bas niveau

Descendre sous le C.

Réécrire des fonctions simples en Assembly permet de mieux comprendre ce que les abstractions cachent habituellement. Chaque instruction devient volontaire, et la moindre erreur de registre peut changer complètement le comportement du programme.

La decouvrte de l'ASM
Fig. 01

02 — Conventions

Parcours du combattant.

Ce fut un projet très instructif pour moi, notamment car j’ai dû m’y prendre à deux fois avant de le valider. En effet, j’utilisais movsx au lieu de movzx dans ft_strcmp, ce qui interprétait certains octets comme des valeurs signées et pouvait donc inverser le résultat de comparaison pour les caractères au-delà de l’ASCII standard.

Le dilemme absolu entre movsx et movzx en Assembly
Fig. 02

03 — Compréhension

Voir la machine de plus près.

Libasm m’a donné une meilleure intuition de l’exécution d’un programme : passage d’arguments, appels système, mémoire et valeur de retour. C’est un socle utile pour la suite, notamment en debugging bas niveau et en sécurité.

Illustration d’un développeur observant le fonctionnement interne d’un programme
Fig. 03
Après Libasm, même strlen a l’air légèrement plus intimidant.