← Retour à la page de la matière
if simpleif ... elsewhileforif simpleTraduire un if C vers code aplati puis en assembleur.
if (x > y)
x = x - y;
t1 = (x > y);
if (t1 == 0) goto END;
x = x - y;
END:
cmp eax, ebx
jle END
sub eax, ebx
END:
Explication :
cmpmet à jour les drapeaux selonx - y.jlesaute six <= y.- Sinon, on exécute
x = x - y.
if ... elseTraduire un if ... else en code aplati et en assembleur.
if (x > y)
z = x;
else
z = y;
t1 = (x > y);
if (t1 == 0) goto ELSE;
z = x;
goto END;
ELSE:
z = y;
END:
cmp eax, ebx
jle ELSE
mov ecx, eax
jmp END
ELSE:
mov ecx, ebx
END:
cmp→ comparexety.- Si
x <= y, saut versELSE.- Sinon,
z = xet saut versEND.
whileTraduire un while en version aplatie et assembleur.
while (x < y)
x++;
LOOP:
t1 = (x < y);
if (t1 == 0) goto END;
x++;
goto LOOP;
END:
LOOP:
cmp eax, ebx
jge END
inc eax
jmp LOOP
END:
cmpprépare la comparaison.jgequitte la boucle six >= y.- Sinon, on incrémente et recommence.
forTraduire une boucle for avec calculs et condition.
sum = 0;
for (i = 0; i < n; i++)
sum += i;
sum = 0;
i = 0;
LOOP:
t1 = (i < n);
if (t1 == 0) goto END;
sum = sum + i;
i++;
goto LOOP;
END:
mov eax, 0 ; sum
mov ecx, 0 ; i
LOOP:
cmp ecx, ebx
jge END
add eax, ecx
inc ecx
jmp LOOP
END:
Traduire un test entre entiers non signés.
unsigned int a = 10, b = 20;
if (a < b)
a = b;
t1 = (a < b); // comparaison non signée
if (t1 == 0) goto END;
a = b;
END:
cmp eax, ebx
jae END
mov eax, ebx
END:
jae= jump if above or equal (non signé).- Le compilateur remplace
jl/jgparjb/japour unsigned.
Lire les éléments d’un tableau et les additionner.
int a[3] = {2, 4, 6};
sum = a[0] + a[1] + a[2];
sum = a[0];
sum = sum + a[1];
sum = sum + a[2];
mov eax, [a] ; a[0]
add eax, [a + 4] ; a[1]
add eax, [a + 8] ; a[2]
Utiliser un registre pour accéder à a[i].
x = a[i];
t1 = i * 4; // chaque int = 4 octets
x = *(a + t1);
mov eax, [rdi + rsi*4]
rdi= adresse dearsi= indexi- *4 = taille d’un int
Accéder aux champs d’une structure en mémoire.
struct Point {
char a;
int b;
};
p.a = 1;
p.b = 5;
p.a = 1;
p.b = 5; // mais décalé de +4 octets à cause du padding
mov byte [p], 1 ; champ a
mov dword [p + 4], 5 ; champ b
char= 1 octet + 3 octets de paddingintaligné à +4
Observer comment une valeur est stockée en mémoire en Little Endian.
x = 0x12345678;
// mémoire : x = 78 56 34 12
mov eax, 0x12345678
mov [val], eax
| Adresse | Octet (hex) |
|---|---|
| val | 78 |
| val+1 | 56 |
| val+2 | 34 |
| val+3 | 12 |
🧠 En Little Endian, l’octet de poids faible est stocké en premier.
Représenter la même valeur dans un ordre Big Endian.
// mémoire (Big Endian) : 12 34 56 78
| Adresse | Octet (hex) |
|---|---|
| val | 12 |
| val+1 | 34 |
| val+2 | 56 |
| val+3 | 78 |
Remarque :
| Sujet | Exercices |
|---|---|
if, else, while, for | 1 → 4 |
| Entiers signés / non signés | 5 |
| Tableaux & adressage mémoire | 6 → 7 |
| Structures & padding | 8 |
| Little / Big Endian | 9 → 10 |