CODING ★ Dr.Watson - Autoformation à l'assembleur par Micro Application ★

Dr.Watson - Autoformation à l'assembleur par Micro Application - Chapitre 01

CHAPITRE 1

POUR COMMENCER

Ayant déjà utilisé un ordinateur auparavant, vous savez probablement que des choses appelées 'code machine' et 'langage machine' existent. Code machine, c'est simplement le langage que le microprocesseur de votre ordinateur, un Z80, comprend. Comme exemple prenez une addition toute simple - ajouter un à 83.

En français vous diriez :

Ajoutez un à 83 ; quelle est la réponse ?

En Basic vous pourriez dire quelque chose comme :

10 LET A=83
20 LET A=A+1
30 PRINT A

En code machine Z80 vous pourriez dire:

3E 53
C6 01
CD 5A BB
C9

C'est parfaitement inintelligible, n'est-ce pas ? hé bien c'est pour cela que nous utilisons le langage assembleur. Le même problème est donné ci-dessous en langage assembleur avec un bref commentaire pour chaque ligne.

LD A,83 ; Charge 83 dans l'Accumulateur 'A'
ADD A,1 ; Ajoute 1 à l'Accumulateur
CALL 47962 ; Mémorise le contenu de A sur l'écran
RET ; Retour du sous-programme code machine

C'est beaucoup plus facile à lire que le code machine, n'est-ce pas? Avec un assembleur vous pouvez entrer votre programme en langage assembleur et vous pouvez le lire et le comprendre plus facilement. tout ce que fait l'assembleur, c'est de convertir le langage assembleur en code machine. Ainsi, lorsqu'il voit 'LD A' il convertit cette commande en code machine '3E' et place cela en mémoire au bon endroit.

Le microprocesseur Z80 contient divers registres, qui sont en réalité des cases mémoire internes, où les données peuvent être stockées. La plupart des instructions du Z80 utilisent ces registres. Un des registres les plus souvent utilisés est l'accumulateur. L'accumulateur est capable de mémoriser des nombres de 0 à 255. Observons maintenant une instruction qui nous permet de charger (LoaD) une valeur dans l'accumulateur.

L'instruction pour cela est :

LD A,n ; Charger (LoaD) dans l'accumulateur la valeur immédiate n

Vous remarquerez que les lettres choisies pour l'instruction reflètent (en anglais du moins) ce qu'elle accomplit. Les instructions de ce type sont appelées 'mnémoniques'.

Il y a plusieurs façons de mettre et de sortir des nombres de l'accumulateur et d'autres parties de l'ordinateur; ces diverses manières sont connues sous le nom "modes d'adressages". la méthode ci-dessus, qui utilise un nombre entré non-modifé, s'appelle "mode immédiat" d'adressage

L'instruction suivante du programme est ADD:

ADD A,n ; Ajouter (ADD) la valeur immédiate n à l'accumulateur

Cette instruction perd le nombre qui suit la virgule, dans laquelle '1' (page 1), et l'ajoute à la valeur contenue actuellement dans l'accumulateur (A). La réponse est placée dans l'accumulateur, en effaçant l'ancien nombre, en l'occurrence 83.

Revenons à cet exemple. L'instruction la plus déroutante est vraisembablement:

CALL 47962

Elle ordonne à l'ordinateur de stocker le contenu de l'accumulateur, 84, sur l'écran - c'est-à-dire d'afficher ce contenu. bien que celui soit tout à fait vrai, ce n'est pas tout.

L'ordinateur possède de nombreux programmes ou 'routines" en code machine intégrés, mémorisés dans ses chips. Sans ceux-ci, il ne serait, par exemple, pas capable de comprendre le BASIC. L'une de ces routines est conçue pour prendre une valeur de l'accumulateur et l'afficher sur un moniteur.

Pour atteindre ces routines afin de les utiliser, on emploie CALL. Dans l'ordinateur, la première instruction de toute routine incorporée est mémorisée dans une case mémoire spécifique, celles ci sont numérotées de 0 à 65535. Le numéro cité précédemment, 47962, est l'adresse en mémoire de la première instruction dans la routine 'inscrivez la valeur de l'accumulateur sur l'écran'.

Bien ! Essayons maintenant d'exécuter un programme en code machine !

