Version sans JavaScript, en lecture seule : les ateliers, les quiz et l’exécution du code n’y sont pas. Version complète · Catalogue · Se connecter

Support de cours · chapitre 2

Le 68000 et ses premières instructions

Les registres du processeur, la forme d'un programme, les instructions qui déplacent et calculent, et les indicateurs qui résument chaque résultat.

Ce qu'il y a dans le processeur

Les registres

Un registre est une petite case de mémoire à l'intérieur du processeur, bien plus rapide que la mémoire centrale. Le 68000 en a :

RegistresTailleRôle
D0 à D732 bitsregistres de données : on y calcule
A0 à A632 bitsregistres d'adresse : on y range des adresses, pour désigner la mémoire
A7, alias SP32 bitsle pointeur de pile (chapitre 5)
PC32 bitsle compteur de programme : l'adresse de la prochaine instruction
SR16 bitsle registre d'état ; son octet de poids faible est le CCR, qui garde les indicateurs

Le cycle d'exécution

Le programme est en mémoire, comme les données. Le processeur répète sans fin trois étapes :

  1. lire l'instruction à l'adresse contenue dans PC ;
  2. décoder ce qu'elle demande, et avancer PC sur l'instruction suivante ;
  3. exécuter l'instruction.

Un saut (chapitre 4) n'est rien d'autre qu'une instruction qui écrit une nouvelle adresse dans PC.

La forme d'un programme

Une ligne

Chaque ligne a au plus quatre champs, séparés par des espaces :

BOUCLE  ADD.W   D1,D0       ; D0 <- D0 + D1
  • une étiquette (BOUCLE), en première colonne, qui donne un nom à l'adresse de la ligne ;
  • le code de l'instruction, avec sa taille (ADD.W) ;
  • les opérandes, source d'abord, destination ensuite (D1,D0) ;
  • un commentaire, après ; (ou une ligne entière qui commence par *).

Les directives

Certaines lignes ne sont pas des instructions du processeur mais des ordres donnés à l'assembleur, le programme qui traduit le texte en code machine :

DirectiveEffet
ORG $1000le code qui suit est placé à partir de l'adresse $1000
N EQU 10donne le nom N à la valeur 10 (aucune place en mémoire)
X DC.W 12réserve un mot, initialisé à 12, à l'adresse nommée X
T DC.B 'Bonjour',0réserve des octets initialisés : une chaîne terminée par 0
R DS.L 1réserve un mot long, non initialisé
END STARTfin du texte ; l'exécution commence à l'étiquette START

Un premier programme

        ORG     $1000
START   MOVE.W  VAL1,D0     ; D0 <- VAL1
        ADD.W   VAL2,D0     ; D0 <- D0 + VAL2
        MOVE.W  D0,SOMME    ; SOMME <- D0
        SIMHALT             ; arrêt du simulateur

VAL1    DC.W    12
VAL2    DC.W    30
SOMME   DS.W    1
        END     START

C'est un atelier : on peut modifier le code, puis l'exécuter d'un coup ou pas à pas, en regardant les registres changer (ils s'allument) et la mémoire à l'étiquette choisie. Le programme range 42 dans SOMME. Les données sont placées après le code, mais ce n'est qu'une habitude : pour le processeur, tout n'est qu'octets en mémoire. SIMHALT est propre au simulateur Easy68K : il arrête l'exécution. Sans lui, le processeur continuerait et essaierait d'exécuter les données.

Les premières instructions

Déplacer

InstructionEffet
MOVE.t src,dstcopie src dans dst
MOVEQ #n,Dkcharge un petit entier (de −128 à 127) dans Dk, sur 32 bits ; plus rapide
CLR.t dstmet dst à zéro
EXG Di,Djéchange deux registres

Le .t est la taille : .B, .W ou .L. Le # indique une valeur immédiate : MOVE.W #12,D0 range le nombre 12, alors que MOVE.W 12,D0 lirait le mot situé à l'adresse 12.

Calculer

InstructionEffet
ADD.t src,dstdst ← dst + src
SUB.t src,dstdst ← dst − src
ADDQ.t #n,dst, SUBQ.t #n,dstajoute ou retire une petite constante, de 1 à 8
NEG.t dstdst ← −dst
EXT.W Dk, EXT.L Dkétend le signe d'un octet à un mot, d'un mot à un mot long
MULU.W src,Dkmultiplication sans signe : mot × mot, résultat sur 32 bits dans Dk
MULS.W src,Dkla même, signée
DIVU.W src,Dkdivision sans signe du mot long Dk par le mot src : quotient dans le mot bas de Dk, reste dans le mot haut
DIVS.W src,Dkla même, signée

Opérations sur les bits

InstructionEffet
AND.t, OR.t, EOR.tet, ou, ou exclusif, bit à bit
NOT.t dstinverse tous les bits
LSL.t #n,Dk, LSR.t #n,Dkdécalage logique à gauche, à droite, de 1 à 8 positions ; les bits libérés valent 0
ASR.t #n,Dkdécalage arithmétique à droite : le bit de signe est recopié

Décaler d'une position à gauche multiplie par 2 ; à droite, divise par 2. LSR pour un nombre sans signe, ASR pour un signé : ASR.B #1 sur $F6 (−10) donne $FB (−5), alors que LSR.B #1 donnerait $7B (123).

Les indicateurs

Après la plupart des instructions, le CCR résume le résultat en cinq bits :

IndicateurNomVaut 1 quand
Nnégatifle bit de poids fort du résultat est 1
Zzérole résultat est nul
Vdébordementle résultat est faux en signé
Cretenueil y a une retenue (ou un emprunt) en non signé
Xextensionrecopie C, pour les calculs en plusieurs morceaux

Toutes les instructions ne les modifient pas de la même façon. ADD et SUB les mettent tous à jour ; MOVE met à jour N et Z et remet V et C à 0 ; MOVEA et ADDA, qui visent un registre d'adresse, n'y touchent pas.

Ces indicateurs servent aux branchements conditionnels du chapitre 4 : c'est ainsi qu'un programme prend une décision.

Afficher un résultat

Easy68K fournit des services d'entrée-sortie par l'instruction TRAP #15. Le numéro du service est dans D0 ; par exemple, le service 3 affiche en décimal le nombre signé contenu dans D1.L :

        MOVE.W  SOMME,D1
        EXT.L   D1          ; D1 sur 32 bits, signe compris
        MOVE.B  #3,D0       ; service 3 : afficher D1.L
        TRAP    #15