Page 5 of 6

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 21 Feb 2019, 18:15
by Azerpogba
ah merci j'avais pas vu ca doit etre ca

Edit : non il y a encore un faute :

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 21 Feb 2019, 18:21
by TheMachine02
Il y a aussi </pre> à la toute fin à retirer.

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 21 Feb 2019, 18:22
by Azerpogba
ok
attention test
yes ca me met pas d'erreurs merci bcp THMACHINE02!!!!!!!!!!!!!!!!!!!!!!!!!! :'D

il me reste plus qu'a coder DDj...

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 21 Feb 2019, 19:07
by Programmator88
Azerpogba wrote:ok
attention test
yes ca me met pas d'erreurs merci bcp THMACHINE02!!!!!!!!!!!!!!!!!!!!!!!!!! :'D

il me reste plus qu'a coder DDj...

Comment ça, me ? :troll:

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 21 Feb 2019, 20:40
by Azerpogba
tkt tu es inclut dans le moi :'D :troll:

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 23 Feb 2020, 17:45
by Epharius
Wshwsh, j'avais du temps à perdre donc j'ai pondu ça. Hésitez pas à dire que c'est nul si ça l'est :) (toujours avec la sourire par contre)
Ça s'insère après l'explication sur les registres au début.
Metter poce blo si sa vou plais gen refeuré



Maintenant que nous avons vu que l'on pouvait utiliser des registres, comment les utilise-t-on ? Et d'ailleurs, comment on fait concrètement pour programmer en assembleur ? On va voir ici les quelques instructions que vous utiliserez 99% du temps :

L'utilisation des registres
On a vu qu'il était possible d'utiliser un certain nombre de registres dans nos programmes, qui sont en quelque sorte les variables en assembleur. Pour cela il suffit d'une instruction ld :
  • Pour mettre une valeur dans un registre 8 bits ou 24 bits on fait ld r,n où r est n'importe quel registre parmi A, B, C, D, E, H, L et BC, DE, HL et où n est un nombre entre 0 et 255 (8 bits) pour un registre 8 bits et entre 0 et 2^24 pour un registre 24 bits (ex : ld bc,12345 met 12345 dans BC)
  • Pour mettre un registre 8 bits dans un autre registre 8 bits, on fait ld r,r'r et r' sont n'importe quels registres parmi A, B, C, D, E, H, L
  • /! Il n'est pas possible de mettre un registre 24 bits dans un autre registre 24 bits : exemple ld hl,de est interdit !
C'est tout ce qu'il y a à savoir ! Maintenant, vous savez donc vous servir des registres. Il ne manque grosso modo plus qu'à savoir faire des conditions et des boucles ! Mais avant ça, on a besoin des sauts...

Les sauts et les labels
Avant de faire des If et des While like a boss, on a besoin de s'intéresser aux sauts. Mais je vous rassure, les sauts c'est vraiment pas compliqué ! Commençons par un exemple d'utilisation :
Code: Select all
   jr proche
   ; ...quelques instructions
proche:
   jp loin
   ; ...
   ; Plein d'instructions
   ; ...
loin:

Pour sauter quelque part dans votre programme, il vous suffit de mettre un label à l'endroit où vous voulez sauter (ici, "proche" ou "loin" suivi du caractère deux points ':' ) et de faire soit jp monLabel ou jr monLabel. En pratique, un label sert à donner un nom à un endroit de votre programme, un identifiant en quelque sorte. Il peut être composé des caractères lettres MAJ+min, chiffres et underscore "_".

C'est bien beau tout ça mais c'est quoi la différence entre JP et JR ?

Bonne question ! Voici les avantages et inconvénients de chacun :
  • JP peut sauter à n'importe quel endroit du programme et de la mémoire alors que JR ne peut sauter qu'à un label qui est 128 octets avant ou 127 octets après
  • JP est légèrement plus lent que JR
  • JP prend 4 octets en mémoire alors que JR n'en prend que 2
Show/Hide spoilerAfficher/Masquer le spoiler
Si vous êtes curieux, la vraie différence entre JP (JumP) et JR (Jump Relative) est que JP prend en argument une adresse (ex : jp $D1023A saute à l'adresse $D1023A) alors que JR prend en argument un offset ie une position relative (ex : jr 45 saute 45 octets plus loin). Cet offset est un entier 8 bits signé, c'est pour cela que l'on ne peut aller que 128o en arrière ou 127o en avant.

Maintenant qu'on a vu comment sauter quelque part dans notre programme, on va voir comment sauter seulement si une condition est vérifiée !


Les sauts conditionnels ou comment faire des If et des While
Spoiler alert : l'assembleur ne contient ni instruction While, ni instruction If. Mais je vous rassure tout de suite : il est possible de faire des comparaisons, et donc d'en imiter le fonctionnement !
En assembleur, pour faire une comparaison, on fait cp registre8b ou cp nombre8b. Ces deux instructions comparent, pour le premier un registre 8 bits (A B C D E H L) au registre A et pour l'autre un nombre 8 bits à A. À noter qu'il n'est pas possible de comparer des registres 24 bits de cette façon (ex : cp hl n'existe pas). Toute seule, CP ne sert pas à grand chose, elle ne fait que comparer. Il faut donc se servir du résultat pour sauter à un endroit du programme "si la condition est vérifiée". Voici par exemple comment faire un If en assembleur :
Code: Select all
   cp b ; comparons A avec B
   jr nz,faux ; si A!=B, on n'exécute pas le corps du IF
   ; et donc si on n'a pas sauté, c'est que la condition est vérifiée