Quelques précisions sur l'assembleur : lorsque vous commencez à écrire un programme, il faut dire à l'assembleur à quel endroit vous voulez que le programme soit placé dans la mémoire de l'ordinateur. Pour le moment, l'assembleur décidera où mémoriser le programme. On lui indique cela par la commande ENT.

Ainsi, la première ligne du programme sera :

10 ENT
'
'
programme
'
'

Les programmes en langage assembleur peuvent être lancés (ou appelés) à partir du BASIC ou appelés à partir de l'assembleur en utilisant l'option appel (Call) programme.

Dans l'un ou l'autre cas, il faut dire à l'ordinateur de revenir du code machine au BASIC (le programme assembleur). La commande qui fait cela est RET.

RET ;Retour (RETurn) de la routine code machine

Bon, pour faire notre exemple dans un programme, il faut:

1. Dire à l'assembleur de décider de stocker le programme

2. Charger (LoaD) la valeur immédiate '83' dans l'Accumulateur, soit : 'LD A,83'

3. Ajouter 1 au contenu de l'Accumulateur. La mnémonique pour cela est 'ADD A,1'

4. Appeler (CALL) la routine code machine incorporée pour l'affichage sur l'écran de la nouvelle valeur de l'accumulateur, soit : 'CALL 47962'

5. Retour (RETurn) du programme code machine au BASIC, soit 'RET'

6. Dire à l'assembleur (pas au Z80) que le programme est terminé, en utilisant " @ "

ou

PROGRAMME 1.1 (Ne le tapez pas pour le moment)

10 ENT
20 LD A,83
30 ADD A,1
40 CALL 47962
50 RET

Maintenant pour entrer cela :

a) Charger le programme assembleur dans l'ordinateur de la manière suivante:

Faites un Reset (réinitialisation) complet de l'ordinateur en tenant appuyées en même temps les touches : SHIFT, CTRL et ESC, puis relâchez-les.

2) Rembobinez complètement la cassette (face A).

3) Appuyez sur CTRL et la petite touche bleue ENTER, puis relâchez-les. Le message suivant

devrait apparaître alors sur l'écran:

RUN"

Appuyez sur PLAY puis sur n'importe quelle touche:

Si cela n'apparaît pas recommencer à l'étape 1.

4) Appuyez sur la touche PLAY du lecteur de cassette et appuyez ensuite sur la barre d'espace.

5) Un message apparaîtra alors sur l 'écran après quelques secondes, vous informant que

l'assembleur est en train d'être chargé.

b) Appuyez sur CAPS LOCK afin de taper en lettres majuscules, puis tapez 'I', sans les

guillemets bien sûr, pour commencer à entrer un nouveau programme. Entrez 10 en

réponse au message "Entrez début et incrément",puis appuyez sur la touche ENTER.

c) Un 10 apparaîtra; tapez 'ENT' puis appuyez sur la touche ENTER.

d) Un nouveau numéro de ligne apparaîtra alors,20. Tapez la ligne suivante du programme, 'LD A,83'

et appuyez sur la touche ENTER comme avant. n'oubliez pas l'espace entre 'Ld'et 'A'. Ne mettez

pas d'espace entre la virgule et le nombre, ou à n'importe quel autre endroit.

e) 30 apparaîtra ensuite. Tapez 'ADD A,1', puis appuyez sur la touche ENTER. Là aussi n'oubliez

pas l'espace entre ADD et A.

f) En ligne 40, tapez 'CALL 47962' puis appuyez sur la touche ENTER. Il doit y avoir un espace

entre CALL et 47962

g) En ligne 50, tapez 'RE' et appuyez sur la touche ENTER.

h) Maintenant que nous avons fini de taper le programme, et que nous voulons revenir au mode

commande, appuyez sur @ puis sur la touche ENTER.

i) Maintenant appuyez sur M pour revenir au menu, puis sur L pour lister le programme, en entrant

10 comme numéro de ligne de départ du programme. (Remarque: vous auriez pu sélectionner l'option Liste tout de suite sans passer par le menu.) Le programme devrait alors apparaître comme ci-dessous

10 ENT

20 LD A,83

30 ADD A,1

40 CALL 47962

50 RET

Si pour quelque raison qu ce soit, le programme n'apparaît pas comme ci-dessus, sélectionnez alors le mode de remplacement 'R' et remplacez la ou les lignes contenant une ou des erreurs. Lorsque votre programme apparaît comme ci-dessus, une fois listé, appuyez sur A pour assemblage . L'assembleur

assemblera alors le programme en code machine. Sélectionnez l'option 2.

j) Après que l'assembleur ait assemblé le programme, il retournera à '>'. S'il y avait une erreur

