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

La page pédagogique d'hebdogiciel 127: Registre FCoding Hebdogiciel

PAR DELÀ LE CÔTÉ GAUCHE DE L'OCTET (ON NE FAIT PAS DE LA LITTÉRATURE ENGAGÉE).

Oui, nous en étions restés là ! Et donc, parce qu'on est trop bon, on continue par là ! Il y avait des bits qui tombaient des octets dans la carry. Un "1" binaire plus un "1" binaire, ça fait un "0" binaire dans le bit courant et un "1" binaire en plus dans le bit de gauche ou dans la carry s'il n'y a pas de bit de gauche. Cela ne fait pas notre affaire pour des représentations signées (le bit 7 d'un octet indiquant le signe alors que le bit le plus à gauche est le bit 7).

Graphons :

00000001 = 1 00000001 = 1
+ 00000001 = 1 + 00000011 = 3
00000010 = 2 00000100 = 4

Mais :

01111111 = 127 en binaire signé, 127 en complément à 2 + 00000001 = 1 en binaire signé, 1 en
complément à 2

10000000 = -0 en binaire signé,
-128 en complément à 2

Gênant n'est-ce pas ?

Et cette opération n'a pas mis la retenue à 1. C'est donc là qu'inter-vient le bit P/V du registre F, indicateur de débordement (d'overflow en anglais). Ce bit est mis à 1 lorsque l'opérande destination d'un mnémonique change de signe pendant l'exécution de cette instruction.

Donc, l'overflow à 1 signifie qu'on a faux, que le signe des nombres ne sera plus lavable. À vous d'en tenir compte ! La clef du problème, nous ne le dirons jamais assez, c'est de prévoir un peu, cerner les bugs d'intervalles de travail bien déterminés.

Ne vous inquiétez pas si le doute est encore en vous après ce petit descriptif. Quelques plantages seront les meilleurs explications.

IF THEN

Enfin. Algorithmiquement parlant, voilà du très important. Cause que sans ça on ne peut pas le program-mer.
En fait, nous allons diposer d'instructions effectuant une opération lorsqu'une condition est vraie. Nous allons étudier, d'une part, les types d'opération que l'on peut conditionner, d'autre part, les types de condition que l'on peut tester.

C'EST COMMENT ?

Conditionnellement, nous pourrons conditionner l'opération d'un mnémonique par l'état d'un bit des bits du registre F. Ce pourra être, le bit C, le bit P/V, le bit Z ou encore le bit S du registre F.
P/V et C, vous connaissez. Mais présentons Z et S.
Z sera très utilisé. Parce que ce n'est pas Z comme Zorro mais Z comme Zéro. Il sera mis à 1 lorsqu'une opération aura zéro pour résultat et mis à 0 dans le cas contraire.
Quant à S, il reflète le signe de la dernière valeur traitée. Il est à l'état du bit 7 (bit 15 pour des manipulations 16 bits) de nos traffics.

C'EST QUOI ?

Sur le bloc opératoire, nous aurons en plus des équivalents assembleur des GOTO et GOSUB (qui théoriquement devraient largement suffir), des RETURN conditionnels. Le temps des microprocesseurs à manivelle, qu'il fallait lancer convenablement, à la sueur de nos fronts, pour leur éviter un engorgement et une noyade dans un flot d'octets, est révolu.

GOSUB, vous connaissez déjà. Rappelez-vous : CALL. De même, on a déjà causé de RETURN : RET. Ben vous aurez des CALL NC, des RET PO, etc... On va venir aux significations précises de ces ajouts, mais sachez qu'ils déterminent une condition d'exécution du mnémonique qu'ils complètent.

SAUTONS

Nous pouvons gambader à travers nos programmes en langage machine par l'utilisation de sauts relatifs ou absolus.
Absolu : l'adresse ou devra se continuer le programme est directement spécifiée dans le code machine généré par le mnémonique.
Relatif : c'est relativemment plus compliqué qu'absolu. Ça veut signifier que le branchement s'effectuera par rapport à la position actuelle du pointeur de programme, le registre PC. L'effective adresse de branchement sera calculée à partir de ce registre et du déplacement signé sur 8 bits placé dans le mnémonique.
Le mnémonique de saut absolu est JP. En assembleur on écrira : tabulation, JP, tabulation, condition, virgule, étiquette. La condition n'est pas obligatoire. Pour un saut relatif, on fera en fait de môme avec JR au lieu de JP, mais avec certaines limitations et certains avantages que nous aborderons dans un chapitre prochain.

SPÉCIFICATION

