diff --git a/Etape_2.uvoptx b/Etape_2.uvoptx index 6a71f02..2b9736b 100644 --- a/Etape_2.uvoptx +++ b/Etape_2.uvoptx @@ -142,6 +142,22 @@ 0 0 + 128 + 1 +
134222544
+ 0 + 0 + 0 + 0 + 0 + 1 + .\FonctionEtape2.asm + + \\Simu_Etape0\FonctionEtape2.asm\128 +
+ + 1 + 0 116 1
134222522
@@ -156,7 +172,7 @@ \\Simu_Etape0\FonctionEtape2.asm\116
- 1 + 2 0 115 1 @@ -172,7 +188,7 @@ \\Simu_Etape0\FonctionEtape2.asm\115 - 2 + 3 0 113 1 @@ -188,7 +204,7 @@ \\Simu_Etape0\FonctionEtape2.asm\113 - 3 + 4 0 99 1 @@ -204,7 +220,7 @@ \\Simu_Etape0\FonctionEtape2.asm\99 - 4 + 5 0 98 1 @@ -220,7 +236,7 @@ \\Simu_Etape0\FonctionEtape2.asm\98 - 5 + 6 0 58 1 @@ -236,7 +252,7 @@ \\Simu_Etape0\FonctionEtape2.asm\58 - 6 + 7 0 57 1 @@ -252,7 +268,7 @@ \\Simu_Etape0\FonctionEtape2.asm\57 - 7 + 8 0 56 1 @@ -268,7 +284,7 @@ \\Simu_Etape0\FonctionEtape2.asm\56 - 8 + 9 0 87 1 @@ -284,7 +300,7 @@ \\Simu_Etape0\Principale.asm\87 - 9 + 10 0 80 1 @@ -300,7 +316,7 @@ - 10 + 11 0 91 1 @@ -316,7 +332,7 @@ - 11 + 12 0 92 1 diff --git a/FonctionEtape2.asm b/FonctionEtape2.asm index 85f023a..27c3e16 100644 --- a/FonctionEtape2.asm +++ b/FonctionEtape2.asm @@ -124,6 +124,11 @@ WHILE_NBLED ADD R6, R6, #1 ;On incrémente R6 CMP R6, #47 ; SI R6==47 alors on arrête la boucle BNE WHILE_NBLED + + MOV R0, #SCLK ;************ + PUSH {R0} ;Reset_X(SCLK) + BL Reset_X; ;************ + B . ;while(1) ENDP ;************************************************************************** diff --git a/README.md b/README.md index 2d04234..7c2b96f 100644 --- a/README.md +++ b/README.md @@ -1 +1,63 @@ -# roue_assembler +# 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 : +```bash +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 : +```c +void set(int pin); +int invert(int x); + +void * gpioA = (void *)0x40010800; + +int main(void) +{ + add(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 : +```bash +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 : +```bash +arm-none-eabi-objdump -D test.o +``` + +Nous obtenons le résultat suivant : + +```assembly +00000000 : + 0:e1e00000 mvnr0, r0 + 4:e12fff1e bxlr + +00000008 : + 8:e3a01001 movr1, #1 + c:e59f3010 ldrr3, [pc, #16]@ 24 + 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 +``` \ No newline at end of file