CODING ★ Assembleur ★

Assembleur ACPC n°38 - Assembleur

Pour poursuivre nos travaux sur ce que nous avons passé en revue le mois dernier, voici quelques opérations concernant les transferts de données. Qu'ils concernent la mémoire ou les registres, ils sont une des clefs de la programmation en Assembleur. Continuons donc à observer les caractéristiques de fonctionnement de ces instructions.

Petit récapitulatif avant de continuer notre étude des mnémoniques. Comme il est simple de le voir, mnémonique dérive étymologiquement des mots mnémo (mémoire) et nique (tac-tac). Il est donc aussi simple de s'en souvenir que de se faire avoir. Pour la première utilisation, un pense-bête suffira, pour la seconde, prévoyez des préservatifs. Voici ce qu'il faut effectivement retenir ce tout cela.

— Le seul registre huit bits capable d'être directement utilisé avec la mémoire est l'accumulateur, soit le registre A. Il est donc impossible d'écrire:

LD (MÉMOIRE),B

ou encore:

LD C,(MÉMOIRE)

N'oubliez surtout jamais que les registres seize bits sauvés vers la mémoire ou chargés à partir de celle-ci réagissent à la règle de l'inversion de leur poids fort et faible. Ainsi, si nous écrivons:

LD HL,1
LD (40000),HL

Nous nous apercevons par un simple Peek sous Basic que l'adresse 40000 ne contient pas 0 mais 1, ce qui nous prouve l'inversion des deux registres H et L en mémoire.
Nous vous conseillons assez vivement de vous attaquer à l'hexadécimal. Il n'est pas obligatoire de connaître parfaitement ce système numérique, mais il est tellement pratique de l'utiliser que c'est du gâchis de ne pas le faire.

C'EST HEXA, MON GENERAL

Si les hommes comptent en base dix, c'est parce qu'ils ont dix doigts. Si les micro-ordinateurs comptent en base seize, c'est parce qu'ils ont huit bits (ouarf, ouarf, ouarf). Personne n'est parfait sur cette terre et tout un chacun se doit de respecter son prochain. Je pense que la valeur huit a été choisie arbitrairement par les premiers informaticiens. Après tout, huit n'est-il pas le cube de deux? Il permet de plus le codage de deux cent cinquante-six possibilités numériques binaires, ce qui est amplement suffisant. Le fait est que nous devons travailler avec et respecter les règles fixées. Comment compter en hexadécimal? C'est très simple et en voici un exemple:

0,1,2,3,4,5,6, 7,8,9, A, 8, C, D, E, F, 10, 11 ...48,49, 4A, 4B ... FE, FF, 100, 101, etc.

L'avantage de cette base est qu'elle colle parfaitement aux environnements des micro-ordinateurs. Elle permet de connaître directement la configuration binaire de l'octet donné. Voici un exemple:

A 6
1010 0110

La valeur A est codée en binaire 1010 (8+2) et la valeur 6, 0110 (4+2). Seuls deux caractères sont ainsi nécessaires au stockage de n'importe quel résultat huit bits. Il en va de même pour les seize avec quatre caractères:

F C 3 5
1111 1100 0011 0101

Nous pouvons aussi aborder la notion. de quartet, soit quatre bits tout simplement remplaçables par un caractère hexadécimal.
En mathématiques et en toute base, l'élévation d'un caractère est relative à sa position dans la chaîne, cela en partant de la droite. Ainsi, en base 10 :

143 = 1 *102 + 4*101 + 3*100

Le poids de 3 étant 0, celui de 4, 1 et celui de 1, 2. En binaire, base 2, nous pouvons écrire:

1101 = 1*23 + 1*22 + 0*21 + 1*20

En base seize, nous dirons:

F2 = F*161 + 2*160

Il nous suffit alors de remplacer F par sa valeur, soit 15 et le tour est joué. Avec cette méthode, il vous est possible de décoder un nombre hexadécimal de n'importe quelle taille.

Voici les règles de conversion de la base dix à la base seize:

  • tant que le nombre est supérieur à 15, - effectuer le modulo de 16,
  • poser le reste à droite dans la chaîne résultat,
  • effectuer la division entière du nombre par 16,
  • fin de la boucle et poursuite à « tant que » 1 e ligne.
  • En dernier lieu, déposer le nombre à gauche de la chaîne.

Pour ce genre de manipulations, vous disposez de deux commandes sous Basic. La première permet de passer de l'hexadécimal au décimal. Il suffit simplement de demander l'affichage d'un nombre, comme par exemple:

PRINT &100

Malheureusement, PRINT affichera obligatoirement une valeur négative si le nombre hexadécimal est supérieur à &8000. C'est en ce sens que nous vous proposons un petit programme Basic de conversion, simple comme bonjour et permettant de travailler sur des valeurs astronomiques non signées. La seconde fonction Basic est HEX$. Si vous lui passez un nombre en paramètre, elle se fera un plaisir de vous le traduire en chaîne hexadécimale formatée.

PRINT HEX$(18,4)

Comme il lui arrive aussi de poser des problèmes du style. Overflow, voici un petit programme Basic qui vous sera fort utile dans certains cas. Il permet la conversion de base seize en base dix. Voici son principe de fonctionnement.

  • Pour chaque caractère dans la chaîne hexadécimale,
  • multiplier le résultat par 16,
  • additionner le poids du caractère au résultat.
  • Continuer jusqu'à la fin.

