RTE | ||
.gitignore | ||
Etape_2.uvoptx | ||
Etape_2.uvprojx | ||
FonctionEtape.asm | ||
FonctionEtape2.asm | ||
Lumiere.asm | ||
Matos.lib | ||
Principale.asm | ||
README.md | ||
REG_UTILES.inc | ||
Simulator.ini |
But du projet
Le but sera de faire fonctionner diverses LEDS à l'aide d'un STM32 et tout cela en langage Assembler
Réaliser un code assembler à partir de C
Comme vous le savez le code en langage C peut être compilé puis récupéré en assembler. C'est justement ici une solution que j'ai trouvé pour mieux comprendre différents principes, ou si certaines instructions ne me paraissent pas clair. Bien évidemment le but du projet n'est pas de recopier bêtement du code que le compilateur peut réaliser, mais de comprendre et de voir comment faire différents algorithmes en Assembler.
La première chose est d'installer le package suivant sur une machine Linux :
sudo dnf install arm-none-eabi-gcc
J'utilise Fedora donc mon package manager est dnf, mais cela fonctionne avec apt ou pacman
Ensuite il suffit de créer un programme en C, voici en un par exemple qui m'a aidé à comprendre l'inversion des bits, ou comment le C récupère les arguments d'une fonction :
void set(int pin);
int invert(int x);
void * gpioA = (void *)0x40010800;
int main(void)
{
set(5);
invert(0x20);
return 0;
}
void set(int pin){ *((short *)(globalPtr+0xc)) |= (0x01 << pin) }
int invert(int x){ return ~x }
Ensuite je lance la commande suivante pour compiler le tout dans un niveau d'optimisation choisi :
arm-bibe-eabi-gcc -OX -c test.c -o test.o
Argument | Type d'optimisation du compilateur |
---|---|
-O0 | Zero |
-O1 | Normale |
-O2 | Maximale |
Et enfin pour voir le résultat en assembler dans la le terminal :
arm-none-eabi-objdump -D test.o
Nous obtenons le résultat suivant :
00000000 <invert>:
0:e1e00000 mvnr0, r0
4:e12fff1e bxlr
00000008 <set>:
8:e3a01001 movr1, #1
c:e59f3010 ldrr3, [pc, #16]@ 24 <add+0x1c>
10:e5932000 ldrr2, [r3]
14:e1d230b5 ldrhr3, [r2, #5]
18:e1c33011 bicr3, r3, r1, lsl r0
1c:e1c230b5 strhr3, [r2, #5]
20:e12fff1e bxlr
24:00000000 andeqr0, r0, r0