J'ouvre ce fil suite à la remarque pertinente de notre ami F6FCO qui a écrit :
F6FCO] a écrit (cf. encore des soucis avec MPASM)
... Bon, vous arrivez à faire du C dans l'assembleur
On apprend çà ou ? pas vu dans les cours de Bigonoff, il y a un tuto quelque part ?
Ce n'est pas courant mais c'est tout à fait possible et pour cela il faut bien maîtriser le modèle mémoire sur lequel s'appuie le compilateur C, s'assurer que c'est [très bien] documenté et tester dans un premier temps des cas vraiment simples ;-)
Pour les PIC18, c'est assez bien documenté bien que je ne l'ai jamais mis en œuvre - cf. MPLAB® C18 C COMPILER USER’S GUIDE - § 3.2 CALLING CONVENTIONS - pages 43-47 [Adobe reader pages 51-55]
En effet, la norme du langage C n'impose pas la manière avec laquelle les méthodes sont appelées et en particulier comment les arguments sont passés (dans l'ordre naturel, dans l'ordre inverse, en vrac, par registre, dans la pile, par mémoire, en plastique, en verre, etc.) et enfin comment le retour des méthodes est effectué. En résumé, les compilateurs font ce qu'il veulent et je ne parle pas de l'optimiseur qui pourrait réorganiser tout cela suivant son humeur ...
Tout repose donc sur le bon vouloir de l'éditeur du compilateur qui, en plus, n'est pas obligé de [bien] documenter sa cuisine interne ;-((
C'est pour cela que c'est assez délicat et de plus, le code écrit ne sera pas portable d'un compilateur C à un autre.
J'utilise à l'occasion SDCC - Small Device C Compiler (pour en extraire de "courtes" séquences de code [assembleur] générées que je ne souhaite pas écrire directement en assembleur ;-). Ce dernier a une toute autre stratégie que MPLAB® C18 car il s'adresse en particulier aux PIC16 qui n'ont qu'une pile d'appel de 8 niveaux dédiée aux appels / retours de fonctions et non à l'empilement / dépilement de données variables (retlw dépilant une donnée constante ;-)
Maintenant, si appeler du C à partir de l'assembleur est possible et donc s'appuyer sur un projet forcément décrit pour le C, il faut mieux faire l'inverse et insérer le code assembleur dans le code C avec le couple de directives _asm / _endasm quitte à reprendre le code assembleur d'une méthode générée à partir du C car les compilateurs C produisent maintenant, vraiment du code compact et très optimisé mais en conséquence ... illisible ou presque (j'adore !...)
Nous sommes peut-être la dernière génération qui a l'immense privilège d'écrire, de voir et de contrôler ce que le µC exécute
Profitons-en (cf. L'intelligence artificielle va t-elle tuer les développeurs ? ;-))