dans le programme, l'assembleur vous en aurait informé. La fonction remplacer ou insérer serait

alors utilisée pour corriger ces erreurs.

k) Pour voir le programme fonctionner, sélectionnez l'option appel de programme.

Si vous vous demandez pourquoi le programme met un T majuscule sur l'écran et non la réponse 84, remportez vous à l'appendice III du manuel du Basic pour l'Amstrad qui indique le 'jeu de caractère ASCII'. Vous verrez que le code de 'T' est 84.

ASCI signifie : American Standard Code for Information Interchange , et

chaque symbole que l'ordinateur peut afficher sur l'écran à son propre numéro de code ASCII. Ainsi, lorsqu'on lui demande d'afficher 84 sur l'écran, la routine appelée par CALL 47962 met le caractère numéro 84 sur l'écran.

Ceci est également vrai pour le BASIC, même pour une addition telle que 'PRINT 83+1'. Dans ce cas, bien que l'ordinateur afficher '84' sur l'écran, il a dû chercher ce que signifiaient les caractères '83+1', faire la somme appropriée et convertir la réponse en utilisant les codes ASCII pour les caractères '8' et '4' . Ceci est en fait relativement compliqué à faire. L'ordinateur a une routine incorporée qui fait cela automatiquement pour le BASIC.

ARCHITECTURE DU MICROPROCESSEUR Z80

Le Z80 possède différents registres autres que l'accumulateur, et nous vous montrons ci-dessus en figure 1.1 un diagramme simplifié de leur disposition :

figure 1.1

-------------------------
! A ! F !
-------------------------
! B ! C !
-------------------------
! D ! E !
-------------------------
! H ! L !
-------------------------
-------------------------
! IX ;!
-------------------------
! IY ;!
-------------------------
! SP ;!
-------------------------
! PC ;!
-------------------------

Architecture simplifiée du Z80

L'accumulateur, ou registre A, vous l'avez déjà rencontré. Il est un peu spécial dans le sens où il y a plus d'instruction Z80 qui peuvent agir sur lui qu'il n'y en a pour les autres registres.

Tous les registres (seulement des positions mémoire dans le microprocesseur Z80) sont des registres de 'huit bits", c-à-d qu'ils ne peuvent mémoriser que des nombres de 0 à 255. Cela ne semble pas terriblement utile, mais il existe des moyens d'utiliser les registres en les combinant pour mémoriser des nombres bien plus grands, comme nous le verrons par la suite.

Les registres H et L pris ensemble sont répertoriés sous le nom de 'pointeur de données principal'. Les registres B et C, et D et E lorsqu'ils sont utilisés en paires sont appelés 'pointeur de données auxiliaires'. Le plus important pour le moment est de savoir que des instructions utilisant H et L sont souvent plus courtes lorsqu'elles sont assemblées en code machine, et par conséquent fonctionnent plus rapidement.

ADRESSAGE IMMEDIAT DES REGISTRES

L'adressage immédiat de l'accumulateur a été observé auparavant, lorsqu'un nombre était chargé dans l'accumulateur en utilisant l'instruction

LD A,83

Une instruction de forme exactement identique peut être utilisée pour charger des nombres de 0 à 255 dans tout autre registre, par exemple :

LD B,83

pourrait charger le nombre 83 dans le registre B.

En général,

Ld r,n ; Charger (LoaD) dans le registre r, la valeur immédiate n.

Le 'r' représente ici n'importe quel registre, soit A, B, C, D, E, H ou L.

ADRESSAGE DE REGISTRE A REGISTRE

Non seulement on peut charger un nombre dans tout registre, mais tout registre peut être recopié dans un autre registre, ou dans l'accumulateur. Par exemple, le programme 1.2 inscrit le nombre 43 dans le registre L, le recopie dans l'accumulateur, et l'affiche sur l'écran : un '+' ASCII.

PROGRAMME 1.2

10 ENT

20 LD L,43 ; Chargement en mode immédiat dans L de 43

30 LD A,L ; Charger dans A le contenu de L.

40 CALL 47962 ;Afficher le contenu de l'accumulateur.

50 RET ; Revenir au BASIC (assembleur)

