LOCODUINO

Aide
Forum de discussion
Dépôt GIT Locoduino
Flux RSS

jeudi 25 avril 2024

Visiteurs connectés : 82

L’assembleur (6)

Mélanger assembleur et C/C++

. Par : Christian

Un exemple simple Le programme que nous allons écrire envoie un certain nombre de flashes sur la LED_BUILTIN d’une carte Uno et le certain nombre constitue un argument qu’il faut passer à la fonction écrite en assembleur. Le programme est donc constitué d’un corps écrit avec les fonctions d’Arduino ou en langage C et d’une fonction écrite (...)

Retourner à l'article

Vous répondez à :

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.

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

6 Messages

Rubrique Programmation

Le monde des objets (1)

Le monde des objets (2)

Le monde des objets (3)

Le monde des objets (4)

Les pointeurs (1)

Les pointeurs (2)

Les Timers (I)

Les Timers (II)

Les Timers (III)

Les Timers (IV)

Les Timers (V)

Bien utiliser l’IDE d’Arduino (1)

Bien utiliser l’IDE d’Arduino (2)

Piloter son Arduino avec son navigateur web et Node.js (1)

Piloter son Arduino avec son navigateur web et Node.js (2)

Piloter son Arduino avec son navigateur web et Node.js (3)

Piloter son Arduino avec son navigateur web et Node.js (4)

Démarrer en Processing (1)

L’assembleur (9)

Comment gérer le temps dans un programme ?

L’assembleur (8)

Processing pour nos trains

L’assembleur (7)

L’assembleur (6)

Arduino : toute première fois !

TCOs en Processing (1)

L’assembleur (5)

L’assembleur (4)

L’assembleur (3)

L’assembleur (2)

L’assembleur (1)

TCOs en Processing (2)

Calculer avec l’Arduino (1)

La programmation, qu’est ce que c’est

Types, constantes et variables

Installation de l’IDE Arduino

Répéter des instructions : les boucles

Les interruptions (1)

Instructions conditionnelles : le if ... else

Instructions conditionnelles : le switch ... case

Comment concevoir rationnellement votre système

Comment gérer l’aléatoire ?

Trucs, astuces et choses à ne pas faire !

Calculer avec l’Arduino (2)

Les structures

Systèmes de numération

Les fonctions

Trois façons de déclarer des constantes

Transcription d’un programme simple en programmation objet

Ces tableaux qui peuvent nous simplifier le développement Arduino

Les chaînes de caractères

Les derniers articles

L’assembleur (9)


Christian

L’assembleur (8)


Christian

L’assembleur (7)


Christian

L’assembleur (6)


Christian

L’assembleur (5)


Christian

L’assembleur (4)


Christian

L’assembleur (3)


Christian

L’assembleur (2)


Christian

L’assembleur (1)


Christian

TCOs en Processing (2)


Pierre59

Les articles les plus lus

Les Timers (I)

Les interruptions (1)

Instructions conditionnelles : le if ... else

Ces tableaux qui peuvent nous simplifier le développement Arduino

Calculer avec l’Arduino (2)

Bien utiliser l’IDE d’Arduino (1)

Piloter son Arduino avec son navigateur web et Node.js (1)

Comment gérer le temps dans un programme ?

Les chaînes de caractères

Les Timers (III)