← Retour à la page de la matière
Traduire directement du code C vers l’assembleur est souvent difficile,
car le C contient des instructions imbriquées (if, for, while, etc.).
Les processeurs, eux, ne comprennent que des instructions séquentielles et des sauts (jmp, je, jne, ...).
On transforme le code C en version séquentielle, où toutes les conditions et boucles sont remplacées par des tests et des sauts explicites.
Objectif : ne garder que des instructions simples — pas de blocs imbriqués.
if
if (x > y)
x = x - y;
t1 = (x > y);
if (t1 == 0) goto END;
x = x - y;
END:
cmp eax, ebx ; compare x et y
jle END ; si x <= y, saute à END
sub eax, ebx ; sinon, fait x = x - y
END:
cmp eax, ebxcomparexetyet met à jour les drapeaux.jlesaute six <= y.subeffectue la soustraction si le saut n’a pas lieu.
Les int en C sont signés par défaut. Les sauts sont :
< → jl<= → jle> → jg>= → jge| Sujet | Description | Exemple |
|---|---|---|
| Flattened C | Traduction linéaire de if, while, for |
cmp + jmp |
| Contrôle signé | jl, jg, jle, jge |
cmp eax, ebx |
| Contrôle non signé | jb, ja, jbe, jae |
cmp eax, ebx |
| Tableaux | Accès mémoire indirect / indexé | [rdi + rsi*4] |
| Structures | Accès par décalage / alignement | [rdi + 4] |