Beaucoup d'entre vous sont attirés par la puissance du PC. Il
est vrai que cette machine a de quoi faire envier tous les
possesseurs d'Atari que nous sommes: MHz à profusion, mémoire à
coups de Mo, son sur n voies en 3D, millions de couleurs à des résolutions
folles... Pfiouuuu...
Mais bon, prenons cette machine sous une autre approche, qui
fit le bonheur des coders sur ST : la programmation en assembleur.
Bon, eh bien là je vous assure que je n'échangerais pas mon bon
vieux 68000 contre un pentium !!! Vi ... vous ne le croyez pas? Eh
bien on s'en va comparer les deux bêtes... Attention : ceci est
une comparaison sommaire. Il y a plein de détails qui ne seront
pas cités car il me faudrait écrire un bouquin entier. Beaucoup de
possibilités des Intel ne seront pas citées ici car non utilisées
sauf dans des cas précis tels le système d'exploitation (pour la
protection de la mémoire ou encore la gestion de la mémoire
virtuelle, ce que font les 68030 et +). Cette approche est
très orientée vers la programmation pure et dure d'un programme courant
comme une démo ou bien un utilitaire (faudrait être fou pour faire
autre chose en asm à but non commercial! ;-)... De plus nous nous
attacherons à une compatibilité 486 au niveau de la comparaison :
la majeur partie des programmes du marché le sont ! (Il est
d'ailleurs fortement conseiller de coder avec les spécificités
486 !)
Le 68000 à été conçu il y a fort longtemps : en 1979... le
Pentium en 1993... plus de 10 ans séparent les deux composants...
des millénaires à l'échelle humaine.... eh bien malgré les différences de conception je peux vous dire que 68000 est toujours
aussi attractif... L'architecture de notre bon vieux Motorola a
jeté un pavé dans la mare des microprocesseurs de l'époque. En
effet, alors que tous les autres n'étaient encore que sur 8 bits,
voire 16, le 68000 montrait fièrement ses registres de 32 bits,
son adressage sur 24 bits (16 Mo, à l'époque on se demandait à
quoi ça pouvait servir !!!), et son bus asynchrone qui contrastait
beaucoup avec ceux des 8086, Z80, etc... Je tiens à dire que le
Pentium, jusqu'en 1997 était toujours en mode synchrone et du coup
perdait pas mal de temps sur le bus... (voir l'article à ce sujet
dans ST Mag)
Regardons de plus près l'architecture interne des Intel, plus
particulièrement les registres que nous utiliserons dans nos
programmes. Les Intel possèdent un grand nombre de registres.
Quelques uns ne seront pas traités dans cet article car ils ne servent
que dans des cas bien précis qui n'entrent pas dans notre
comparatif. Nous allons nous attarder plutôt sur les registres
généraux et registres de segment qui composent 99,99999% de nos programmes.
Les registres généraux sont au nombre de 8 sur Intel, sur une taille de 32 bits (à partir du 386) :
ax : l'accumulateur si : l'index pointer bx : le registre de base di : destination pointer cx : le compteur sp : stack pointer dx : le registre de données bp : base pointer ip : instruction pointer
Parmi ces registres, quatre seulement peuvent etre décomposés en plusieurs parties pour pouvoir les utiliser en différentes tailles 8, 16 ou 32 bits. Ils sont appelés registres de travail.
Pour ax poids fort : ah poids faible : al bx bh bl cx ch cl dx dh dl
On rajoute un -e- (extension) pour l'utiliser en 32b: exemple
eax. Ah ahhh... oui c'est un peu déroutant mais c'est parce qu'il
faut garder la fameuse compatibilité avec les vieux 8086. De plus,
comme vous l'avez bien lu, chaque registre a une fonction définie:
CX est le seul à etre autorisé comme compteur de boucle. Par ex.:
DBRA Dx,etiquette ne peut être que LOOP etiquette car cx seulement
peut être compteur et sera décrémenté! BX et BP sont des registres
de base et servent un peu à tout : indexer une table, additionner,
etc. AX est l'accumulateur. Pour les multiplication et division on
est obligé de passer par lui et le registres DX. Ne comptez pas
faire un MUL BX,12 sans multiplier le tout implicitement par AX.
Sur un pauvre 68000 on peut multiplier n'importe quoi par
n'importe quel registre. De plus, sur 68000 tout est 32 bits
depuis le
début et ça marche très bien... Un registre de données peut être à
la fois compteur, accumulateur etc. Toujours pas convaincu ?
Il nous reste SI et DI, SP ,IP ! Eh bien les registres d'adresses sont-ils inexistant sur Intel ? Pas sous la forme que nous connaissons sur Motorola. L'adressage de la mémoire se fait par pages de mémoire en mode réel. Du coup, pour avoir une adresse, il faut utiliser 2 registres : les registres d'offset et registres de segments de mémoire. Cela revient à peu près à faire de l'indexé (a0,d0.w) sur 68000 (a peu près !). Comme les registres d'offset ont été étendus à 32b avec le 386 ( -e- ) on peut donc adresser 4 Go de mémoire mais cette fois-ci en mode protégé. A ces quatres registres, s'ajoutent aussi les registres généraux. En effet ceux-ci peuvent être utilisés en tant qu'offset. C'est un peu comme si on pouvait faire MOVE.L D0,(D1)+ sur 68000 ! Voici la liste des fameux registres de segment :
Les offset et segment sont liés mode réel . Pour calculer une
adresse il faut faire : "RegSeg * 256 + RegOff" par ex avec ds =
$b000 et bx=$0123 on a adresse=$b0123. En mode protégé, il suffit
d'utiliser l'adresse 32 Bit comme sur 68000. Le registre de
segment sert à paramétrer la page de mémoire protégée qui va
être adressée.
C'est alors que l'on commence à comprendre pourquoi un 68000
est plus agréable que les Intel ! En effet sur notre cher Motorola
vous avez 8 registres d'adresse + 8 registres de données + 1
pointeur de programme = 17 contre 9 registres généraux + 6
registres d'offset. A cela le fait que si on utilise un registre
de travail en registre d'offset, on se retrouve bloqué pour le traitement des
données. Et que les registres de segment ne peuvent pas prétendre
à une utilisation de registre général ! Bref vous l'avez compris,
on est bien loin de la simplicité et la souplesse d'un 68000 .
Souplesse ? Le mot est jeté ! Je vais vous décrire quelques
instructions d'une grande importance que tous les programmes utilisent: les instruction de manipulation de chaînes. Si vous voulez
recopier les données d'un tableau vers un autre, il vous faut en
effet soit transiter par un registre de travail, par exemple eax :
mov eax,gs :[si]
mov es :[di],eax
En effet, il est impossible de faire des transferts mémoire
directs du style "mov es :[di],es :[si]" à la manière de l'archi
connu "move.l (a0),(a1)". La seule solution est d'utiliser l'instruction MOVS(t) (t pour taille) qui oblige de passer par les
couples de registres DS :SI et ES :DI.
Sachant que le si le segment de donnée du programme est
adressé par le registre ds et que la donnée source soit autre
part, il vous faudra le sauvegarder, l'initialiser et ensuite le
restaurer. De plus, cette instruction affecte le registre AX
car elle fait transiter la donnée implicitement par ce registre.
Bref, on est pas sorti de l'auberge... De même pour les
instructions de
chargement de tableau LOAD et rangement STOS qui utilise toujours
ax et respectivement les couples DS :SI ou ES :DI pour l'adressage
mémoire. Pour le 68000 pas de problèmes : "clr.l (a0)+", "move.l
#0,(a0)+", la liste des possibilités est longue et on n'utilise
qu'un ou 2 registres à la fois...
La plupart des instructions de manipulation de données en
mémoire vont donc nous obliger à utiliser obligatoirement tel ou
tel registre. Ce qui n'est pas le cas avec un simple 68000. Ce fut
pour moi le plus grand choc lorsque je suis passé sur PC. J'ai
alors cru que j'utilisais un vieux 6809 !!!
Mais les Intel permettent des possibilités d'adressage que
l'on retrouve dans la descendance du 68000. Il est possible de
multiplier un registre d'offset par un nombre lors de l'indexage
mémoire : "es :[DI+BX*2]". Le programmeur Falcon va me dire tout
fort : ça existe sur 030 ! Oui... ce qui prouve que les Motorola
ont aussi su évoluer.
Je n'ai pas traité du coprocesseur arithmétique car il bien
qu'il soit intégré à partir du 486, il est aussi disponible sur
68000 en option! Mais tout bon optimisateur sait que l'utilisation
de tables précalculées est grandement plus rapide que le calcul
d'une fonction F(x)=sin(x) sur copro !
Le Pentium est plus puissant que le vieux 68000 du fait de sa
conception et sa fréquence... Y a pas photo. Mais qu'on vienne pas
me dire que la programmation est plus cool que sur notre 68000. On
perd généralement un temps fou à cause du manque de registres. Du
coup qu'est que ca serait le 68000 s'il était fabriqué comme un
Pentium ? Eh bien c'est ce qui se passe avec le 060 (qui équipe le
HADES) qui intègre toutes les nouvelles technologies en matière de
conception de chip : architecture super-scalaire qui permet
d'exécuter TROIS instructions par cycle d'horloge (argh!) pour les
instructions générales, pipe-line, mémoire cache, bus à haute
fréquence, faible surface de gravure qui permet une faible
consommation et du coup des fréquences élevées. Du coup, on ne s'étonnera
pas de le voir tourner plus vite qu'un Intel à fréquence égale
voire inférieure. En effet, le nombre de registres et le jeu
d'instruction souple du 680xx en sont beaucoup pour quelque chose.
(Motorola donne un chiffre impressionnant de 100Mips pour un 060 à
66 Mhz !!! Quand on pense que le 68000 est à 1 Mips à 8 Mhz)
J'espère vous avoir convaincu que notre bon vieux ST est
toujours une machine formidable, surtout pour l'apprentissage
de l'assembleur. En effet je crois que si beaucoup plus de gens se
mettaient d'abord à coder sur ST, ils auraient beaucoup plus de
facilités (et seraient moins dégoûtés de l'asm!). C'est en effet
moins tordu.
Je vous prépare un petit article sur le meilleur
microprocesseur que j'ai vu : Le POWER PC. "Ou comment Motorola a
enfoncé le
clou !". Pareil, je me limiterais à une description sommaire de la
bête... Mais avec suffisamment de détail pour vous allécher...
Sources (pour ceux qui ont toujours envie de connaître l'affreux
Intel) :
- Mise en Oeuvre du 386 (C. Viellefond encore elle !!!) chez Sibex
- Processeur & Coprocesseur chez Dunaud Tech (pour les 486 et +)
- Assembly Programming on IBM PC (Ytha Yu & Charles Marut), ed Mac
Graw Hill (ça c'est pour débuter)
Et bien sûr :
Mise en oeuvre du 68000 (Catherine Viellefond) chez Sibex
ZE BOUQUIN !!!