Vous n'avez toujours pas vu de programme, mais on va y arriver maintenant.
 |
3. Sur la programmation |
 |
3.1 Principe de base : W ! |
Si vous avez suivi jusqu'ici, vous pouvez entrevoir la suite : programmer, c'est principalement travailler sur les registres ! On va les modifier, les additionner, les incrémenter ou les décrémenter, les tester, changer ou tester un bit... Sur les 35 instructions, seules 6 n'utilisent pas les registres, et sur ces 6 il y en a 3 que nous n'aurons probablement jamais l'occasion d'utiliser (ici, dans nos programmes Pictrain).
C'est aussi ici que se présente la différence entre nos microP et d'autres gammes de microP plus compliquées (et en général plus chers : chez nous il existe un registre très particulier, appelé W (comme “work” (évidemment), qui est le passage presque obligé de toute opération.
Je m'explique : pour faire une addition de deux registres, A et B par exemple, on ne fait pas A + B, mais on fait comme dans le dessin ci-dessous :
Aucune instruction ne concerne deux registres généraux, mais toujours un registre général et W. Lorsque l'on a compris ce principe, le reste devient facile.
 |
PTI+ Le courrier reçu montre que le calcul en binaire n'est pas la tasse de thé de tout le monde... Donc un petit rappel ?
À la ligne 1 du schéma de notre meuble à tiroirs, le contenu de W au début (c'est n'importe quoi, selon ce qu'on a fait auparavant). Ligne 2 : on mis dans A un chiffre qui nous intéresse, 0010·1101, ce qui correspond à d'43' (43 en notation décimale). En ligne 3 on a fait de même avec ce 0010·1011 qui vaut d'45'. En 4, on a "mouvé" dans le registre de travail W le contenu de A. W vaut 43. Ensuite en 5 on a additionné W et B. En binaire, on additionne de droite à gauche, et en posant des retenues, exactement comme "en français" :
 |
 |
|
On n'ira pas plus loin car, pour plus dur que ça, on utilisera la Calculatrice gratuite de Windows , en "Affichage... Scientifique" et "bouton Bin".
Bien sûr, un bug : elle n'affiche pas les zéros de gauche ! Par exemple 00000101 s'affiche 101. Ça ne modifie pas les résultats, mais ça fait pas sérieux...
Cela dit, on peut vérifier l'addition faite par notre meuble à tiroirs ; taper 00101011, convertir en décimal ("bouton Déc") et voir que ça fait 43. Puisque b vaut 45 en Déc, le résultat est 88. Et 88 ça fait juste 01010000. On ressortira souvent cette calculette, surtout pour les AND et XOR... [Encadré signé Jidé.]
| |
 |
|
|
|
|
 |
3.2. 2 principe de base : les boucles et tests |
Cela, vous devez aussi commencer à deviner : quand je dis plus haut que “je regarde (le microP regarde) si on appuie sur le bouton”, ça se programme :
  Je teste si le bit qui correspond à mon entrée (dans le registre des entrées/sorties) est à 0,
  Si non (non = bit à 1*), je retourne ci-dessus et recommence.
  Si oui (oui = bit à 0*), je fais autre chose, en l'occurrence émettre des ti-ta.
* Non= un, curieux, n'est-ce pas ? Comme dans la note du paragraphe 2.2.2... Il faudra se méfier des réflexes acquis où “non ---> zéro” !
Dans cet exemple tout simple, vous avez les deux instructions de structuration du programme :
  Tester : je regarde si un bit a la valeur 0 (ou 1), et je fais quelque chose dans le cas un et autre chose dans le cas zéro.
  Aller à : je décide d'aller systématiquement à un autre endroit du programme.
ATTENTION à votre entourage : si vous dites à votre petit-fils que vous allez commencer à programmer des microprocesseurs en langage machine (assembleur), s'il sait un peu ce que c'est, il va penser que Papy est tombé sur la tête, mais pourtant vous êtes ici à la pointe du progrès,
En effet, je suis souvent simpliste dans ces pages, et j'essaie de rester vraiment au niveau suffisant pour notre plaisir de ptitrainiste, mais cela s'applique vraiment d'en bas jusqu'aux systèmes les plus sophistiqués, votre P.C. d'abord, mais aussi par exemple aux milliers de microprocesseurs qui sont disséminés dans un T.G.V... |
 |
3.3 Structure d'un programme |
 |
3.3.1. Structure générale |
Il y d'abord deux parties principales :
  Le début : l'initialisation (comme son nom l'indique) permet de mettre en place tous paramètres de notre programme (registres spéciaux), d'initialiser des variables (registres généraux). Cette partie n'est exécutée qu'une seule fois lorsque l'on met le courant.
  La boucle principale : nous avons vu qu'un microP ne s'arrête jamais, et qu'il exécute donc tout le temps des instructions.
Ces cette partie que nous allons retrouver les instructions de notre programme. Cela se présente sous la forme :
Dans le morceau de programme
ci-dessus, vous avez vos premiers éléments de programmation.
  BouclePrincipale : ceci est une étiquette, c'est-à-dire un endroit dans le programme où l'on “saute” d'un autre endroit ; l'étiquette est toujours cadrée à gauche de la feuille.
  Les Instruction1 et Instruction2, décalées un peu à droite.
  goto : votre première instruction, elle indique que le programme retourne (saute) à l'étiquette mentionnée.
Dans l'exécution du programme, le microP commence par l'instruction 1, puis la 2 puis les autres, et arrivé à goto il retourne à l'étiquette BouclePrincipale et recommence sans fin.
 |
3.3.2. La ligne de programme |
Un programme est écrit ligne par ligne, avec une structure de ligne bien précise :
  Les étiquettes sont toujours à gauche, il n'y a rien d'autre sur la ligne (sauf un commentaire éventuel, plus loin).
  L'opérateur, décalé à droite, suivi en général d'un opérande.
  Tout à fait à droite vous avez des commentaires, commençant par un point-virgule.
  Il n'y a toujours qu'une seule instruction par ligne.

Tout cela paraît bien rébarbatif et difficile à suivre, mais continuez, ne vous inquiétez pas, à force de voir et revoir tout cela dans les pages suivantes, ça deviendra un automatisme de pensée. |
 |
PTI+ Les commentaires : On insistera jamais sur l’absolue nécessité de mettre des commentaires dans les programmes, surtout dans les programmes en assembleur.
Les instructions n’ont absolument rien d’intuitif, et comprendre ce que fait un programme rien qu’en lisant ses instructions est presque impossible.
Même celui qui écrit le programme ne se souvient absolument plus ce qu’il a voulu faire deux semaines après ! C’est pourquoi il faut toujours mettre de nombreux commentaires sur toutes les lignes de votre programme. |
|
|
|
 |
3.3.3. Les sous-programmes |
Le sous-programme est un élément clé de la structure des programmes, mais son principe en est simple : il s'agit d'une suite d'instructions que l'on veut exécuter plusieurs fois, à des endroits différents de notre programme.
Par exemple, nous aurons dans notre programme les instructions pour faire le son ti, et d'autres instructions pour faire le son ta.
Mais en plus, je veux faire un son “composé”, par exemple tiii-taaa-ti. Nous allons donc écrire des sous-programmes pour ti (sonTI) et pour ta (sonTA), que nous allons rappeler plusieurs fois.
Les sous-programmes :
et ailleurs dans le programme
nous aurons “l'appel” de ces sous-programmes :
Apparaissent deux nouvelles
instructions :
  call : est l'appel d'un sous programme.
  return : indique la fin du sous-programme,
Comment ça marche :
  pendant l'exécution du programme, le microP tombe sur l'instruction call, et saute à l'étiquette, qui est ici le nom du sous-programme.
  Il exécute le sous-programme, et lorsqu'il trouve l'instruction return, il retourne d'où il est parti, c'est-à-dire à juste après l'instruction call initiale.
Dans notre exemple, le microP arrive sur la ligne 1 (call), saute à l'étiquette sonTI, exécute les instructions jusqu'à return, puis revient ligne 2 (autre call), qui le fait sauter à sonTA, sur return il revient à la ligne 3 et ainsi de suite jusqu'au dernier sonTI d'où il revient à la ligne 6 et continue le programme.
Mine de rien, nous avons ainsi déjà passé en revue trois instructions importantes :
  goto, qui permet de se déplacer dans le programme,
  call et return, qui permettent de structurer les sous-programmes.
Nous allons maintenant pouvoir passer à la première application réelle, le “YouBiTonMatic”, où l'on va continuer de voir les autres instructions dans notre premier programme complet.
|