Forum de l’article
ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.
Bonjour,
Merci pour ce post, qui m’a donné envie de me remettre à la prog. ass. (au lieu de préparer mes cours :-) tous les prétextes sont bons).
En attendant de recevoir le bouquin commandé, j’en reviens à ma vieille stratégie pour apprendre un jeu d’instructions : demander au compilateur ce qu’il fait avec du code C très simple.
Exemple, le source first.c
int somme(int a, int b) {
return a + b;
}
compilé par
riscv64-linux-gnu-gcc -march=rv32i -mabi=ilp32 -c -S -Os -o first.s first.c
me renseigne sur les conventions d’appel. Extrait :
somme:
add a0,a0,a1
ret
Les optimisations y rajoutent du piment : après il faut comprendre pourquoi la copie de chaine
void my_copy(char *dst, char *src) {
while( (*dst++ = *src++))
continue;
}
se retrouve sous cette forme
my_copy:
.L6:
addi a1,a1,1
lbu a5,-1(a1)
addi a0,a0,1
sb a5,-1(a0)
bnez a5,.L6
ret
Il n’est pas trop dur de voir ce que fait chaque instruction, reste à coder et essayer des alternatives qui ne feraient pas intervenir les pointeurs sur les précédents. Pour voir si on fait mieux que le compilateur (rarement !).