# Comparatif : 68000 vs Pentium

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 :

- cs : Code segment
- ds : data segment
- ss : Stack segment
- es : extra segment
- fs : file segment
- gs : gfx 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...

Jace / ST Knights
jace.stk@runnet.com

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 !!!

[Retour au sommaire]