CODINGHEBDOGICIEL ★ FORMATION A L'ASSEMBLEUR PRATIQUE ★

La page pédagogique d'hebdogiciel 116: Registres et adressageCoding Hebdogiciel

OÙ L'ON COMMENCE DANS LA JOIE

La possibilité d'employer Poke vous permet une utilisation extrêmement diversifiée de votre ordinateur si vous savez vous en servir; et aussi d'énormes possibilités de destruction al vous ne savez pas. S ma mettez une valeur erronée dans une adresse incorrecte, il est très facile de perdre de longs programmes que vous avez mis des heures à entier.

Ce magnifique extrait sort directement du manuel Spectrum (page 188 pour les incrédules). Mais c'est pas grave. J'espère que vous ne craignez plus le POKE de la mort maintenant.

HEXA-GÉRATION

L'hexa. vous savez ce que c'est. Vous n'ignorez rien de ce système numérique à 16 signes (la base 16) où A égal 10 décimai, B = 11, C-12, D=13, E« 14, F=15. Aussi n'en partons pas. Nous n'insisterons pas sur ce système numérique très pratique pour programmer directement le microprocesseur. Il permet de connaître aisément les valeurs à placer dans la mémoire pour stocker un nombre supérieur à 255. Rappelons-nous, par contre, que l'octet le plus significatif a une adresse plus grande que l'octet faible.

Heing ? Vous n'avez pas suivi ? Combien ça fait en décimal, $201 (le $ signifie hexa) ?

513. Gagné. Et comment vous y prenez-vous pour stocker $201 à l'adresse $9000 par exemple ? Bon on sait, vous n'avez pas l'hexa sur votre Spectrum d'origine. Chargez alors un assembleur qui se respecte. Pour mémoriser $201 en $9000, il faut mettre $01 en $9000 et $02 en $8001. $0201 devient $02 et $01, c'est pas mal. Mieux que page 197 du manuel : POKE n,v-256* INT(v/256) : POKE n+1,INT(v/256). C'est, entre autre, pour ça qu'on bosse en hexa. Alors entrainez-vous : 0, 1. 2, 3,4,5,6, 7, 8, 9, (non pas 10), A, B, C, D, E, F, 10, etc..

EAU BINAIRALE

On peut, grâce A l'hexa, visualiser facilement ht représentation binaire d'une valeur hexadécimale. Un octet, c'est deux quartets (un quar-tet étant un groupe de quatre bits). On peut avoir en tête (ou sur le papier, a portée de la main, c'est mieux) le tableau suivant :

HEXA    BINAIRE
----------------
 0       0000
 1       0001
 2       0010
 3       0011
 4       0100
 6       0101
 6       0110
 7       0111
 8       1000
 9       1001
 A       1010
 B       1011
 C       1100
 D       1101
 E       1110
 F       1111

Par exemple $FE- 1111.1110 binaire (avec $F = 1111 binaire et $E = 1110 binaire). OK pour l'hexa. mais qu'est-ce-qu'on peut bien faire avec ça ? Des programmes en LM ( langage machine ) encore une fois. Vous pouvez demander à votre ZB0 de lire comme un programme ce que vous avez rangé dans vos précieux octets, par la fonction USR du Basic. Si vous avez placé un programme en $9000. dites au microprocesseur de l'exécuter, A partir du Basic, par RANDOM1ZE USR 36864 ($9000 - 36864). PRINT USR 36864 affichera lo contenu des registres BC quand le programma rovlondra au Basic (en vous rendant la main).

REGISTRIONS

Des registres ? Qu'est-ce ? Ce sont des emplacements de  stockage supplémentaires situés dans le microprocesseur et très importants : c'est avec eux que le Z80 travaille le plus rapidement. Un registre, en assembleur, est à peu près utilise comme l'est une variable en Basic. Donc ça peut servir de savoir que votre Z80 dispose d'une vingtaine de registres ( ceux qui ne veulent pas savoir, dehors ! ). Pour différencier ces registres, on les nomme par une lettre. Certaines opérations ne peuvent se faire qu'avec un registre ou une paire de registres bien déterminés. C'est pourquoi vous utiliserez :

A (autrement nommé accumulateur) pour stocker une valeur que vous allez trimbaler ou travailler avec tout plein de calculs.