La ligne 30 contient la nouvelle instruction:

LD A,L

Cela recopie le contenu du registre L dans l'accumulateur:

LD A,L

Cela recopie le contenu du registre L dans l'accumulateur.

un autre exemple pourrait être :

LD B,E

ou

LD C,A

En général,

LD r1,r2 Recopier le contenu du registre r2 dans le registre r1

Quelques auteurs se référent à l'adressage de registre à registre en tant que 'adressage inhérent' et d'autres s'y référent en tant qu'adressage 'implicite'. Si vous utilisez d'autres livres méfiez-vous de leur terminologie, car cela peut prêter à confusion.

Bien, tapons maintenant le programme 1.2. Si vous faites une erreur en tapant une ligne, avant d'appuyer sur la touche ENTER, utilisez la touche DELETE pour effacer l'erreur et tapez la correction. Si vous remarquez une erreur dans la ligne après avoir appuyé sur la touche ENTER, vous pouvez remplacer ces lignes après avoir appuyé sur @ et avant d'assembler le programme.

  1. Charger et lancer le programme d'assemblage s'il n'est pas déjà chargé; si c'est le cas, revenez au menu avec la commande M si nécessaire.
  1. Sélectionner 'I' pour commencer à entrer le programme, et appuyez sur CAPS LOCK pour mettre le mode en majuscule.
  1. Dites à l'assembleur à quel endroit de la mémoire le programme doit commencer, soit : taper 'ENT' et appuyer sur ENTER.
  1. Taper 'LD L,43' et appuyer sur ENTER (appuyer sur la touche ENTER après chaque entrée.)

5. Taper 'LD A,L'

6. Taper 'CALL 47962'

7. Taper 'RET'

8. Appuyer sur @

9. Sélectionner 'L' pour lister le programme: vérifiez-le !

10. Sélectionner 'A' pour assembler le programme.

11. Sélectionner 'C' pour lancer le programme.

Après cela, vous devriez être capable d'écrire quelques programmes tout seul. Essayez le petit exercice suivant. N'oubliez pas d'entrer l'instruction 'RET', autrement l'ordinateur se promènera dans sa mémoire après le programme, à la recherche d'instructions à exécuter. Il trouvera assurément ou presque quelque chose, et ce quelque chose entrainera un 'plantage' du système. En d'autres termes il n'y aura plus d'autre solution que d'éteindre et de recommencer à zéro - et par conséquent de recharger le programme d'assembleur.

EXERCICE 1.1

En utilisant l'adressage immédiat, charger 65 dans l'accumulateur, puis afficher cela sur l'écran. 65 est le code ASCII pour A majuscule. Une réponse possible est donnée dans le chapitre solutions.

CALL 47962 PLUS EN DETAIL

Si cet appel est utilisé plusieurs fois à la suite, plusieurs choses peuvent être affichées sur l'écran dans des positions consécutives.

Essayez ce programme :

10 ENT

20 LD A,72 Charge l'accumulateur avec 'H'

30 CALL 47962 Afficher 'H'

40 LD A,69 Charge l'accumulateur avec 'E'

50 CALL 47962 Afficher 'E'

60 LD A,76 Charge l'accumulateur avec 'L'

70 CALL 47962 Affiche 'L'

80 CALL 47962 Affiche 'L' à nouveau

90 LD A,79 Charge l'accumulateur avec 'O'

100 CALL 47962 Afficher 'O'

110 RET ;Revenir au BASIC

Ce programme devrait afficher le mot 'HELLO" sur l'écran, après avoir été assemblé et lancé.

EXERCICE 1.2

Ecrivez votre nom en haut à gauche de l'écran. Une réponse pour 'FRED' est donnée dans le chapitre solutions.

Ce chapitre est terminé. Ce n'était pas si terrible, non! Maintenant vous devriez savoir ou pouvoir traduire ce qui suit :

LD A,n

LD r1,r2

RET

@

CALL 47962

ADD A,n

Adressage de mode immédiat

Adressage registre-registre.

Et cela ? (r est n'importe quel registre):

ADD A,r

★ ANNÉES: 1985
★ AUTEUR: T. Hebertson
★ CONVERTION: CRACKERS VELUS

Page précédente : Dr.Watson - Autoformation à l'assembleur par Micro Application - Annexe 6
 
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 480 millisecondes et consultée 1683 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.