L’assembleur (6)
Mélanger assembleur et C/C++
. Par : Christian
Vous répondez à :
Merci Gérard.
J’attends vos réflexions avec impatience car on a tous à apprendre en partageant nos expériences.
J’ai voulu aborder l’assembleur car c’est vrai qu’on n’en parle pas très souvent, et que je trouve que c’est un plus de programmer un microcontrôleur au plus près de ses ressources, mais je dois avouer qu’en modélisme ferroviaire, je ne le pratique pas très souvent.
6 Messages
-
L’assembleur (6) 10 février 2022 09:51, par JF
Bonjour,
très content d’avoir trouvé cet article, merci à vous d’avoir traité ce thème.
Une précision pour ceux qui tentent l’aventure asm sans expérience, comme moi, avec cette première étape, l’extension du fichier assembleur doit être impérativement .S et non .s sinon le compilateur renvoi une erreur. J’ai cherché un peu de temps avant de trouver l’erreur.
Allez hop, j’essaie l’inversion de bit dans un octet avec ROR et ROL-
L’assembleur (6) 10 février 2022 10:03, par Christian
Bonjour JF,
Vous me faites très plaisir d’avoir mis un tel commentaire sur cette série d’articles ; je sais et d’ailleurs je l’ai dit, que l’assembleur n’est pas d’un grand intérêt pour faire du modélisme ferroviaire. Mais si j’ai pu intéresser quelques lecteurs, alors mon but est bien atteint.
Merci pour votre précision sur l’extension du fichier : je viens de corriger mon article et c’est grâce à vous. C’est l’exemple parfait pour montrer que cet espace de discussion doit être réservé à l’amélioration de l’article en lui-même et que le forum sert à demander une aide technique.
Je vous souhaite de beaux développements en assembleur ; n’hésitez pas à revenir vers nous pour nous faire partager vos avancées.
-
-
L’assembleur (6) 2 juillet 2022 12:06, par Gérard
Je vous remercie de votre travail. Vous êtes un des rares qui abordent ce sujet. Je vous tiendrais au courant de mes réflexions qui peuvent peut-être être utiles pour certains.
-
L’assembleur (6) 2 juillet 2022 12:22, par Christian
Merci Gérard.
J’attends vos réflexions avec impatience car on a tous à apprendre en partageant nos expériences.
J’ai voulu aborder l’assembleur car c’est vrai qu’on n’en parle pas très souvent, et que je trouve que c’est un plus de programmer un microcontrôleur au plus près de ses ressources, mais je dois avouer qu’en modélisme ferroviaire, je ne le pratique pas très souvent.
-
-
L’assembleur (6) 8 février 2023 10:55, par jp.odissey
Bonjour,
Dans l’exemple de la fonction flash_serie, je n’ai pas compris comment le nombre de flash se retrouvait dans R24.
Merci.
JP
-
L’assembleur (6) 8 février 2023 12:46, par Christian
Lorsqu’un programme C utilise une fonction en assembleur, les arguments (ici, le nombre de flash) sont mis automatiquement dans les registres R18 à R25. C’est la façon de travailler du C, on ne peut pas la modifier. Ceci est expliqué dans le paragraphe "Passage d’arguments" qui explique notamment quels registres sont utilisés en fonction de la place qu’il faut pour stocker l’argument.
Dans notre exemple, le nombre de flash est très petit et peut tenir sur un seul octet : c’est le registre R24 qui sera utilisé pour cela (encore une fois, c’est la façon de travailler du C en présence d’une fonction en assembleur). Il faut aussi noter que le registre R25 est inutilisable puisqu’il fonctionne avec R24. Regardez la figure 1. Le texte dit par ailleurs :
Pour passer un caractère (ou un byte dans le langage d’Arduino), nous avons besoin d’un seul octet de 8 bits, de type uint8_t en langage C : le registre R24 sera utilisé mais pas R25 qui pourtant sera inutilisable (un argument de type char consomme donc deux registres).
De plus, on peut également lire :
Dans le programme que nous voulons écrire, le nombre de flashes sera faible et un seul octet est suffisant : seul le registre R24 sera utilisé et c’est dans ce registre que la fonction écrite en assembleur ira chercher l’information.
Vous pouvez modifier le nombre de flash (dans le programme, il vaut 4). C’est dans le programme en C que vous le changez à la ligne 10. Ce programme en C appelle une fonction en assembleur à la ligne 19 en passant en argument le nombre de flash. Cet argument est automatiquement stocké dans le registre R24.
Bien évidemment, c’est la fonction en assembleur qui produit les flash en décrémentant le registre R24 jusqu’à ce qu’il soit nul (plus de flash à produire). Ceci est expliqué un peu plus loin :
Comme on l’a dit, le nombre de flashes à produire est contenu dans l’argument passé à la fonction lors de l’appel par le programme C et cet argument est transféré dans le registre R24. Les lignes 18 et 19 montrent que après avoir produit un flash, on décrémente le registre R24 et on recommence la séquence tant que R24 n’est pas égal à zéro. Une fois à zéro, il ne reste plus de flash à produire et on retourne au programme principal grâce au return de la ligne 20.
J’espère que ces quelques explications vous seront utiles. N’hésitez pas à nous solliciter à nouveau sinon.
-