Voici de quoi abreuver vos cerveaux en mal de connaissances mathématiques Etudiez quelque peu les programmes Basic fournis et vous n'en serez que plus renseignés sur les modes de conversion entre bases.

MÉMOIRE ET REGISTRES

Nous vous avons parlé des registres simples (huit bits), des registres doubles (seize bits), mais pas encore des registres d'index. Dans le zao, ils sont au nombre de deux et se nomment IX et IV. Contrairement à leurs compères précédemment cités, ils sont formés de seize bits mais ne sont pas dissociables en registres simples. Lorsqu'on les charge à partir de la mémoire, ils réagissent comme les autres, tout aussi soumis à la règle de l'inversion de poids. Si par exemple l'adresse 40 000 contient 1 et l'adresse 40 001 contient 0, l'instruction LD IX,(40000) chargera IX avec la valeur 1. Le comportement de IY est parfaitement similaire. Ces registres permettent bien des péripéties mais ne sont pas si pratiques qu'il y paraît, Voici quelques exemples d'utilisation.

  • LD IY,( 10000) ; charge IX avec le mot contenu à l'adresse 10000.
  • LD IY.20000 ; charge IY avec la valeur immédiate 20000.
  • LD (30000),IY ; sauve le registres IY à l'adresse 30000 en suivant la règle de poids bien connue.

Ils permettent d'accéder directement à une plage indexée. Indexer signifie opérer un décalage à partir d'une base donnée. Sur Cpc, ce mode d'adressage n'est pas ce qu'on peut franchement appeler de l'indexation. En effet, il est seulement possible d'opérer un décalage de -128 à +127 relativement au contenu d'un des registres de base. Voici le mode d'utilisation en précisant toutefois que VAL est une valeur fixe comprise entre -128 à +127.

  • LD A,(IX+VAL) : charge dans A le contenu de l'adresse pointée par VAL plus IX ou l'équivalent Basic: A = PEEK (IX + VAL).
  • LD (IY+VAL),B : replace-le contenu de l'adresse pointée par le registre IY additionné à VAL par le contenu du registre B. L'équivalant Basic serait: POKE IX+VAL,B.

Il est ainsi possible de loger n'importe quel registre simple (A. B, C, D, E, H, L) en mémoire par cette commande.

Il n'existe pas de commande pour charger le contenu d'un registre double avec un registre d'index ou inversement. Seule pratique momentanément envisageable : passer par une cellule mémoire temporaire.

LD (40000),HL
LD IX,(40000) .

et voilà que IX contient HL. Nous verrons plus tard des moyens plus rapides et plus courts de procéder à ce genre de manipulation. Nous en avons fini avec les échanges entre mémoire et registres en tout genre. Nous en saurons encore plus le mois prochain.

FAUT PAS POUSSER

Le mois prochain, nous aborderons la pile et quelques instructions qui nous permettrons de pénétrer plus loin dans le monde de la programmation en Assembleur. Si les quelques instructions que nous vous avons données vous paraissent vagues ou peu concrètes, sachez que Rome ne s'est pas fait en un jour et qu'il faut certaines bases importantes avant de pratiquer l'Assembleur de manière relativement efficace. Sur ce, nous vous souhaitons de passer de longues heures de programmation en Basic. Entraînez-vous déjà à utiliser PEEK et POKE au maximum. Cela ne pourra que vous faire du bien.

5 REM Hexadéci
10 DIM h$(15)
20 FOR i=9 TO 15:READ h$(i):NEXT
30 DATA 9,1,2,3,4,5,6,7,B,9,A,B,C,D,E,F
40 n=9
50 INPUT "Nombre hexadécimal? ",v$
60 v$=UPPER$(v$)
70 FOR i=l TO LEN(v$)
80 z=16
90 FOR j=9 TO l5
100 IF MID$(v$,i,l)=h$(j) THEN z=j
110 NEXT
120 IF z=16 THEN PRINT " Erreur !!!":RUN
130 n=n*16+z
140 NEXT
l50 PRINT "Nombre décimal: ";n
160 PRINT
170 GOTO 40


5 REM Décihexa
10 DIM h$(l5)
20 FOR i=9 TO lS:READ h$(i):NEXT
30 DATA 0,1,2,3,4,S,6,7,B,9,A,B,C,D,E,F
40 v$=""
50 INPUT "Nombre? ",0
60 WHILE n>l5
70 q=INT(n/16)
80 r=n-(16*q)
90 n=q
100 v$=h$(r)+v$
110 WEND
120 v$=h$(n)+v$
130 PRINT" Résultat hexadécimal: ";v$
140 PRINT
l50 GOTO 40

Poum et Sined

Page précédente : Bidouilles ACPC n°37 - Gestion de la matrice de caractere

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Bidouilles ACPC n°14 - Les secrets du GATE ARRAY (1/2)
» Coding » Bidouilles ACPC n°13 - Bidouilles pas bidon - MODE 1 en 13 couleurs
» Coding » Bidouilles ACPC n°17 - Le catalogue AMSDOS
» Coding » Assembleur ACPC n°46 - La multiplication et la division
» Coding » Bidouilles ACPC n°42 - La decompression
» Coding » Bidouilles ACPC n°31 - RSX
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 409 millisecondes et consultée 2251 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.