π
<-
Chat plein-écran
[^]

[FR] Langage assembleur sur ez80 - Tutoriel

Assembleur, Axe, ICE, BBC Basic...

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postby Azerpogba » 21 Feb 2019, 18:15

ah merci j'avais pas vu ca doit etre ca

Edit : non il y a encore un faute :
Last edited by Azerpogba on 21 Feb 2019, 20:43, edited 1 time in total.
User avatar
AzerpogbaModo
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 36.1%
 
Posts: 394
Images: 16
Joined: 04 Dec 2018, 19:40
Location: surement devant un ordi
Gender: Male
Calculator(s):
Class: 1ere Maths/Physique-chimie/S.V.T.
YouTube: j'ai pas
Twitter: j'ai pas
Facebook: cherche et tu trouveras
GitHub: cherche et tu trouveras

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postby TheMachine02 » 21 Feb 2019, 18:21

Il y a aussi </pre> à la toute fin à retirer.
User avatar
TheMachine02Généreux
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 81.8%
 
Posts: 285
Images: 0
Joined: 16 Jan 2013, 18:27
Gender: Not specified
Calculator(s):
Class: Médecine

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postby Azerpogba » 21 Feb 2019, 18:22

ok
attention test
yes ca me met pas d'erreurs merci bcp THMACHINE02!!!!!!!!!!!!!!!!!!!!!!!!!! :'D

il me reste plus qu'a coder DDj...
User avatar
AzerpogbaModo
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 36.1%
 
Posts: 394
Images: 16
Joined: 04 Dec 2018, 19:40
Location: surement devant un ordi
Gender: Male
Calculator(s):
Class: 1ere Maths/Physique-chimie/S.V.T.
YouTube: j'ai pas
Twitter: j'ai pas
Facebook: cherche et tu trouveras
GitHub: cherche et tu trouveras

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postby Programmator88 » 21 Feb 2019, 19:07

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:
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.


ImageImage
Eh, Anonymous, ça te dirait de me donner un Internet ? C'est complètement inutile mais c'est marrant ! :D En échange, je te donnerai... ma reconnaissance éternelle !
User avatar
Programmator88Programmeur
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 49.3%
 
Posts: 208
Joined: 26 Jan 2019, 20:05
Location: Dans la Lune...
Gender: Male
Calculator(s):
Class: En vacances - 1ère Générale pendant l'année 2019-2020
YouTube: Kinkalax Productions (c'est un ami).
Twitter: J'ai pas Twitter.
Facebook: J'ai pas Facebook.
GitHub: J'ai pas GitHub.

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postby Azerpogba » 21 Feb 2019, 20:40

tkt tu es inclut dans le moi :'D :troll:
User avatar
AzerpogbaModo
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 36.1%
 
Posts: 394
Images: 16
Joined: 04 Dec 2018, 19:40
Location: surement devant un ordi
Gender: Male
Calculator(s):
Class: 1ere Maths/Physique-chimie/S.V.T.
YouTube: j'ai pas
Twitter: j'ai pas
Facebook: cherche et tu trouveras
GitHub: cherche et tu trouveras

Re: [FR] Langage assembleur sur ez80 - Tutoriel

Unread postby Epharius » 23 Feb 2020, 17:45

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
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 :
Code: Select all
   cp b
   jr nz,else
   ; A=B
   jr endif
else:
   ; A≠B
endif:

Le While :
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)
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 !
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 :favorite:
Image
User avatar
EphariusPremium
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 81.7%
 
Posts: 991
Images: 4
Joined: 08 Dec 2014, 17:38
Gender: Male
Calculator(s):
Class: ENSIMAG

Previous

Return to Langages alternatifs

Who is online

Users browsing this forum: No registered users and 3 guests

-
Search
-
Featured topics
Omega, le fork étendant les capacités de ta NumWorks, même en mode examen !
Comparaisons des meilleurs prix pour acheter sa calculatrice !
12
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...

Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety 
-
Stats.
461 utilisateurs:
>451 invités
>5 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)