HL ( c'est une paire de registres ou encore un registre double ) pour mémoriser une adresse. Notons que H est ta première lettre de High et L de Low ( donc la partie basse d'une adresse est a placer dans L et la partie haute dans H; l'hexa vous y aidera ).

DE et BC sont deux paires de registres à usages divers. Mais BC est bien souvent utilisé comme compteur pour las boudas et DE comme valeur de déplacement Sinon, on a aussi un registre F (F comme Flag). On verra qu'il sert surtout pour les équivalents an assembleur des IF ... THEN ... du Basic.

A, F, H, L,  B, C,  D, E sont des registres 8 bits (j'espère que maintenant je n'ai pas besoin d'an dire plus pour que vous compreniez ce que je vaux dire par "registres 8 bits".
Sinon RAND USR au premier cours ). Ceux-ci. donc, ont de plus un double nommé par la même lettre a laquelle on ajouta un '. Horreur, enfer et damnation : vous n'aurez pas simultanément accès à un registre simple et son registre auxilliaire (A et A' par exemple). Dans la pratique, on utilise rarement les registres primés.

D'autres registres? Oui, R, par exemple, qui sert A rafraîchir la mémoire (quand elle a soif de Jus pour ne pas s'évanouir, cette foutue RAM) et qui est utilisée par le programmeur comme un générateur de nombres aléatoires B bits.

PC, la compteur ordinal (en anglais : Program Counter), est un registre 16 bits qui, comme son nom l'indique en anglais, sert au Z80 A pointer l'adresse contenant le code à exécuter.

IX et IY sont deux registres 8 bits, dits registres d'index, et servent au travail dans des tables organisées Mais pas touche à IY pour l'instant.

PILE Y PILI

Il y a encore SP, registre 16 bits, pointeur de pua (Stack Pointer). Non, la pile n'est pas ce que voua pensez. C'est un espace de RAM, Visé par SP. tt particulièrement utilisé. Elle sert au processeur au stockage des adresses de retour pour les équivalents assembleur des GOSUB Basic. En outre, ollo permet de conserver, momentanément mais rapidement, les valeurs des registres que l'on vaut utiliser puis rétablir. On peut dire aussi qu'uno mauvaise utilisation de ta pile est la plus fréquente source de plantage (un plantage ? Vous saurez bientôt ce que c'est I). La pile a une structura LIFO (Last In First Oui)... C'est-à-dire que la denière donnée posée sur ka pile sera la première à en être enlevée

AS SANS BEURRE

Voyons tout do suite deux Instructions assembleur : PUSH et POP. PUSH met dans la pila, POP extrait do la pilo une valour. Pour rigoler, manipulons un peu la pile et doux registres, lo registre double BC au hasard. Introduisons l'usage d'un assembleur. Vous devez an pirater un, dès malntena/TL, oaron va commencer a s'amusor et rien no vaut un assembleur pour triturer votre Z80. Encore un peu do vocabulaire ; le programme que vous allez écrire sous le contrôle de l'éditeur de votre assembleur (écrit en assembleur et composé de mnémoniques) s'appelle un source. Un* fois assemblé (Vassemblage est l'opération qui transforme les mnémoniques en codes machine et qui les place en mémoire), vous en obtiendrez le programme objet. Alors premier programme en assembleur:

ORG X    (X est à déterminer selon l'assembleur)
PUSH BC
POP BC
RET

Regardez le contenu de la mémoire A partir de l'adresse X avant l'assemblage de ce programme (sans le savoir, vous faites un DUMP de la mémoire). Assemblez votre programme puis regardez-la A nouveau. Ça a changé n'est-ce-pas 7 C'est l'objet de votre petit source qui sa trouva là. C'est la commande ORG qui a précisé cet emplacement d'assemblage. Les valeurs lues A partir de X constituent un petit programme et forment une suite de codes machine. Et ce programme, que fait-il ?

ESSPLICASSIONNES

Supposons que vous sortiez du contrôle de votre assembleur et reveniez au Basic, tout ça sans éteindre la machine (vous devez avoir une commande pour se faire). Faites un RAND USR X. Voua constatez... Qu'il ne s'est rien passé. Mais que si ! Votre Spectrum est toujours aouavotre contrôle I C'est déjà pas mal, vous verrez. Traçons les commentaires de l'exécution de ce programme (le mode TRACE peut être une possibilité de votre assembleur, il permet de visualiser la suite d'opérations effectuées par le 280 on exécutant votre programme instruction par instruction).

PUSH BC a empilé la paire de registres BC II place B A l'adresse SP-1 et C A l'adresse SP-2 puis l'Instruction a décrémenté SP de 2. En fait il vous suffit de savoir que PUSH BC a rangé BC en haut de la plie. POP BC effectue exactement l'opération contraire (est-il nécessaire de préciser que C est chargé avec le contenu de l'adresse SP, B avec le contenu de l'adresse SP + 1, puis que SP devient SP + 2?) RET renvoie A l'instruction de l'adresse suivant celle pointée par PC avant que RAND USR X no rende PC égal A X. Cotte valeur de PC avait été alors empilée. RET est une sotte de RETURN. Tout ce qu'il faut retenir c'est qu'il utilise la pile. Ce qui imptique qu'un RET ne doit pas survenir avant que la pile ne soll vidéo de loutes les valours empilées (vous devez avoir autant de POP que de PUSH dans votre programme),

Dans le cas présent, RET voua ramène au Basic. Important ça. Alors si vous voulez planter votre Spectrum (il ne sera pas naze, il faudra simplement l'éteindre et le rallumer, avec tous les Inconvénients qui s'ensuivent, style avoir A recharger l'assembleur pour pouvoir recommencer) exécutez donc un programme avec plus de PUSH quo de POP (y a des masos). Allez, un super programma cons-truciif, avant de s'en aller.

ORG X
LD(Y), SP
LD BC, (Y) RET

X et Y sont dos adresses quelconques (Sur deux octets). X vous sera sans doute imposé par votre assembleur, par contre Y dépendra de votre choix.

Devinez A quoi correspond la valeur Jaillissant sur votre écran sachant quo LO vient de LoaD et que las parenthèses ont un rôle spécial..
LD (enfants  ignares), prochain
cours.

RET.

Nicolas et Zeev , Hebdogiciel n°116

★ LICENCE: COMMERCIALE
★ ANNÉE: 1985
★ AUTEURS: Nicolas et Zeev

Page précédente : La page pédagogique d'hebdogiciel 115 : Formation à l'assembleur - Logique ou Arithmetiques

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 049 millisecondes et consultée 692 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.