CODINGHEBDOGICIEL ★ FORMATION A L'ASSEMBLEUR PRATIQUE LANGAGE MACHINE SUR AMSTRAD ★

La page pédagogique d'hebdogiciel 139: La PileCoding Hebdogiciel

RÉSULTAT DE L'EXERCICE NUMÉRO 1

Hélas ! Trois fois hélas ! Deux erreurs se sont glissées dans le listing de notre premier exercice (les perfides !). Une erreur de syntaxe, que vous avez bien entendu découverte et corrigée. Il s'agit de la ligne 90. Le " #8040" devait évidemment être entre parenthèses. La deuxième erreur (pas de parenthèse en ligne 30) n'empêchant pas l'exécution du programme, nous allons suivre pas à pas son effet sur les adresses #8040 et  #8041 :

LISTING    CONTENU DE          #8040  #8041
---------------------------------------------
   10       LD A, #10             00     00
   20       LD (#8040), A         10     00
   30       LD HL, (#8040)        10     00
   40       LD E, HL              10     00
   50       LD IX,#8040           10     00
   60       LD D,(IX+1)           10     00
   70       LD E,#10              10     00
   80       LD (IX + 1), E        10     10
   90       LD ( #8040), DE       10     00
  100       RET                   10     00

LA PILE

Voici une notion très importante en assembleur : la pile. Avec un peu de logique, comme toujours, la compréhension des instructions de pile est accessible dès le berceau, voyez plutôt :

Imaginez que vous soyez le responsable de la pile, et que votre copain soit le microprocesseur. Votre copain peut vous dire "prends-moi ça !" (PUSH) ou "rends-moi ça !" (POP). Vous, vous prenez les choses et vous les empilez : une assiette, une chaussette, une saucisse, une disquette... A chaque "PUSH", vous empilez tout ce que votre copain vous passe, et, à chaque "POP", vous dépilez, en prenant bien entendu ce qui se trouve en haut de la pile. Voilà le principe de base de la pile. Mais que sont 1 ces saucisses et ces chaussettes ? Tout simplement le contenu d'un double registre :

PUSH HL, PUSH DE, PUSH BC, PUSH AF, PUSH IX, PUSH IY POP HL, POP DE, POP BC, POP AF, POP IX, POP IY

"PUSH" dépose sur la pile le contenu du double registre spécifié. "POP" met dans le double registre spécifié le contenu du haut de la pile.

LE POINTEUR DE PILE

La pile, en assembleur, est heureusement bien plus souple qu'une simple pile d'assiettes. Il est possible, par exemple, en faisant un peu de manipulation, d'aller chercher une valeur au milieu de la pile, ou d'en créer une seconde, à un autre endroit de la mémoire. Tout ceci grâce à un "doigt" qui "pointe" la pile, appelé le "pointeur de pile" (je vous avais dit que tout ceci était logique). Il s'agit d'un double registre (SP), qui contient l'adresse du haut de la pile.

LES TROIS RÈGLES FONDAMENTALES

Quand on a en tête l'exemple d'une pile d'objets sur laquelle on PUSH et on POP, il faut encore assimiler trois notions importantes pour se familiariser avec le principe de la pile :

1) Quand le contenu d'un double registre est déposé sur la pile, il n'est pas pour autant gommé du double registre.

Exemple :

LD    HL, #8000    ; après l'instruction PUSH HL
PUSH  HL           ; HL contiendra toujours #8000

2) Le contenu d'un double registre étant sur 16 bits, il se divise en deux pour prendre deux cases mémoire,
l'octet de poids faible étant déposé le premier sur la pile.

Exemple :

LD   SP, #C000   ; le pointeur en 8C000
LD   HL, #8000   ;
PUSH HL          ; d'abord L en #BFFF
                 ; puis H en #BFFE

3) Le haut de la pile est en bas de la mémoire, et le bas en haut. Le pointeur de pile pointe le HAUT de la pile. Exemple :

INSTRUCTION  CONTENU DE SP   EFFETS SUR LA PILE


-------------------------------------------------------

LD SP,#C000                 #BFFC = 00
LD HL,#8000                 #BFFD = 00
LD DE,#55FF                 #BFFE = 00
            SP = #C000      #C000 = 00
PUSH HL                     #BFFC = 00
                            #BFFD = 00
                            #BFFE = 80
            SP = #BFFE      #BFFF = 00
PUSH DE                     #BFFC = 55
                            #BFFD = FF
                            #BFFE = 80
                            #BFFF = 00
            SP = #BFFC      #C000 = 00
POP DE                      #BFFC = 55
                            #BFFD = FF
                            #BFFE = 80
                            #BFFF = 00
            SP = #BFFE      #C000 = 00
POP HL                      #BFFC = 55
                            #BFFD = FF
                            #BFFE = 80
                            #BFFF = 00
            SP = #C000      #C000 = 00

En résumé, l'instruction PUSH commence par décrémenter le pointeur de pile, puis dépose à son adresse le contenu de poids faible du double registre. Ensuite, le pointeur est de nouveau décrémenté avant de déposer à son adresse le contenu de poids fort du double registre concerné. L'instruction POP fait exactement l'inverse : contenu de (SP) dans le poids fort, incrémentation, contenu de (SP) dans le poids faible, nouvelle incrémentation. Si les poids faible et fort vous semblent aussi obscurs qu'un discours de Chong Tchang sur la sécurité sociale à Pékin ou que la rubrique Mini Mire, revoyez le deuxième cours de votre passionnante formation à l'assembleur dans le numéro 115 de l'HHHHebdo. De plus, je ne me lasserai pas de vous rappeler l'efficacité d'essais différents et répétés avec votre moniteur préféré.

EX (SP), HL

Voilà une nouvelle instruction qui concerne la pile, et qui se révèle bien pratique à l'usage. Elle concerne les doubles registres HL ou les registres d'index IX et IY. Son effet est très simple : il s'agit d'ECHANGER le contenu du double registre concerné avec le haut de la pile. Le contenu de SP n'est donc pas modifié.
Exemple :

LD HL,  #8040    ; HL=   8 8040
LD DE, #9050     ;
PUSH DE          ; haut de pile = #9050
EX (SP), HL      ; haut de pile = #8040 HL = #9050

PROGRAMMES D'EXEMPLES

Programme numéro 3

But : échanger le contenu des doubles registres HL avec BC sans modifier les autres registres.

10 PUSH HL

20 PUSH BC
30 POP HL
40 POP BC
50 RET

Programme numéro 4
But : même but que le programme précédent, mais autre méthode.

10 PUSH BC
20 EX (SP),HL
30 POP BC
40 RET

EXERCICE NUMÉRO 2

Exécutez mentalement le listing ci-dessous, et donnez le contenu des doubles registres HL, DE, BC et SP à la fin de son exécution.

10 LD HL,   #8040
20 LD DE,  #9050
30 LD BC,  #A060
40 LD SP,  #C000
50 PUSH BC
60 POP BC
70 PUSH DE
80 PUSH HL
90 POP BC
100 EX (SP), HL
110 POP DE
120 RET

RÉCRÉATION

Pour le plaisir de tout casser :

POKE &38, 34 ou POKE &45, 12 ou POKE &39, ZORRO etc..
Sales gosses !

Hebdogiciel n°139 p14, Patrick Dublanchet

★ LICENCE: COMMERCIALE
★ ANNÉES: 1985
★ AUTEUR: Patrick Dublanchet

Page précédente : La page pédagogique d'hebdogiciel 131: Les Instruction de Transfert

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