CODINGAMSTAR ★ INITIATION A L'ASSEMBLEUR - PARTIE 2 ★

PROGRAMMATION EN ASSEMBLEUR Z-80 : LES SAUTS ET LES ETIQUETTES

Après un bref article d'initiation à l'assembleur, nous espérons que vous avez bien assimilé ce cours. Dans le cas contraire, ne vous alarmez surtout pas, Olivier le vénéré rédacteur de ce magazine a dit à mon binôme Manu qu'il n'y avait rien compris lui non plus, mais cela on s'en doutait un peu, vu son Q.I. (NDO : ah oui ? c'est quoi un Q.I. ?).

ETIQUETTES

Je pense qu'actuellement vous savez qu'en assembleur on ne peut appeler une ligne par un numéro comme en Basic, par exemple :

10 PRINT A;
100 GOTO 10

Mais vous pouvez affecter à une ligne une étiquette de votre choix, par exemple l'étiquette «BOUCLE».

Il est bien sûr possible d ' utiliser plusieurs étiquettes dans un programme, mais Il est Impossible d'utiliser le même nom pour deux étiquettes, ou d'utiliser des noms d'instructions.

La taille d'une étiquette ne dépasse que très rarement huit caractères selon l'assembleur que vous utilisez.

Passons donc aux choses sérieuses. Essayez d'écrire un programme qui utilisera les étiquettes pour écrire votre nom tout en employant la routine 0BB5AH.
Voici la solution qui écrit le nom «CPC »

ORG     7000H
LOAD    7000H
LD      A,67
CALL    PRINT
LD      A,50
CALL    PRINT
LD      A,67
CALL    PRINT
RET
PRINT:  EQU 0BB5AH
END

L'appellation PRINT est en fait une étiquette qui simplifie la compréhension et permet de créer un sous-programme (les sous-programmes sont développés dans la suite de l'article).

L'instruction EQU attribue une adresse à l'étiquette PRINT. Cette adresse correspond dans le cas présent à la routine système 0BB5AH.

J'espère qu'à présent vous avez bien compris le fonctionnement des étiquettes (sinon arrêtez l'assembleur), car maintenant nous allons voir les instructions de saut vers une adresse ou vers ces étiquettes.

LES SAUTS

Il existe différents types de sauts : il y a les sauts conditionnels, que nous développerons dans la troisième partie et les sauts inconditionnels.
On peut différencier trois types de sauts Inconditionnels : les Jumps notés JP. les CALL et les sauts relatifs notés JR.

1-LES JUMPS
Les jumps peuvent s'utiliser de plusieurs façons en assembleur : soit l'on fait un saut à une étiquette, soit l'on fait un saut à une adresse.
L'avantage des étiquettes, c'est qu'elles facilitent beaucoup la compréhension et la programmation du listing.

Par exemple, pour écrire une infinité de «A» , nous pouvons programmer :

ORG 7000H
LOAD 7000H
BOUCLE: LD A,65
CALL 0BB5AH
JP BOUCLE
RET
END

L'instruction JUMP correspond au GOTO du Basic

2 - LES CALLS

Le second type de saut Inconditionnels est le CALL associé au RET qui correspondent au GOSUB et au RETURN du Basic. Ils permettent la création de sous-programmes.

Le branchement sur le sous-programme peut se faire de deux façons :

* soit par l'appel du sous-programme par son adresse (l'adresse de début du sous-programme est donnée par l'éditeur que vous utilisez lors de l'assemblage) fonction : CALL adresse » soit en mettant au début du sous-programme une étiquette.

Dans ce cas la fonction est : CALL étiquette.

Tout sous-programme doit se terminer par l'instruction RET.
Programme d'exemple :

ORG 7000H
LOAD 7000H
LD A,67
CALL SP
LD A,80
CALL SP
LD A,67
CALL SP
RET
SP: CALL 0BB5AH
RET
END

3-LE SAUT RELATIF JR

Ce troisième type de saut, noté JR, effectue un saut relativement à l'adresse actuelle. C'est la distance de saut qui doit être Indiquée.

L'opération qui sera utilisée est JR e, e correspondant à la distance appelée offset.

CALCUL DE L'OFFSET:

Considérons un programme dans lequel l'instruction JR se trouve à l'adresse OA006H et ou le but du saut se trouve à l'adresse 0A003H.

La différence entre l'adresse où se trouve le JR et l'adresse où se trouve le but est de 0A006H-0A003H = 3. Mais. comme il s'agit d'un retour en arrière, l'adresse du JR étant supérieure à l'adresse du but, alors l'offset sera négatif, soit égal à-3,

Pour calculer l'octet de notre Instruction. Il nous faut ôter deux de la distance car le processeur commence toujours par lire une Instruction entièrement. Alors il lira donc le code JR et l'offset. Chaque fols que le processeur lit un octet. Il est Incrémenté de un. Notre Instruction lue entièrement, le compteur de programme Indique l'adresse de la prochaine instruction. L'adresse Indiquée est donc élevée de deux.

L'offset est donc égal à -3 -2 = - 5 = 0FBH

En résumé l'offset noté e est égal à:

e=adr1-adr2-2
adr1   correspondant à l'adresse du but
adr2   correspondant à l'adresse de l'instruction JR.

Dans ce cas. l'octet est placé à l'adresse 0A007H. Pour faire ce saut relatif. Il faudra donc taper :

JR adr

adr correspondant à l'adresse du but.

Ce type de saut peut se faire sur une distance maximale de +129 ou -126 par rapporta l'adresse actuelle. Son seul avantage par rapport au JP est d'être plus rapide que ce dernier, dans sa fourchette d'utilisation.
Le calcul de l'offset vous permet de vérifier si l'adresse que vous associez au JR est bonne.

PROGRAMME D'EXEMPLE :

ORG    7000H
LOAD   7000H
A000   LD A.65
A003   CALL 0BB5AH
A005   JR 0A00H
A007   RET
A008   END

Il est pour l'instant difficile de faire des programmes plus intéressants car vous ne connaissez encore que peu d'Instructions mais, le mois prochain, nous verrons les opérations logiques, les compteurs, les décompteurs ainsi que les sauts conditionnels.

AMSTAR & CPC n°38

» Download ZEN - assembler package
» Download Amsoft Devpac

★ ANNÉE: ???
★ AUTEUR: Jean-François MAIGNE

Page précédente : Initiation à L'Assembleur Amstar&CPC 37

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