Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Dossier : 10 questions sur le langage machine et l'assembleur
(Article écrit par Edgar Pixel et extrait de Tilt - septembre 1987)
|
|
Le binaire est-il, comme le prétend Edgar Faure, le mariage de la solitude et de la nullité ?
Edgar Pixel, qui sait parler aux machines, présente le dialecte de vos micros.
Comment se présente le langage machine ?
C'est le seul langage que comprennent directement les machines. Il se compose d'une suite d'instructions
aux circuits de l'ordinateur exprimées en binaire se présentant sous la forme d'une suite irrégulière
de 0 et de 1. C'est une succession d'ordres élémentaires accompagnés des coordonnées de l'endroit où
les effectuer : mettre à 0 le contenu de telle zone en mémoire, puis y mettre le contenu de telle
autre zone mémoire, puis y ajouter le contenu de telle troisième zone mémoire, etc.
Quel est le rôle du programme d'assemblage et désassemblage ?
Un désassembleur est le programme qui traduit le binaire utilisé par la machine en la suite de codes
mnémotechniques qu'on appelle couramment assembleur (alors que ce n'est pas rigoureusement exact puisque
l'assembleur est seulement le programme qui assure la traduction entre les versions binaire et
mnémotechnique du langage machine) et souvent aussi langage machine (dans l'expression "programmer en
langage machine"). Le programme d'assemblage effectue une traduction dans l'autre sens.
Les programmeurs en langage machine ou en assembleur utilisent pourtant des lettres et des mots anglais ?
Pour aider les programmeurs, les instructions sont rentrées non pas sous leur forme binaire mais
avec ce code mnémotechnique fait d'abréviations anglaises. Le programme d'assemblage traduit
instruction par instruction.
Certes, mais ma machine comprend le BASIC, il y est même résident !
Ça n'a aucun rapport. Le langage BASIC a été installé à demeure en mémoire morte. Il pourrait
être seulement sur disquette. On pourrait vendre des micros avec un programme de jeu en mémoire
morte, mais si un BASIC peut servir à créer beaucoup de programmes, on se lasserait vite de jouer
à un seul jeu ! Et le Mac SE contient en mémoire morte le portrait numérisé de l'équipe de ses
concepteurs.
On dit que la programmation en assembleur prend plus de temps que dans un autre langage ?
Oui, car une instruction d'un langage évolué se traduit en un grand nombre d'instructions en
langage machine. Ainsi, obtenir un nombre aléatoire est un processus complexe, qui nécessite
plusieurs instructions et beaucoup de travail à la machine. Elle est si utile que les concepteurs
du BASIC ont voulu l'obtenir à l'aide d'une seule instruction : RND.
On dit qu'un programme rédigé en langage machine tourne plus vite. Oui, parce qu'on économise
du travail de la machine en suivant de très près, dès le stade de la programmation, la logique
de la machine.
Peut-on apporter la preuve de ces affirmations ?
Prenons le problème de Syracuse. On choisit un nombre entier. S'il est pair, on le divise par
2, s'il est impair, on le multiplie par 3 et on ajoute 1. On applique le même traitement au
résultat. La suite des résultats successifs forme une série de chiffres qui retombe à 1
après un temps variable, et après avoir atteint des valeurs plus ou moins hautes. Mais il
n'existe pas encore de preuve mathématique qu'en appliquant ce traitement à tous les nombres
on finira toujours par revenir à 1. Si l'on veut tester ainsi beaucoup de nombres, les
calculs deviennent vite assommants.
En BASIC, le processus s'écrit :
IF N MOD 2=0 THEN N=N/2 ELSE N=3N+1
|
Élémentaire ? On fait une boucle en prenant le résultat comme N du cycle suivant.
On imprime N à chaque cycle. Il faut arrêter la boucle dès que N égale 1.
En langage machine, le programme est plus long. Il faut réserver deux registres, A et B.
Dans l'exemple, N=27, on met N en binaire dans A : 00011011. B est vide : 00000000.
Il faut copier A dans B (sinon la machine oubliera quel est le chiffre de départ), puis
on divise par 2, ce qui en binaire revient à décaler A de 1 bit vers la droite : 00001101.
Le chiffre d'extrême droite est mis dans un drapeau de retenue. C'est 1 en l'occurrence.
Si la retenue est 1, c'est que le chiffre était impair, si la retenue est 0, c'est que
le chiffre était pair.
Donc, on teste la retenue : si c'est 0, N était pair et on a dans le registre A N/2. Si
c'est 1, il faut multiplier N par 3 et ajouter 1. Le plus rapide est de copier B dans A,
de l'ajouter encore et de rajouter une troisième fois, puis de rajouter 1. Résultat,
A contient 3N+1. A l'exécution, le programme BASIC exige deux ou trois centaines de
cycles contre 18 ou 20 en langage machine. Dix fois plus rapide !
Mais, quand j'affiche à l'écran les programmes de la plupart des progiciels,
il apparaît une bouillie de codes et de caractères, je n'y reconnais pas les mots
de l'assembleur !
C'est que les langages, y compris le langage d'assemblage, sont programmés avec des caractères
alphabétiques. Ils sont faciles à lire. Mais une fois compilés, c'est-à-dire traduits en
langage machine, ils se réduisent à des 0 et des 1. Le programme d'assemblage désassemblage
retraduit ce binaire en langage lisible. Une tentative de lecture directe interprétera le
programme comme s'il était un fichier de texte et affichera donc une salade de tous les
caractères acceptés par la machine.
Et quel rôle jouent les routines résidentes en langage machine ?
Elles évitent aux programmeurs de reprogrammer des milliers de fois des opérations dont
ils ont besoin pratiquement pour chaque programme. On gagne ainsi du temps de programmation :
il suffira d'appeler la routine. Ces routines sont, en principe, programmées de la façon la
plus dense possible, et avec un soin maniaque. On gagne du temps à chaque fois qu'elles
sont exécutées, ce qui arrive souvent !
Un programme en assembleur de l'IBM PC tournera-t-il sur Amiga ?
Non, il faut des machines strictement identiques, puisqu'un langage machine est spécifique
à un processeur et à une structure de la machine. Il ne fonctionne pas à un haut niveau
d'abstraction, il est totalement incapable de résoudre le problème 1+2=?, mais il
additionne le contenu de l'emplacement mémoire de telles coordonnées qu'on lui fournit
avec le contenu de l'emplacement mémoire de telles autres coordonnées dont on lui indique
l'adresse, il met le résultat dans un troisième emplacement et le dirige vers l'écran par
le chemin qu'on lui aura précisément indiqué.
|