ah merci j'avais pas vu ca doit etre ca
Edit : non il y a encore un faute :
[FR] Langage assembleur sur ez80 - Tutoriel
Re: [FR] Langage assembleur sur ez80 - Tutoriel
Last edited by Azerpogba on 21 Feb 2019, 20:43, edited 1 time in total.
-
AzerpogbaAmbianceur
Niveau 13: CU (Calculateur Universel)- Posts: 397
- Images: 16
- Joined: 04 Dec 2018, 19:40
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: Etude sup
Re: [FR] Langage assembleur sur ez80 - Tutoriel
Il y a aussi </pre> à la toute fin à retirer.
-
TheMachine02Modo
Niveau 16: CC2 (Commandeur des Calculatrices)- Posts: 342
- Images: 0
- Joined: 16 Jan 2013, 18:27
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: Médecine
Re: [FR] Langage assembleur sur ez80 - Tutoriel
ok
attention test
yes ca me met pas d'erreurs merci bcp THMACHINE02!!!!!!!!!!!!!!!!!!!!!!!!!!
il me reste plus qu'a coder DDj...
attention test
yes ca me met pas d'erreurs merci bcp THMACHINE02!!!!!!!!!!!!!!!!!!!!!!!!!!
il me reste plus qu'a coder DDj...
-
AzerpogbaAmbianceur
Niveau 13: CU (Calculateur Universel)- Posts: 397
- Images: 16
- Joined: 04 Dec 2018, 19:40
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: Etude sup
Re: [FR] Langage assembleur sur ez80 - Tutoriel
Azerpogba wrote:ok
attention test
yes ca me met pas d'erreurs merci bcp THMACHINE02!!!!!!!!!!!!!!!!!!!!!!!!!!
il me reste plus qu'a coder DDj...
Comment ça, me ?
Je fais essentiellement des niveaux pour Oiram CE et Geometry Dash CE. Ils sont tous disponibles ici. Je fais un Doodle Jump pour TI-83PCE/TI-84+ avec Azerpogba. Je cherche un bêta-testeur pour mes niveaux Geometry Dash CE. N'hésitez pas à me contacter en MP.
Eh, ClaudeBot [spider], ça te dirait de me donner un Internet ? C'est complètement inutile mais c'est marrant ! En échange, je te donnerai... ma reconnaissance éternelle !
Eh, ClaudeBot [spider], ça te dirait de me donner un Internet ? C'est complètement inutile mais c'est marrant ! En échange, je te donnerai... ma reconnaissance éternelle !
-
Programmator88Programmeur
Niveau 12: CP (Calculatrice sur Pattes)- Posts: 208
- Joined: 26 Jan 2019, 20:05
- Location: Dans la Lune...
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: L2 MIASHS
-
AzerpogbaAmbianceur
Niveau 13: CU (Calculateur Universel)- Posts: 397
- Images: 16
- Joined: 04 Dec 2018, 19:40
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: Etude sup
Re: [FR] Langage assembleur sur ez80 - Tutoriel
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
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 :
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
Bonne question ! Voici les avantages et inconvénients de chacun :
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
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
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 :
Le While :
Le For : (pour faire l'opération
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
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 !
Ç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'
où 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 !
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=Bjp nz,label
Saute si A≠Bjp c,label
Saute si A<Bjp nc,label
Saute si A≥B
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).
À 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 !
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 !
Le projet Geometry Dash est terminé ! N'hésitez pas à aller jeter un coup d’œil au topic du projet ! Vous pouvez le télécharger ici.
Unis par la flèche sacrée de cupidon
Unis par la flèche sacrée de cupidon
-
EphariusPremium
Niveau 16: CC2 (Commandeur des Calculatrices)- Posts: 1160
- Images: 4
- Joined: 08 Dec 2014, 17:38
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: Ensimag
- GitHub: MathisLav
Re: [FR] Langage assembleur sur ez80 - Tutoriel
Epharius wrote:ok, faudra que tu penses à corriger les fautes d'orthographe du coup
C'est maintenant chose faite (merci Afyu ! ), 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
-
AfyuVIP++
Niveau 16: CC2 (Commandeur des Calculatrices)- Posts: 405
- Images: 149
- Joined: 30 Oct 2019, 19:17
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: plutôt, oui :)
Re: [FR] Langage assembleur sur ez80 - Tutoriel
Le premier post a disparu / été supprimé ?
MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)My calculator programs
Mes programmes pour calculatrices
-
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)- Posts: 14744
- Images: 1119
- Joined: 01 Jun 2007, 00:00
- Location: France
- Gender:
- Calculator(s):→ MyCalcs profile
- Twitter: adriweb
- GitHub: adriweb
Re: [FR] Langage assembleur sur ez80 - Tutoriel
Adriweb wrote:Le premier post a disparu / été supprimé ?
Tu veux dire : un post antérieur à ce tutoriel ?
-
AfyuVIP++
Niveau 16: CC2 (Commandeur des Calculatrices)- Posts: 405
- Images: 149
- Joined: 30 Oct 2019, 19:17
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: plutôt, oui :)
Re: [FR] Langage assembleur sur ez80 - Tutoriel
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
Dailleurs une actualisation pour fasmg serait pas mal mais bon
MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)My calculator programs
Mes programmes pour calculatrices
-
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)- Posts: 14744
- Images: 1119
- Joined: 01 Jun 2007, 00:00
- Location: France
- Gender:
- Calculator(s):→ MyCalcs profile
- Twitter: adriweb
- GitHub: adriweb
Return to Langages alternatifs
Who is online
Users browsing this forum: ClaudeBot [spider], miickboy and 5 guests