Pour préciser qu'un mnémonique s'opérera conditionnellement, et dans ce cas préciser la condition, on ajoute une ou deux lettre à la mnémonique, dans son champ opérande destination, selon les règles suivantes :

  • Z pour égal à 0
  • NZ pour différent de 0
  • C pour il y a eu retenue
  • NC pour pas de retenue
  • PO pour résultat sans débordement (correct)
  • PE pour overflow P pour positif (bit 7 ou 15 à 0)
  • M pour négatif (bit 7 ou 15 à 1)

PO et PE servent aussi à tester la parité. Mais si la parité est une notion abstraite pour vous, qu'elle le reste. Mais là on va s'amuser de la notation. L'indicateur d'overflow (débordement, habituez-vous) est nommé bit P/V parce qu'il sert autant pour la parité que pour le débordement. Alors P pour parité, ça se conçoit, mais V pour overflow ? C'est cause que si les gens de chez Zilog avaient mis un O pour overflow, on aurait pu le confondre avec un 0. D'où source de litige pour l'assembleur et que donc... On rigole.
Exemple

LD A,10
TOTO: DEC A
JR NZ, TOTO
ICI :
; suite du programme.

Que ferait donc le processeur face à l'assemblage de ce petit bout de programme ? Tout d'abord, il chargerait le registre A avec la valeur 10 (LD A, 10). Puis il décrémenterait A (A = A-1 par DEC A). Puis il retournerait à l'instruction présente à l'étiquette TOTO tant que la décrémentation de A n'aurait pas provoqué la mise à un du bit Z du registre F par le passage à 0 de A. C'est l'équivalent des lignes Basic :

10 LET A =10
20 LET A = A-1 :IF A$-0 THEN 10 ELSE suite du programme.

LE POSITIVISME ET LES ONDES NÉGATIVES DE LA RELATIVITÉ.

On ne peut pas effectuer un saut relatif à une distance plus grande que celle représentable sur un octet par un nombre en complément à deux auquel on aurait ajouté 2 (la mnémonique assemblée prends 2 octets). C'est à dire que l'on ne peut se brancher par un JR à une suite d'exécution distante de plus de 126 octets en arrière ou de 129 octets en avant. Mais une tentative de tels branchements ne sera pas catastrophique car elle vous sera signalée par l'assembleur lors de l'assemblage et il ne vous restera plus qu'à corriger le texte de votre source.

Pourquoi préférer les sauts relatifs aux sauts absolus ? Parce qu'ils rendent les programmes reloqea-bles et occupent moins de place en mémoire (1 octet économisé par saut relatif). Par relogeable, nous entendons que l'ORG de votre programme pourra être quelconque et qu'ainsi le programme pourra se charger en n'importe quel emplacement dans la mémoire de votre Spectrum.

Exercice :

LD D,140
TITI: DEC D
INC D
JR M, TITI

Que fait ce bout de programme ?

Et bien, il attends que l'on arrête la machine. Essayez de comprendre pourquoi...

DJNZ

Non nos cerveaux ne sont pas victimes d'une overdose d'électrons, DJNZ (à prononcer avec l'accent) est un mnémonique. On en parle parce que c'est relatif. DJNZ est un mnémonique de décrémentation et de saut relatif conditionnel. DJNZ décrémente le registre B du Z80 et se rend à l'adresse indiquée dans le mnémonique tant que B n'est pas à 0.

Par là-même nous en déduisons un petit sous-programme “ralentisseur” :

RALENT: PUSH BC
LD B,$FF
RHAA: CALL RALEN
DJNZ RHAA
POP BC
RET
RALEN: PUSH BC
LD B, $FF
LOOP: DJNZ LOOP
POP BC
RET

La pratique de l'assembleur vous amènera à bien connaître ce genre de frein. Vous aurez en effet besoin de voir ce vaisseau spatial lumini-que que vous tenterez d'afficher, avant qu'il n'ait eu le temps de disparaître au fin fond de l'écran.

Tiens un ralenti de la productivité. On s'arrête là pour cette fois.

Nicolas et Zeev , Hebdogiciel n°127

★ ANNÉES: 1986
★ AUTEURS: Nicolas Et Zeev

Page précédente : La page pédagogique d'hebdogiciel 127: La Memoire

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

Lien(s):
» Coding » La page pédagogique d'hebdogiciel 081: Quelques conseils pour programmer en Language Machine
» Coding » La page pédagogique d'hebdogiciel 088 : Formation à l'assembleur
» Coding » La page pédagogique d'hebdogiciel 139: La Pile
» Coding » La page pédagogique d'Hebdogiciel n°111: Basic et Langage Machine
» Coding » La page pédagogique d'hebdogiciel 130
» Coding » La page pédagogique d'hebdogiciel 155: Adressage
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 544 millisecondes et consultée 2097 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.