Le C et l'ASM, quelle différence ? - Perfectionnement > Le C et l'ASM - Articles et téléchargements
Le C et l'ASM, quelle différence ? - Perfectionnement > Le C et l'ASM - Articles et téléchargements
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
proposer
 
   
             
 
Catégories
 
   
             
 
Recherche
 
   
 
Articles-et-telechargements > Perfectionnement > Le C et l'ASM > Le C et l'ASM, quelle différence ?

Le C et l'ASM, quelle différence ?

Publié par Charly le 02/04/2013 (6147 lectures)
Première édition le 18/03/2013
Vous verrez souvent des références à du code en "C" ou du code en "ASM" (ou assembleur) pour donner vie à nos micro-contrôleurs préférés.

Quelle est la différence ? Pourquoi programmer en C plutôt qu’en assembleur ?

Cet article a pour objectif de vous aider à comprendre simplement de quoi on parle afin que vous ne puissiez pas dire qu’il y en a un meilleur que l’autre
Vous trouverez quelques liens vers des cours magistraux qui vous aideront à approfondir les deux sujets.

Un µC ça fonctionne comment ?

Pour comprendre il faut revenir aux bases : un micro-contrôleur exécute un programme qui est chargé dans sa mémoire interne sous la forme d’une suite d’instructions. Ces instructions correspondent à des actions que le micro-contrôleur sait réaliser. Elles sont représentées par une succession de valeurs hexadécimales.
Dans nos projets Freescale CodeWarrior, ce fichier sera un .s19 pour les MC9S08 de Freescale. Il contient ces instructions en hexadécimal et est illisible (à moins d’être très bon et d’y passer un temps infini et/ou d’être un pirate).

Ainsi, vous l’avez compris, quand nous programmons nous cherchons à dire "en français" ce qui deviendra de l’hexadécimal, une succession d’instructions dans le micro-contrôleur.

L’assembleur, une TRADUCTION

L'assembleur n’est rien d’autre qu’une traduction des instructions hexadécimales dans un langage compréhensible pour nous les Hommes.

Ainsi pour mettre tous les bits du port A à 0 sauf le premier on écrira :
LDA #$01      ; On charge l’accumulateur A avec la valeur hexadécimale 0x01 
STA $1000    On donne au registre placé à l’adresse 0x1000 (le registre du portAla valeur de l’accumulateur A.

Cela se traduira en langage machine par :
0xA601 et 0xC71000 (respectivement LDA(A6) #$01 et STA(C7) $1000)
(note : "0x" signifie que l'on désigne une valeur hexadécimale)

LDA #$01 (assembleur) ou 0xA601 (opération code), c’est la même chose mais "LDA et STA" se lisent mieux.
Mais ne rentrons pas dans les détails ce ces deux instructions, ce n'est pas l'objet de cet article !

"On charge l’accumulateur A avec la valeur hexadécimale 0x01" Argh, quel rapport avec mon application ? !
Réponse : Le matériel, puisque ces instructions correspondent à ce que la structure du micro-contrôleur sait faire, à ce que les transistors qui le composent sont capables de faire.

La programmation en assembleur implique donc d’une part une parfaite maitrise du matériel, de ses possibilités et de sa structure. Elle implique d’autre part une écriture assez lourde qui imposera au programmeur de réfléchir murement à l’impact de ses instructions sur tout le reste de son programme.
Il existe un assembleur différent pour tous les matériels. Un micro-contrôleur Freescale S08 aura son assembleur avec un package d’instruction qu’il saura exécuter. Un micro-contrôleur Freescale Kinetis Mx aura un autre assembleur, votre PC aura encore un autre assembleur…

Le langage C, COMPILÉ

Le langage C est un langage dit de "haut niveau", qui n’a rien à voir avec un quelconque matériel (Freescale ou autre). On peut avoir le même programme (ou en tous cas une partie) en C pour un pc, un micro-contrôleur Freescale ou un µc de toute autre marque concurrente.

Pour obtenir le programme en hexadécimal qui sera exécuté par le micro-contrôleur il ne suffit pas de faire une traduction mais le compilateur va compiler le programme. Ce compilateur va sélectionner et optimiser les instructions du micro-contrôleur choisi afin d’accomplir la tache décrite par votre programme en C.

Le C offrira d’une part une grande lisibilité à votre programme et d’autre part une portabilité de votre code vers un autre matériel, par exemple un micro-contrôleur plus puissant.

Il existe beaucoup d’autres langages compilés comme le C : Le C++, le Pascal, ainsi que beaucoup d’autres.
D’autres langages de haut niveau comme le C ne compilent pas le programme en langage machine mais génèrent un code "interprété" qui sera exécuté par un moteur sur la machine.
On trouve dans cette catégorie Java, le BASIC (qui peut être compilé aussi) etc mais dans tous les cas nous sommes loin du matériel, comme avec le C, et un outil de compilation va travailler pour donner à manger au matériel.

N’oublions jamais le matériel qui est en dessous…

L’assembleur, qui exploite directement le matériel, permet de contrôler précisément ce qui va être demandé au matériel. Il est ainsi possible d’être plus rapide sur certaines opérations et de garantir la durée de certaines tâches.

Le C est une couche logicielle au-dessus ; le compilateur aura la charge de déterminer à notre place les instructions qui seront exécutées par le micro-contrôleur, mais si on code en C des choses inadaptées aux capacités du matériel on aura les mêmes problèmes qu’en codant directement en assembleur.
Il faut garder également en tête que c’est le compilateur qui va faire le gros du travail en cherchant une successions d’instructions qui répondra au besoin fonctionnel que vous avez décrit en C ; ce compilateur peut être "bon" ou "mauvais", il peut aussi être paramétré, par exemple pour choisir des séquences d’instructions qui rendront votre programme plutôt plus rapide ou plutôt moins gourmand en espace mémoire…

Dans tous les cas, il est donc important pour un débutant de comprendre les bases de l’assembleur afin de cerner ce qu’il est possible de demander au micro-contrôleur et les conséquences que peut avoir son code sur le comportement ou la charge du micro-contrôleur.

On réservera ensuite l’usage de l’assembleur aux quelques situations où on peut profiter de son avantage (précis, proche du matériel). Dans tous les autres cas (la grande majorité) on choisira le C, plus simple, plus flexible, plus lisible et universel (portable).
A noter que l’on peut insérer des fonctions en assembleur au cœur d’un programme en C, on impose ainsi au compilateur le choix des instructions pour une partie du programme. Le choix n'a rien de définitif !

Pour plus de précisions

Lien vers le WIKI de l'assembleur.
Lien vers le WIKI du langage C
lien vers le manuel de référence du CPU08 sur le site de Freescale (on y trouve la description des instructions que le CPU 08 sait exécuter)

A venir : Lien vers un article exemple d'application en assembleur : Faire clignoter une LED.
A venir : Lien vers un article exemple d'application en C : Faire clignoter une LED.

Si ce type d'articles vous a plu, faites-le nous savoir dans vos commentaires (toute critique est également bonne à prendre).

Tags: Débutant   C   ASM  


Article précédent Article suivant
Article précédent Les pointeurs, même plus peur... (Partie 1 sur 2)
Les commentaires appartiennent à leurs auteurs. Nous ne sommes pas responsables de leur contenu.
Auteur Commentaire en débat
Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Le C et l'ASM, quelle différence ? - Perfectionnement > Le C et l'ASM - Articles et téléchargements