faux:
   ; suite du programme

Peut-être que vous commencez à comprendre comment ça marche. Sinon voilà l'explication : pour faire un saut conditionnel, il faut mettre un CP puis un JP ou JR auquel on "ajoute un argument" tels que Z, NZ, C, NC (les plus utilisés). Imaginons que nous faisons cp b, à la ligne d'après on peu mettre :
  • jp z,label Saute si A=B
  • jp nz,label Saute si A≠B
  • jp c,label Saute si A<B
  • jp nc,label Saute si A≥B
A noter que j'ai utilisé JP ici, mais il en va de même pour JR.

C'est tout ?

Eh oui, c'est tout ! Pour l'instant ça peut paraître un peu magique mais on verra plus en détail comment ça marche lorsqu'on parlera du registre F !
En attendant, essayez de faire un If / Else, une boucle While (boucle qui s'exécute tant qu'une condition est vérifiée) et une boucle For (boucle qui s'exécute N fois) avec ce que vous avez appris. Je vous mets la réponse en spoiler mais essayez d'y réfléchir ;)
Le If/Else :
Show/Hide spoilerAfficher/Masquer le spoiler
Code: Select all
   cp b
   jr nz,else
   ; A=B
   jr endif
else:
   ; A≠B
endif:

Le While :
Show/Hide spoilerAfficher/Masquer le spoiler
Code: Select all
while:
   cp b
   jr nz,endWhile
   ; corps
   jr while
endWhile:

Le For : (pour faire l'opération r = r-1, on utilise l'instruction dec r ou r est n'importe quel registre)
Show/Hide spoilerAfficher/Masquer le spoiler
Code: Select all
   ld a,8 ; le nombre de fois qu'on veut exécuter la boucle
for:
   ; corps
   dec a
   cp 0 ; tant que A n'est pas égal à 0, on boucle
   jr nz,for

Les rageux diront que ce code n'est pas optimisé mais n'écoutez pas les rageux

Il y a bien entendu plusieurs solution et vous pouvez avoir trouvé quelque chose de différent mais qui fait quand même ce que vous voulez ;)

Pour information, il y a un moyen beaucoup plus simple de faire un boucle For. En effet, le processeur possède une instruction 2 en 1 : DJNZ (Decrement Jump NonZero). djnz label fait à elle toute seule l'équivalent de :
Code: Select all
   dec b
   ld a,0 ; Dans l'instruction elle-même, A n'est pas mis à 0
   cp b
   jr nz,label

À noter que ce qu'utilise DJNZ est un JR, donc vous ne pourrez pas sauter plus loin que 128 octets en arrière. À noter aussi qu'après l'instruction, la valeur de B sera décrémentée de 1. Par contre la valeur de A n'est pas modifiée : A n'est donc pas mis à 0, c'est juste pour que vous compreniez comment marche l'instruction.
Il suffit alors de mettre le nombre de tours de boucle souhaités dans B, de mettre un label au début de la boucle et de mettre un DJNZ à la fin de celle-ci !


Ouf, on a fini le chapitre le plus dense du tutoriel ! Prenez bien le temps d'assimiler ces notions : elles vous serviront tout le temps !
Une fois que vous êtes à peu près à l'aise avec tout ça, il est temps de passer à l'utilisation de la "vraie" mémoire : parce que 10 octets de mémoire avec les registres communs, ce n'est vraiment pas beaucoup !

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 14 May 2021, 11:59
by Afyu
Epharius wrote:ok, faudra que tu penses à corriger les fautes d'orthographe du coup ;)

C'est maintenant chose faite (merci Afyu ! :p), en tous cas pour la partie qui est en article. Je n'ai pas (encore) corrigé les éventuelles fautes qu'il y aurait dans les différentes suites, écrites en commentaires.

Bravo pour ce tutoriel ! Je ne m'intéresse pas forcément à l'assembleur mais les explications m'ont semblé claires :)

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 14 May 2021, 12:10
by Adriweb
Le premier post a disparu / été supprimé ?

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 14 May 2021, 12:12
by Afyu
Adriweb wrote:Le premier post a disparu / été supprimé ?

Tu veux dire : un post antérieur à ce tutoriel ?

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postPosted: 14 May 2021, 12:17
by Adriweb
Non je parlais du post de TM02 qui était devenu vide. La ca semble OK.
Dailleurs une actualisation pour fasmg serait pas mal mais bon :D