Lunariville Index du Forum
Lunariville
La communauté francophone de Lunar Magic et Super Mario Maker
 
Lunariville Index du ForumFAQRechercherMembresGroupesProfilS’enregistrerConnexion

Tutoriel sur l'ASM

 
Poster un nouveau sujet   Répondre au sujet    Lunariville Index du Forum -> Lunar magic et le romhacking de SMW -> Tutoriaux
Sujet précédent :: Sujet suivant  
Auteur Message
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Lun 19 Nov 2012 - 17:44    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Et voilà !
Après une tentative ratée de réécrire mon tuto sur l'ASM il y a de cela 1 ou 2 ans, j'ai décidé de recommencer, cette fois-ci avec une approche différente. Les tutos, c'est long à écrire, c'est indéniable. Mais la tâche est d'autant plus fastidieuse que le sujet est complexe et que les informations à fournir pullulent. Alors vous imaginez pour l'ASM, un tuto complet, couvrant tous les aspects de l'ASM relatif au smwhacking... Il faudrait que j'y travaille pendant 1 mois à fond pour qu'il soit parfait.
Aussi j'ai trouvé une autre méthode : faire une sorte de "cours". Un tuto décomposé en plusieurs parties, et chaque partie serait ajoutée au fur et à mesure de l'avancement. De cette façon, je pense qu'on peut tirer bon nombre d'avantages : si je ne finis pas le tuto (ou que je fais une grosse pause au milieu parce que je suis trop occupé à autre chose), il n'est pas perdu, ce qui est déjà écrit est ici ; vous pouvez lire et apprendre peu à peu, ce qui est mieux que d'une seule traite ; je peux travailler beaucoup plus chaque partie ; vous pouvez poster vos commentaires pour chaque dernière partie ajoutée.

On va donc faire comme ça. Je vais mettre à jour ce premier post et mettre toutes les parties ici pour que vous n'ayez pas à farfouiller partout dans ce sujet pour retrouver les informations qui vous intéressent. A la fin de chaque partie j'essaierai d'inclure un peu de pratique : comprenez des exercices. Vous pourrez poster vos solutions et j'ajouterai les corrections un peu après. Entre chaque partie je vous invite aussi à poser vos questions si vous ne comprenez pas quelque chose (que ce soit dans la partie la plus récemment ajoutée ou une autre), si vous trouvez que c'est mal expliqué, que certains points méritent des explications plus poussées, etc.
Concernant la fréquence de mise à jour, je ne peux rien vous garantir. Comptez 2 chapitres par semaine pour un rythme soutenu et un chapitre par mois si je suis très occupé.

On va donc commencer avec le premier chapitre qui va introduire l'ASM et poser un certain nombre de bases pour ce tuto.
Je n'ai plus qu'à vous souhaiter bonne lecture =) et vous laisser avec cette phrase tirée d'un film Wink :
Ce doit être aussi gonflant à lire qu'à écrire.
--Les rois mages


Chapitre 1 : Introduction

Bonjour et bienvenue dans ce tutoriel sur l'ASM ! Smile
Avant tout, je tiens à préciser plusieurs points important :
  • Ce tutoriel est dédié à l'apprentissage de l'ASM pour la SNES ;
  • Ce tutoriel ne couvre que l'ASM pour le hacking de SMW et ses applications au regard du logiciel Lunar Magic ;
  • Il a pour but de vous apprendre comment créer vos propres custom blocks, custom sprites, custom patchs et plus généralement comment la SNES fonctionne.

Par conséquent, ce tutoriel n'est pas adapté pour apprendre l'ASM pour la SNES en général (je parle ici de homebrew, de hacking d'autres jeux que SMW, etc). Vous pouvez toujours le lire, beaucoup d'informations dans ce tutoriel vous seront sûrement utiles. Cependant, je ne répondrai qu'aux questions concernant ce tutoriel et ses applications dans le smwhacking.
Par ailleurs, je ne saurais être responsable de toute modification de votre système informatique pouvant entraîner la perte totale ou partielle de données ou de fonctionnalités (Il y a peu de chance que ça arrive mais au cas où, sait-on jamais Very very happy ). Ni de colère ou dépression de votre part (je ferai de mon mieux pour vous les éviter ^^).

Nous pouvons maintenant commencer Smile Mais avant d'entrer dans le vif du sujet, nous allons faire un peu d'histoire (je vous rassure pas longtemps Wink ).


Histoire de "l'assembleur"

Nous voici autour des années 1940-50. La science informatique est en plein boom, suite aux inventions révolutionnaires dans l'électronique : le tube électronique qui existait déjà depuis 1906, le transistor en 1947 puis plus tard le circuit intégré en 1958. Les ordinateurs se multiplient, chaque fois plus rapides et plus puissants que leurs prédécesseurs. Un des plus célèbres ordinateurs de ces années est sans doute l'ENIAC.


L'ENIAC... Regardez comme ils ont l'air de s'amuser, c'est y pas beau :')


Dans tout ça, on peut se demander à quoi servent ces ordinateurs aux scientifiques. Et bien ils servent à la programmation. On entre d'un côté des données, l'ordinateur fait des calculs, et il sort le résultat. Détaillons un peu plus le fonctionnement de ces machines. Elles fonctionnent de façon séquentielle : elles lisent l'instruction qu'on leur fournit, l'exécutent, puis passent à l'instruction suivante, et ainsi de suite jusqu'à la fin du programme. Cependant, les instructions, correspondant à différentes actions qu'une machine peut effectuer, ne sont pas universelles : chaque ordinateur construit possède son propre jeu d'instructions, c'est-à-dire l'ensemble des instructions disponibles. Par exemple, l'ordinateur A peut effectuer les additions et les multiplications, tandis que l'ordinateur B n'effectue que les additions et les soustractions.

Pour fournir les données et les instructions à l'ordinateur, on utilise le binaire. Le seul langage que l'ordinateur comprend, c'est le langage machine, qui n'est autre que du binaire. L'ordinateur ne sait manipuler que des 0 et des 1, et ce à cause de leur représentation au sein de celui-ci : le courant électrique passe (1), ou ne passe pas (0). Pour entrer un programme dans un ordinateur, on doit donc lui fournir une suite de '0' ou de '1'. Cela se faisait grâce à divers support : des boutons, des interrupteurs, des lumières ou des cartes perforées. Dans chacun des cas, on distingue bien 2 états distincts qui correspondent au 0 et au 1 : éteint-allumé, branché-débranché, et pour la carte perforée, un trou ou pas de trou.


Une carte perforée.



Une opératrice insère des cartes perforées dans une machine (« Hihihi je comprends rien à ce que je fais ! »)


Pour programmer donc, on saisit dans l'ordinateur des 0 et des 1. Seulement voilà, le binaire, pour un humain, c'est difficilement lisible. Vous imaginez vous rappeler que 00110101 ça veut dire "faire une division" ? Très vite, on a eu l'idée d'écrire les programmes à la main sur une feuille de papier avec des mots plutôt que des nombres, puis de convertir chaque opération en langage machine lors de la saisie dans l'ordinateur. De cette façon, le code source d'un programme devient compréhensible : on le lit et on comprend ce que le programme fait. On mit alors en place un système de mnémoniques, où chaque séquence de lettres très courte correspond à une instruction. Lors de la saisie du programme dans la machine, il suffisait de convertir chaque mnémonique en langage machine à l'aide d'une table de conversion. C'est le début de ce qu'on appelle le langage assembleur, alias assembleur, abrégé ASM.


Exemple d'assembleur. La 2e colonne (PROC, CMP, etc.) correspond aux mnémoniques.


Mais ne nous arrêtons pas en si bon chemin. L'assembleur a beau rendre la lecture des programmes plus facile qu'en binaire, reste qu'il faut convertir tout ce qu'on fait en binaire. Et ça prend du temps. D'où l'idée à laquelle ont pensé les chercheurs : pourquoi ne pas utiliser l'ordinateur pour automatiser ce processus ? Ils ont alors créé un programme qui prend en entrée les mnémoniques et qui les convertit en langage machine. Ce programme est appelé... un assembleur.

Alors oui, le langage et le programme qui le transforme en langage machine sont désignés par le même mot. On désignera de préférence le langage par l'abréviation ASM et le programme par assembleur. Sachez que l'anglais fait la distinction plus facilement : le langage se dit "assembly" et le programme "assembler".


Retour à la SNES

De retour dans le présent. Appliquez tout ce que je viens de dire au mot processeur, et nous y voilà ! Vous savez tous qu'au fin fond de votre ordinateur, chez vous, se cache un processeur. C'est en fait un microprocesseur, car de nos jours les processeurs ont été miniaturisés grâce aux évolutions technologiques. Mais par abus de langage, j'emploierai le terme "processeur".
C'est donc le processeur qui effectue les instructions. Il existe différents types de processeurs, chacun ayant son propre jeu d'instructions. Nous en déduisons qu'il n'existe pas un ASM universel, mais bel et bien un ASM différent pour chaque sorte de processeur. Toutefois certaines notions restent les mêmes quelque soit l'ASM dont on parle, comme par exemple les mnémoniques.

La SNES, maintenant. Elle aussi possède un processeur et jeu d'instructions bien à lui. Ce processeur c'est le Ricoh 5A22, basé sur CMD/GTE 65c816, qui est basé sur le 65C816, basé sur le 65C02, basé sur le 6502. Ça en fait de la copie modifiée hein ? ^^ Bon c'est pas vraiment important mais je vais détailler un peu plus : le 6502 a été crée par la société MOS Technology en 1975. Puis l'employé de la société qui détenait des parts du brevet du processeur a créé sa propre entreprise, Western Design Center (WDC). Il sort une version améliorée du 6502, le 65C02. Puis une version améliorée de ce dernier, le 65C816. Nintendo décide d'utiliser ce processeur pour la SNES, mais le voudrait plus personnalisé pour s’adapter à la console. D'où la société Ricoh qui lui produit le 5A22, une version basée sur le 65C816.


...la bêêêête...


Dans tout ceci, notez que les ASM des 6502, 65C02 et 65C816 sont identiques, à l'exception près que chacun rajoute des fonctionnalités et instructions par rapport à son prédécesseur. Notez aussi que le 65C816 et 65816 sont des termes identiques ; il s'agit juste d'un abus de langage. Enfin, on parle pour la SNES d'ASM 65816 car le Ricoh 5A22 ne modifie pas le jeu d'instructions du 65816 : l'ASM est le même entre ces deux processeurs.

Pour l'acronyme 65C816 : le 65 vient de la série des 65x (juste un nombre industriel, cherchez pas Razz ) ; le C désigne la technologie CMOS (c'est de l'électronique) ; le 816 signifie que le processeur peut travailler avec du 8 ou 16 bits (on y reviendra plus tard Wink ).


Avec quoi on fait de l'ASM ?

C'est une très bonne question ! On a besoin de 2 outils :
  • Un éditeur de texte pour écrire son programme. Ça peut être le bloc-notes de Windows ! Si si, je vous assure ! Seulement il serait plus judicieux d'utiliser un éditeur de texte plus avancé qui offre des fonctionnalités bien utiles, comme la gestion de l'indentation ou la coloration syntaxique. Il en existe beaucoup pour l'ASM de la SNES... Dans ce domaine, je vais vous laisser chercher et trouver chaussure à votre pied. Simplement, je vous conseille pour commencer Notepad++. Il est très simple d'utilisation et dispose des fonctions de base. Et on peut lui fournir un fichier de langage... que je vous ai préparé !

    Lien 1 | Lien 2 (mirroir)

    Pour importer le fichier, ouvrez Notepad++, allez dans Langage > Define your langage, cliquez sur Importer, choisissez le fichier de langue que vous venez de téléchargez, Ouvrir et voilà ! Redémarrer Notepad++ et vous verrez dans Langage une entrée appelée ASM 65816.

  • Un assembleur (je parle du programme assembleur, vous vous souvenez ? Razz ). Le petit problème avec les assembleurs, c'est qu'il n'en existe pas qu'un, et que chacun a sa syntaxe. Si vous codez pour un assembleur précis, votre code risque de ne pas marcher avec un autre assembleur. L'assembleur le plus connu, c'est xkas. Je vous apprendrai à coder pour xkas, mais aussi pour TRASM qui est encore utilisé pour les sprites, et pour asar qui est censé être le remplaçant de xkas et la nouvelle référence dans le smwhacking.

En théorie c'est tout ce dont vous avez besoin pour faire de l'ASM (je ne compte pas l'émulateur et tout le bataclan Razz ). En pratique, pour ce cours, étant donné que je vous apprendrai à faire des custom blocks et custom sprites, vous aurez besoin de Block Tool Super Deluxe et Spritetool.




Voilà ! Ce premier cours est terminé happy j'espère que vous avez beaucoup appris et que vous avez envie de lire la suite ! Alors je vous donne rendez-vous pour... heu, la prochaine fois. Et dans ce prochain chapitre, nous ferons un peu de mathématiques (Non ! Partez pas !! Very very happy ).


>2. Mathématiques<
>3. Premiers pas<


La traduction en anglais de chaque mot est précisée entre crochets.

Accumulateur [Accumulator]
Registre dont l'utilité est bien souvent de stocker uniquement des données telles que des résultats d'opérations arithmétiques et logiques.

Architecture de processeur [Instruction set architecture]
Agencement des composants électroniques au sein d'un processeur. L'architecture d'un processeur spécifie notamment les registres, les bus, les entrées-sorties mais aussi le jeu d'instructions, etc.

Argument [Argument]
c.f. Opérande

Assembleur (langage) [Assembly]
Langage qui représente le langage machine de façon plus lisible pour l'Homme.

Assembleur (programme) [Assembler]
Programme qui traduit le langage assembleur en langage machine.

Base [Radix]
Nombre de chiffres utilisés (zéro inclus) pour représenter l'ensemble des nombres.

Binaire [Binary]
Système de numération utilisant 2 chiffres uniquement, le 0 et le 1 (numération en base 2)

Bit [Bit]
Chiffre en binaire. Par définition, un bit ne peut être égal qu'à 0 ou 1.

Bus [Bus]
Circuits électroniques dont le rôle est d'acheminer des données d'un point à un autre.

Byte [Byte]
Plus petit groupe de bits manipulé comme un tout par un ordinateur. Le byte équivaut bien souvent à 8 bits.

Chiffre [Digit]
Symbole utilisé de base pour représenter l'ensemble des nombres.

Code source [Source code]
Ensemble d'instructions destinés à être exécutés par une machine, écrit dans un langage compréhensible par l'Homme.

Décimal [Decimal]
Base 10. Système de numération que l'on utilise communément.

Décrémentation [Decrement]
Opération qui consiste à soustraire une valeur entière fixe à une autre valeur, variable.

Double mot [Double word, dword]
Un groupe de bits d'une taille 2 fois supérieure à celle d'un mot, correspondant généralement à 32 bits.

Hexadécimal, hexa [Hexadecimal, hex]
Base 16. Les chiffres de 10 à 15 sont notés à l'aide des 6 premières lettres de l'alphabet : A, B, C, D, E, F.

Horloge [Clock]
Générateur de tic-tac électroniques (du courant électrique à intervalle régulier) pour cadencer non seulement le processeur mais aussi les autres composants du système qui le requièrent.

Incrémentation [Increment]
Opération qui consiste à ajouter une valeur entière fixe à une autre valeur, variable.

Jeu d'instructions [Instruction set]
Ensemble des instructions qu'un processeur peut exécuter.

Langage Machine [Machine language]
Seul langage compréhensible par un processeur, qui n'est autre que du binaire.

Long [Long]
En ASM 65C816, désigne un groupe de 24 bits.

Microprocesseur [Microprocessor]
Processeur dont les composants ont été miniaturisés jusqu'à tenir dans une seule puce électronique.

Mnémonique [Mnemonic]
Méthode permettant de retenir facilement une information. Dans le langage assembleur, il s'agit des groupes de lettres correspondant aux instructions.

Mot [Word]
Groupe de bits traités comme un tout par un ordinateur. La taille d'un mot peut être de 8, 16, 32, 64 bits, etc.

Nibble [Nibble]
Groupe de 4 bits.

Notation positionnelle [Positional notation]
Système de numération dans lequel la position de chaque chiffre est reliée à la position voisine par un multiplicateur appelé la base.

Octet [Octet]
Groupe de 8 bits.

Opcode [Opcode (Operation code)]
Nombre qui détermine la nature de l'instruction à effectuer. Un opcode est une instruction en langage machine.

Opérande [Operand]
L'objet sur lequel porte une instruction. L'opérande suit directement un opcode.

Processeur [Central processing unit, CPU]
Composant d'une machine qui effectue les opérations d'un programme.

Programme [Program]
Suite d'instructions destinées à être exécutées par une machine.

Registre [Register]
Emplacement mémoire situé au sein du processeur. L'accès aux registres est très rapide. Les registres sont bien souvent très restreint en taille.

Séquenceur [Control unit]
c.f. Unité de contrôle

Unité arithmétique et logique (UAL) [Arithmetic Logic Unit (ALU)]
Partie d'un processeur dont le rôle est d'effectuer les opérations arithmétiques et logiques (exemple : les additions)

Unité de contrôle [Control unit]
Partie d'un processeur dont le rôle est de récupérer les instructions, les comprendre et coordonner les autres composants du processeur pour effectuer ces instructions.





NotionChapitre
0-9, caractères spéciaux
65C8161
$2-3
%2-3
#3
A
Accumulateur3
Addition2
Alias3
Architecture3
Argument3
Asar1, 3
Assembleur (langage)1
Assembleur (programme)1, 3
B
Base2
Binaire1, 2
Bit2
Bit de poids faible2
Bit de poids fort2
Bus3
Byte2
C
Carte perforée1
Chiffre2
Circuit électronique3
Code source1
Commentaire3
Composant électronique3
Conversion2
Cycle3
D
DEC3
Décimal2
Décrémentation3
Développement en base p2
DEX3
DEY3
Division2
Double mot2
Dword2
F
Fréquence3
H
Hexadécimal2
Horloge3
I
INC3
Incrémentation3
INX3
INY3
J
Jeu d'instructions1
L
Langage machine1, 3
LDA3
LDX3
LDY3
Long2
M
Machine1
Microprocesseur1
Mnémonique1, 3
Mot2
N
Nibble2
Nombre2
Notation positionnelle2
Notepad++1
O
Octet2
Opcode3
Opérande3
Oscillateur3
P
Processeur1, 3
Programme1
Programmation séquentielle1
Q
Quartet2
R
Registre3
Reste2
Ricoh 5A221
S
Séquenceur3
SNES1, 3
T
TAX3
TAY3
Trasm1, 3
TXA3
TXY3
TYA3
TYX3
U
Unité arithmétique et logique3
Unité de contrôle3
W
Word2
X
X3
Xkas1, 3
Y
Y3



______________________


Mais, je lis pas de manga !


Dernière édition par SL le Jeu 11 Sep 2014 - 21:39; édité 22 fois
Revenir en haut
Publicité






MessagePosté le: Lun 19 Nov 2012 - 17:44    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
yogui
Admin ?
<b>Admin ?</b>

Hors ligne

Inscrit le: 08 Juin 2008
Messages: 2 925
Points étoile: 6 588
Moyenne des points: 2,25
Potentiel de hack:
Localisation: ツ
Masculin Balance (23sep-22oct) 羊 Chèvre

MessagePosté le: Lun 19 Nov 2012 - 18:31    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Oh mais c'est super tout ça.
Enfin bon ce n'est que la partie historique et je connais déjà car j'y ait vu en cours mais au moins j'ai appris qu'on pouvait mettre le langage ASM 65816 dans notepad++ (jusque-là j'avais une ancienne version ou il n'y avait pas de fonction d'import de langage).
J'ai hâte de voir la suite.

____________________


Revenir en haut
Visiter le site web du posteur MSN Skype
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Mer 21 Nov 2012 - 23:52    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Merci pour cet encouragement ! Smile
Je continue la suite, ça avance plutôt bien car pour une fois j'ai une superbe motivation. Prochain chapitre... bientôt ? :p

______________________


Mais, je lis pas de manga !


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Lun 26 Nov 2012 - 00:20    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Chapitre 2 : Mathématiques

C'est parti pour le chapitre 2 ! Aujourd'hui nous allons nous pencher sur le binaire et l'hexadécimal. Même si vous connaissez déjà ces deux systèmes de numération, je vous encourage fortement à lire cette partie, car je vais y aborder une terminologie et des notions fondamentales pour le reste du tuto.


La base

Quand je parle de base, j'entends par là son sens arithmétique. Mais qu'est-ce que c'est, au juste ? La meilleure définition que j'ai trouvée vient du Petit Robert (2007) :

Base de numération : nombre de chiffres, y compris le zéro, qui servent de base pour former les autres nombres.

Cela semble simple, et pourtant... décortiquons cette affirmation ensemble.
La base est un nombre. On peut par exemple parler de base 4, de base 6, etc. Ce nombre correspond au nombre de chiffres qu'on peut utiliser pour former n'importe quel autre nombre. Prenons en exemple la base 10. Cela veut dire que l'on peut utiliser en tout 10 chiffres, zéro compris, pour représenter n'importe quel nombre. Ces chiffres, nous les connaissons : 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9. La base 10 est ce que nous utilisons communément pour écrire les nombres : c'est le système décimal.

Attardons-nous maintenant sur la base 2. Comme son nom l'indique, on a le droit d'utiliser que 2 chiffres, 0 compris. Il ne nous reste plus que le 1 donc. Et c'est de cette façon que l'on écrit les nombres en base 2, autrement appelé le binaire : avec des 0 et des 1. Ainsi, la suite des entiers naturels ne s'écrit plus 0, 1, 2, 3, etc., mais 0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, etc. Vous saisissez ? Comme en décimal, à chaque fois que l'on ajoute 1 à un chiffre qui a déjà atteint le maximum (1 en binaire, 9 en décimal), il redevient 0 et on ajoute une retenue à sa gauche : c'est le principe de notation positionnelle (nous y reviendrons un peu plus bas).

Parlons à présent de l'hexadécimal (que nous allons abréger hexa). Si vous avez des bases en grec et latin, vous savez que le mot a pour racine hexa-, de hex, 6 en grec, et -décim-, de decem, 10 en latin. Il s'agit ni plus ni moins de la base 10 + 6 soit la base 16.
Le petit problème avec la base 16, c'est qu'il manque des chiffres. En effet, on ne connaît que 10 chiffres, et impossible d'utiliser les nombres de 10 à 15 en tant que chiffre : comment feriez-vous la différence entre 115 (un - quinze) et 115 (onze - cinq) par exemple ? Il faudrait inventer 6 symboles supplémentaires. Ce que l'on a pas fait : on a tout bonnement utilisé les 6 premières lettres de l'alphabet ! 10 devient A, 11 devient B, et ainsi de suite jusqu'au 15 qui devient F. Et 16 ? Il s'écrit 10 en hexa ! Rappelez-vous comment l'écriture des nombres fonctionne : une fois atteint le chiffre maximum, il redevient 0 et on ajoute une retenue à sa gauche. Ainsi, le F (15 en décimal) devient 0 et on ajoute un 1 à sa gauche pour donner 10 (16 en décimal).

Un petit tableau pour résumer tout ça happy


Chaque ligne représente le même nombre écrit dans des bases différentes.


Vous avez peut être remarqué que j'ai mis en évidence des valeurs particulières... Lorsqu'un nombre écrit en binaire est de la forme "1 suivi de un ou plusieurs 0", ce nombre est une puissance de 2 (1000 en binaire = 8 en décimal = 23). Et si on retranche 1 à ce nombre, ledit nombre écrit en binaire n'est composé que de 1 (27 - 1 = 127 = 1111111 en binaire) !
Mais quelle est cette magie ? Pour le découvrir, nous allons plonger plus loin dans les mathématiques. Accrochez-vous ! Very very happy


La numération positionnelle

Définition : dans un système de position en base p, on note un nombre [tex]\overline{a_n a_{n-1} ... a_1 a_0}^p[/tex]. Ce nombre s'écrit dans notre système décimal de position par :
[tex]\overline{a_n a_{n-1} ... a_1 a_0}^p = a_n\times p^n + a_{n-1}\times p^{n-1} + ... + a_1 \times p^1 + a_0 \times p^0[/tex]
[tex]\qquad \quad \quad \quad \quad \quad = \sum_{k=0}^{n} {a_k p^k} \qquad (avec \: 0 \leq a_k < p)[/tex]

C'est du lourd hein ? Ne vous inquiétez pas, j'explique Wink Pour commencer, nous allons abandonner la notation avec la barre au-dessus des chiffres et la base en exposant au profit de celle couramment admise avec la base en indice, comme ceci : 011010102. Nous allons aussi admettre que si la base n'est pas précisée en indice, le nombre est écrit en décimal. Prenons maintenant un exemple, le nombre 541810. Selon la définition, la base p équivaut à 10 et le nombre est égal à [tex]8\times 10^0 + 1\times 10^1 + 4\times 10^2 + 5\times 10^3 [/tex].
Soit [tex]8\times 1 + 1\times 10 + 4\times 100 + 5\times 1000 [/tex]. Ca vous semble logique non ? Le 5, chiffre des milliers, est multiplié par 1000, le 4, chiffre des centaines, est multiplié par 100, et ainsi de suite.
Et bien cette définition reste vraie pour les autres bases. Prenons la base 2 cette fois-ci, et considérons le nombre 101112. Toujours selon la définition, [tex]10111_2 = 1\times 2^4 + 0\times 2^3 + 1\times 2^2 + 1\times 2^1 + 1\times 2^0 = 16 + 4 + 2 + 1 = 23[/tex]. Et voilà un nombre binaire converti en décimal !
En hexa maintenant : [tex]1B3_{16} = 1\times 16^2 + 11\times 16^1 + 3\times 16^0 = 256 + 176 + 3 = 435[/tex] (pour rappel, B16 vaut 1110).

Pour la notation avec le sigma, si vous ne comprenez pas, ce n'est pas grave. Il s'agit juste de la ligne du dessus, factorisée avec la notation de somme. En parlant de factorisation... On peut factoriser ladite ligne par ceci : [tex](( ... (( a_n ) \times p + a_{n-1} ) ... ) \times p + a_1 ) \times p + a_0[/tex]. Ca semble compliqué, seulement ça nous aide beaucoup.
Regardez plutôt : pour n'importe quel nombre en décimal noté x, on peut le diviser par un nombre p. La définition de la division nous donne [tex]x = y_0 \times p + a_0 \: (avec \: 0 \leq a_0 < p)[/tex].
Et si [tex]y_0 \geq p[/tex], on peut encore le diviser par p.
Et ça nous donne : [tex]x = (y_1 \times p + a_1 ) \times p + a_0 \: (avec \: 0 \leq a_0 < p \: et \: 0 \leq a_1 < p)[/tex]. Même chose avec y1, etc. Vous voyez où je veux en venir ? On revient à la forme factorisée de tout à l'heure ! On peut donc déduire que si on effectue des divisions successives par un nombre p sur n'importe quel nombre décimal x, la séquence de restes et du dernier quotient forme le développement de x en base p (c'est-à-dire x écrit en base p).


Deux exemples pour que vous compreniez mieux.


Il est temps à présent de nous attarder sur une propriété assez importante. Cette propriété, la voici : 4 chiffres en binaire correspondent à 1 chiffre en hexadécimal.
Pourquoi cela ? Démontrons-le. Combien peut-on former de nombres en hexa avec 1 seul chiffre ? Utilisons la définition de la base : base 16, donc 16 chiffres, soit 16 nombres (0 compris). Combien peut-on en former avec 4 chiffres en binaire ? Le maximum que l'on puisse obtenir avec 4 chiffres est de [tex]1111_2 = 1\times 2^3 + 1\times 2^2 + 1\times 2^1 + 1\times 2^0 = 8 + 4 + 2 + 1 = 15[/tex]. Et si on ajoute le 0, on obtient 16 ! Comme en hexa ! On peut former autant de nombres avec 4 chiffres en binaire qu'avec 1 en hexa. Par extension, chaque groupe de 4 chiffres en binaire (en partant de la droite bien sûr) correspond à 1 chiffre en hexa. Cette propriété est diablement utile, car avec elle, je peux convertir de l'hexadécimal en binaire à la vitesse de l'éclair ! Démonstration :


La conversion entre hexa et binaire n'a jamais été aussi simple !


Faisons le point. Nous venons de découvrir les relations entre binaire, décimal et hexadécimal, et notamment des méthodes pour convertir vers le décimal (premier paragraphe), pour convertir depuis le décimal (deuxième paragraphe) et enfin pour convertir entre l'hexadécimal et le binaire. Alors, vous êtes tentés de me dire "C'est super tout ça, mais ma calculatrice calcule plus vite que toi, moi, ou tes méthodes !". Et vous auriez raison. Cette sous-partie était technique et, je l'avoue, pas indispensable pour faire de l'ASM. Mais elle était riche en informations qui ne déplairaient pas à votre culture générale ! happy Et à vrai dire, l'ASM vous amènera souvent à jongler entre les bases (2 et 16 principalement), alors s'il y a bien une chose à retenir, c'est la propriété du dernier paragraphe.
Nous allons à présent appliquer toute cette théorie à l'ASM, et cette fois-ci en revanche, vous avez intérêt à suivre, je vais introduire des notions capitales pour la suite du tuto.


Vocabulaire et notation

A vos marques, prêt, mémorisez !
En ASM, et plus généralement en informatique, en binaire, un chiffre s'appelle un bit. Inutile de le rappeler (mais c'est pourtant ce que je fais), un bit ne peut prendre que 2 valeurs : 0 ou 1. Un groupe de 8 bits s'appelle un octet. Un groupe de 4 bits s'appelle un nibble ou quartet. Un groupe de bits traité comme un tout s'appelle un mot. Un mot peut avoir plusieurs tailles : 16 bits, 32 bits, etc. Un groupe de 32 bits s'appelle un double mot. Voilà, ça, c'était la partie rigoureuse.
En ASM, nous appellerons : 8 bits un octet ; 16 bits un mot ; 24 bits un long. Oui, le mot peut porter à confusion : en général, un mot n'est pas forcément de 16 bits (comme vu précédemment) ; mais ici, en ASM et pour toute la suite du tuto, un mot signifiera 16 bits.

En anglais maintenant ! Un bit reste un bit, un octet reste un octet, un nibble reste un nibble. Un mot se dit word. Un byte est comme un mot : c'est une unité, soit un groupe de bits traité comme un tout. Seulement l'usage du mot fait qu'il désigne bien souvent un groupe de 8 bits, soit un octet. Un long reste un long. Un double mot est un dword ou double word.
Vous remarquerez que les deux langues possèdent leur lot de subtilités. En français, c'est le mot, et en anglais le byte.

Approchons-nous d'un octet. Le bit le plus à droite est appelé bit de poids faible, parce que c'est lui qui a le moins de valeur. Si vous vous souvenez bien, ce bit est multiplié par p0 soit 1, alors que n'importe quel autre bit à sa gauche est multiplié par p ou plus. A l'inverse, le bit le plus à gauche correspond au bit de poids fort. Il existe aussi une numérotation des bits. Chaque bit est numéroté de 0 à 7 pour un octet ou de 0 à 15 pour un mot, en partant de la droite.


Numérotation des bits.


Ainsi, dans un octet, si je vous parle du bit 7, vous savez qu'il s'agit du bit de poids fort d'un octet. Si je vous parle du bit 4, vous savez qu'il s'agit de celui-ci : 10101101

Pour finir, parlons notation. En ASM, un nombre hexadécimal est préfixé par le symbole $ ; un nombre en binaire est préfixé par le symbole % ; un nombre décimal reste tel quel. Nous notons donc :

111101102->%11110110
6410->64
AD16->$AD

Ouf ! Nous en avons fini ! C'est la fin de ce chapitre, ou presque, car je vous ai préparé quelques exercices pour vous entraîner à manipuler tout ce que nous venons de voir. Tous les exercices sont à faire sans la calculatrice Wink Utilisez-là pour vous corriger uniquement. Je mettrai les solutions détaillées plus tard, le temps que vous proposiez vos solutions (si vous proposez vos solutions, détaillez le calcul ! sinon c'est trop facile Razz )


Exercices

Note : maintenant que nous avons vu la notation binaire et hexadécimale utilisée en ASM, je n'utiliserai que celle-ci pour le reste du tuto. Autant vous familiariser avec elle dès à présent !
  1. Convertissez %00011001 en base 10.
    Rien de bien compliqué, on applique la définition vu précédemment : %00011001 = 24 + 23 + 20 = 16 + 8 + 1 = 25.

  2. Convertissez $AA2 en base 10.
    Même chose : $AA2 = 10 × 162 + 10 × 161 + 2 × 160 = 2560 + 160 + 2 = 2722

  3. Convertissez 75 en base 2.
    On effectue des divisions successives jusqu'à ce que le quotient soit strictement inférieur au diviseur :
    75 = 37 × 2 + 1
    37 = 18 × 2 + 1
    18 = 9 × 2 + 0
    9 = 4 × 2 + 1
    4 = 2 × 2 + 0
    2 = 1 × 2 + 0
    Puis on note le dernier quotient suivi de tous les restes que l'on a obtenu, dans l'ordre inverse :
    75 = %1001011

  4. Convertissez 206 en base 16.
    Même chose, sauf qu'une seule division suffit (n'oubliez pas de noter le quotient) :
    206 = 12 * 16 + 14
    206 = $CE

  5. Convertissez $23 en base 2.
    Avec la méthode 4 chiffres en binaire = 1 chiffre en hexa, c'est très facile !
    $2 = %0010
    $3 = %0011
    $23 = %00100011

  6. Convertissez %01010101 en base 16.
    Même méthode. Encore plus facile, car les deux groupes de 4 bits sont identiques :
    %0101 = $5
    %01010101 = $55.
    Vous avez peut-être remarqué que ce nombre est plutôt curieux : on alterne les 0 et 1. Il s'agit d'une valeur un peu particulière, au même titre que $AA, qui équivaut à %10101010. Ces deux valeurs sont utilisées pour tester la mémoire, en soumettant un courant électrique (un 1) de façon isolée (les 1 sont séparés par des 0) à chaque composant pouvant stocker un bit. Même si c'est pour votre culture générale, sachez que vous serez sans doute amené à croiser à nouveau ces deux nombres dans ce contexte-ci.

  7. Combien font 128 - 1 en base 2 ?
    Inutile de faire la soustraction en décimal : on sait que 128 = 27 = %10000000. A présent, si on retranche 1 à ce nombre en binaire, on obtient %1111111 !

  8. Combien font $30 + $40 en base 16 ?
    Vous pensiez qu'il y avait un piège ? Pas du tout ! Razz $30 + $40 = $70, comme en décimal. En fait, les règles d'additions sont conservées quelque soit la base utilisée. C'est-à-dire que l'on prend les deux nombres les plus à droite, on les ajoute, et si le résultat dépasse le chiffre maximum, on ne garde que le chiffre le plus à droite du résultat et on ajoute une retenue sur le nombre de gauche. Et ainsi de suite avec les autres chiffres de la gauche. Un exemple : $5B + 99
    $B + $9 = $14
    Je garde le 4, j'ajoute 1 sur l'opération suivante :
    $5 + $9 + $1 = $F
    Le résultat : $5B + $99 = $F4.

  9. Combien font $80 + $30 en base 2 ?
    Ici, on pourrait additionner les deux nombres en hexa et faire la conversion du résultat en binaire. Pourquoi n'allons-nous pas le faire ? Et bien parce que, même si la méthode "1 chiffre hexa = 4 chiffres binaires" est très rapide, les valeurs utilisées ici sont remarquables, et peuvent être converties en binaire de façon immédiate. Ces valeurs remarquables, les voici :
    $80%10000000
    $40%01000000
    $20%00100000
    $10%00010000
    $08%00001000
    $04%00000100
    $02%00000010
    $01%00000001

    Souvenez-vous en, vous allez les revoir ! Aussi, les additions de ces valeurs sont facile à reconnaître : $90 = $80 + $10, $30 = $20 + $10, $5 = $4 + $1, etc. De fait, vous ne devriez même plus additionner puis convertir ces valeurs, elles devraient vous apparaître immédiatement en binaire : si je vous dis $50, vous savez immédiatement que je parle de %0101000, soit $40 + $10. L'inverse est valable : si je dis %10000010, vous visualisez $80 + $2 soit $82.
    Si vous n'y arrivez pas bien pour le moment, ne vous inquiétez pas ! Ça viendra avec la pratique Razz En attendant, voici la solution de l'exercice :
    $80 + $30 = $80 + $20 + $10 =
    %10000000
    %00100000 +
    %00010000 +
    -----------
    %10110000



______________________


Mais, je lis pas de manga !


Dernière édition par SL le Jeu 6 Déc 2012 - 01:33; édité 5 fois
Revenir en haut
Chme
Boo pêcheur
Boo pêcheur

Hors ligne

Inscrit le: 28 Avr 2011
Messages: 513
Points étoile: 718
Moyenne des points: 1,40
Potentiel de hack:
Localisation: Dans le grand nord, sous le blizzard et entre les caribous
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Mar 4 Déc 2012 - 23:00    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Ton tutoriel est vraiment super, c'est que je cherchait pour mieux comprendre l'ASM.
J'ai hâte de voir la suite !

________________________________________
"See, you can have all the skill in the world and still have a bad day. It doesn't take much for the most fortunate man around to have a fall. It's life really, innit?"

Joshua (Fire Emblem: The Sacred Stones)


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Ven 15 Mar 2013 - 01:09    Sujet du message: Tutoriel sur l'ASM Répondre en citant

やった!

Merci pour le commentaire Chme. Du coup j'ai fait quelques modifs :
-ajouté le lien du 2 dans le premier post. Je vais pas poster les chapitres dans le premier post, je vais juste mettre les liens.
-ajouté un glossaire dans le premier post.
-ajouté les solutions des exercices du chapitre 2. Je vous engage à les lire, j'y donne des infos tout aussi importantes que celles qui sont dans le tuto.

Dans le prochain chapitre nous verrons nos premières instructions.

...mais ça sera pas pour tout de suite, car j'ai beaucoup de travail à cause de l'école.

EDIT :
Mise à jour du chapitre 1 avec la distinction entre processeur et microprocesseur (partie 2 §1)
Mise à jour correspondante du glossaire
Ajout d'un index dans le premier post
Le chapitre 3 arrive très bientôt !!

______________________


Mais, je lis pas de manga !


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Ven 15 Mar 2013 - 18:22    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Chapitre 3 : Premiers pas

Et voilà le chapitre 3 ! Cette fois-ci nous allons étudier de plus près l'ASM 65816. Nous verrons d'abord de quoi se compose le processeur de la SNES, puis nous apprendrons nos premières instructions (enfin !).


Architecture

Non, je ne parle pas d'architecture dans la construction de bâtiments, mais plutôt de l'agencement des composants électroniques au sein du processeur. Et oui, le processeur n'est pas une petite boîte mystérieuse, il est constitué de circuits électroniques organisés en groupes remplissant des fonctions précises. Regardez plutôt :


Schéma simplifié de l'architecture interne du 65C816. Vous ne comprenez rien ? C'est normal !


Vous pouvez voir que ce schéma est découpé en blocs reliés par des flèches. Nous allons donc dès à présent étudier de près ces différents composants.

  • L'unité de contrôle ou séquenceur (en anglais control unit) : c'est le "cerveau du cerveau". C'est l'unité de contrôle qui coordonne les différentes parties : elle demande les instructions à effectuer, les décode et ordonne aux composants concernés d'effectuer le travail demandé par les instructions. Sur le schéma, il s'agit du bloc intitulé "System Control" ainsi que du gros bloc à sa gauche divisé en trois verticalement.

  • L'horloge (en anglais clock) : l'unité de contrôle utilise l'horloge pour cadencer le fonctionnement du processeur. L'horloge envoie de façon périodique des signaux appelés cycles. A chaque cycle, l'unité de contrôle déclenche une action. Ce système a pour but de synchroniser les composants ainsi que les opérations qu'ils exécutent et de simplifier le fonctionnement du processeur. L'horloge est visible sur le schéma sous l'appellation "Clock Generator" et "Timing Cont." (qui signifie "Timing Control Unit").

  • L'unité arithmétique et logique, abrégée UAL (en anglais arithmetic logic unit abrégé ALU) : l'UAL est comme son nom l'indique le siège des opérations arithmétiques et logiques. C'est ici que le processeur effectue les calculs comme les additions, les multiplication, etc. Il est facilement repérable sur le schéma : c'est le bloc marqué "ALU".

  • Les registres (en anglais register) : une définition de "registre" pourrait être : Emplacement mémoire situé dans le processeur et dont l'accès est quasi instantané. Un registre, c'est de la mémoire ; cela veut dire que le processeur peut y stocker du binaire. Mais c'est de la mémoire un peu spéciale : parce qu'elle se trouve à l'intérieur du processeur, elle est d'une part très rapide d'accès (contrairement à la mémoire classique située à l'extérieur du processeur), et d'autre part très limitée. En effet le processeur n'est pas extensible, il ne peut contenir qu'une dizaine de registres, chacun pouvant accueillir qu'un ou deux octets.

  • Les bus (même mot en anglais) : ce sont les flèches sur le schéma ! Un bus sert à transporter des données d'un point à un autre. Tout simplement Wink. Ce sont juste des circuits électroniques qui permettent aux registres, à l'UAL, la mémoire et tout le reste de s'échanger des données.


Après cette visite guidée, nous allons revenir sur un point crucial : les registres. En écrivant en ASM, on utilise systématiquement les registres, et ce pour plein de raisons : stocker le résultat des opérations arithmétiques, des nombres extraits de la mémoire (externe) ou bien les instructions elles-mêmes, comparer des nombres, modifier l'ordre d'exécution du programme, et j'en passe. Dans le 65C816, il y a en tout 10 registres, dont 9 avec lesquels nous travaillerons (le 10e n'étant accessible par aucune instruction). Nous n'allons pas apprendre tous les registres d'une seule traite. Pour cette fois je vais vous en présenter 3 que nous mettrons en pratique dès la 2e partie de ce chapitre.

  • L'accumulateur, symbole A (en anglais accumulator) : ce registre pouvant accueillir 2 octets (16 bits) est de loin le plus pratique et le plus flexible. Il n'a pas d'autre fonction particulière que de stocker 2 octets. On peut l'utiliser pour tout ce bon nous semble. Vraiment Smile. On abrège très souvent son nom par son initiale (le A), ce que je ferai pour la suite du tutoriel.

  • Les registres X et Y : ces deux registres n'ont pas de nom complet, juste la lettre X pour l'un et Y pour l'autre. Chacun peut, tout comme l'A, accueillir jusqu'à 16 bits. Cependant, ces registres ont une fonction particulière sur laquelle je vais volontairement faire l'impasse Razz. Pour le moment, nous considérerons X et Y aussi libre d'utilisation que l'A.


Bien ! Tout ceci peut vous paraître encore abstrait. Comment un registre s'utilise-t-il ? À quoi va-t-il nous servir ? Quel est l'intérêt ? Ne vous inquiétez pas, toutes ces questions trouveront leur réponse tôt ou tard. D'ailleurs, nous allons de ce pas répondre à la première question en avançant à la 2e partie.


Débutons en ASM

Avant tout, avant même de commencer à écrire de l'ASM, vous allez devoir apprendre la syntaxe. N'y allons pas par quatre chemins :

ABC [X]

Le premier groupe de 3 lettres en rouge correspond au mnémonique. Si vous avez bien suivi le premier chapitre, vous savez que les mnémoniques sont des diminutifs pour les instructions. Pour le 65C816, une instruction se traduit en langage machine par un seul octet. Cela signifie que le jeu d'instructions du 65C816 est constitué d'au maximum 256 instructions différentes (de $00 à $FF). Une instruction en langage machine est appelée opcode (contraction de operation code). Par abus de langage, on désigne ABC par opcode et non mnémonique (c'est quand même plus simple à écrire happy). Notez au passage que tous les opcodes en ASM 65816 sont de 3 lettres, sans exception. Notez aussi que l'usage est d'utiliser des majuscules pour les mnémoniques.
Petit résumé : ABC = 1 instruction = 1 opcode = 1 octet en langage machine.

Le X entouré de crochets est l'opérande. Également appelé argument, l'opérande est ce sur quoi l'opcode agit. Les crochets entourant le X sur la syntaxe indiquent que l'opérande est facultatif. Le caractère facultatif de l'opérande dépend en réalité de l'opcode : certains opcodes n'acceptent aucun argument, d'autres doivent obligatoirement en être suivi d'un. L'opérande peut être par exemple un registre ou un nombre.

Un point important à retenir : une instruction se termine par une fin de ligne. Vous ne pouvez pas mettre plus d'un opcode par ligne. Un réflexe, donc : un fois l'opcode et l'opérande écrits, on appuie sur la touche entrée et on inscrit les instructions suivantes.

Sans plus tarder, découvrons notre premier opcode happy : LDA.
LDA signifie Load Accumulator. Cette instruction permet de charger des valeurs dans l'A, c'est-à-dire d'y stocker des nombres. LDA doit être suivi d'un opérande, qui indique la valeur à charger. Voici un exemple respectant la syntaxe donnée tout à l'heure :
LDA #$10

Regardons de plus près. Le symbole # indique que le nombre qui suit est à stocker dans l'A. Le $ indique que le nombre qui suit est écrit en hexa (souvenez-vous du chapitre 2 !). Pour le moment, nous n'allons travailler qu'avec un seul octet, soit 8 bits (de $00 à $FF). 10 est le nombre en question écrit en hexa, ce qui équivaut à 16 en décimal. Le résultat de cette ligne est que l'A contiendra $10 soit 16. Et si l'A contenait auparavant une autre valeur, celle-ci aurait été écrasée.
On aurait pu aussi écrire :
LDA #16

ou bien
LDA #%00010000

Le résultat aurait été identique. Mais attention ! le symbole # et le préfixe de la base ne sont pas interchangeables ! Voici un exemple de ce qu'il ne faut pas faire :
LDA $#10
LDA %#00010000 ; CE CODE NE MARCHE PAS

Ce code n'est pas valide et ne sera pas traduit en langage machine par l'assembleur. Ah au fait, vous avez remarqué ? j'ai ajouté un commentaire au code. Les commentaires sont précédés par des points-virgules, et ne sont pas traduits en langage machine. Concrètement, lorsque l'assembleur lit votre code source, dès que celui-ci rencontre un point-virgule, tout le texte derrière ce point-virgule est ignoré jusqu'à la ligne suivante. Les commentaires ne sont utiles qu'au sein même du code source. Je ne peux qu'insister pour que vous écriviez des commentaires à côté de votre code qui expliquent ce vous faîtes. Non seulement ça aide à comprendre lors d'une première lecture mais en plus vous en serez très content lorsque vous aurez écrit des dizaines de lignes et que vous rouvrirez votre fichier après 3 mois de pause Wink
; Voici une ligne qui ne sera pas lue par l'assembleur.
LDA #$10 ; ce commentaire est également ignoré, l'assembleur ne traduit en langage machine que le LDA #$10.
; LDA #$11 ; ce LDA #$11 au tout début de la ligne ne sera PAS lu par l'assembleur, car il est précédé d'un point-virgule.

Voilà, je n'ai rien de plus à ajouter sur le LDA pour le moment. Maintenant que vous avez compris le principe, je peux vous présenter LDX et LDY. Vous l'avez sans doute compris, LDX et LDY (Load X et Load Y) fonctionnent de la même manière que LDA mais pour les registres X et Y respectivement. Des exemples :
LDX #$20	; stocke $20 dans X
LDY #$02 ; stocke $02 dans Y

LDA #$10
LDX #$20
LDY #$30 ; A = $10, X = $20, Y = $30
LDA #$40 ; A = $40, X = $20, Y = $30

Pas de difficulté sur ces deux opcodes. On enchaîne tout de suite avec un nouvel opcode : INC.
INC est le mnémonique pour Increment. Incrémenter, c'est ajouter un nombre constant à un autre nombre. Et pour cette instruction, le nombre constant est 1 ! En conséquence, chaque fois que vous utilisez INC, vous ajoutez 1 dans l'opérande. L'opcode INC peut être suivi de l'opérande "A", qui signifie "Accumulator" : vous ajouterez 1 à l'accumulateur. Mais il est aussi possible de l'écrire sans opérande : le fonctionnement est identique et vous ajouterez 1 à l'A.
LDA #$10	; A = $10
INC A ; A = $11
INC ; A = $12
INC A ; A = $13

Vous voyez, c'est pas très dur Smile. Dans la foulée, voici INX et INY (Increment X et Increment Y). Même principe que INC, sauf que cette fois interdiction d'écrire X ou Y en tant qu'opérande. INX et INY s'utilisent sans rien derrière.
LDA #$10
LDX #$20
LDY #$40 ; A = $10, X = $20, Y = $40
INC A ; A = $11, X = $20, Y = $40
INX ; A = $11, X = $21, Y = $40
INX ; A = $11, X = $22, Y = $40
INY ; A = $11, X = $22, Y = $41
INY Y ; CETTE LIGNE NE MARCHE PAS ! L'ASSEMBLEUR RETOURNERA UNE ERREUR !

Passons à une autre série. DEC, DEX et DEY correspondent respectivement à Decrement, Decrement X et Decrement Y. Décrémenter est l'inverse d'incrémenter : c'est soustraire un nombre constant à un autre nombre. Et le nombre constant est toujours 1. Les mêmes principes que pour INC, INX et INY s'appliquent :
LDA #$12
INC A ; A = $13
DEC A ; A = $12
DEC ; A = $11 ; il est possible d'omettre le A, tout comme avec INC
LDX #$05
DEX ; X = $04
DEX X ; CETTE LIGNE NE MARCHE PAS ! IMPOSSIBLE D'AJOUTER UN OPÉRANDE A DEX OU DEY !
LDY #$20
DEY ; Y = $1F

Il est temps de terminer cette partie avec une dernière série : TAX, TAY, TXA, TXY, TYA, TYX. Ne soyez pas effrayés par la quantité, ces opcodes fonctionnent tous de la même manière : Transfer ... to ... . Remplacez les deux "..." par respectivement les 2e et 3e lettres des opcodes. L'appellation "Transfer" est un peu trompeuse. Le terme adéquat devrait être "Copy", car lorsque vous utilisez un de ces opcodes, le premier registre en question est copié dans le second registre. Tous ces opcodes n'acceptent aucun opérande.
LDA #$20	; A = $20
TAX ; A = $20, X = $20
LDX #$10 ; A = $20, X = $10
TXY ; A = $20, X = $10, Y = $10
TAY ; A = $20, X = $10, Y = $20
LDY #$30 ; A = $20, X = $10, Y = $30
TYA ; A = $30, X = $10, Y = $30
TYX ; A = $30, X = $30, Y = $30

Nous en avons terminé avec cette partie ! Smile Nous venons de voir 4 opérations différentes sur les registres A, X et Y : stocker, incrémenter, décrémenter et copier. Et pour cela, on a eu besoin de 15 opcodes différents. Pour clore ce chapitre, je vous propose quelques exercices pour mettre directement en pratique ce que vous venez d'apprendre. N'hésitez pas à relire ce chapitre, il est dense en informations. Si vous vous sentez prêts, passez à la suite ! Smile


Exercices

Pour l'instant, vous n'avez aucun moyen de vérifier que ce que vous avez écrit est correct, à moins de me demander. Cependant, les exercices étant assez faciles, je ne pense pas que ça devrait poser de problèmes. Notez bien qu'il n'y a pas de solution unique ! Ce que vous avez écrit est peut être bon même s'il ne correspond pas exactement à ma solution. Aussi, si vous avez un doute, n'hésitez pas à soumettre votre réponse en postant dans ce sujet.
  1. Sans utiliser l'opcode LDX, écrivez un code qui stocke $22 dans le registre X.
    Aucune difficulté ici. Il suffit d'utiliser l'A ou le Y, puis de copier dans X.
    LDA #$22
    TAX

  2. Sans utiliser les nombres $11, $12 et $13, écrivez un code qui stocke $12 dans l'A.
    Très facile ici aussi. On prend un nombre "à côté", comme $10 ou $14, et on utilise INC ou DEC pour amener progressivement l'A à $12.
    LDA #$10
    INC A ; A = $11
    INC A ; A = $12

  3. Sans connaître la valeur de l'A, écrivez un code qui augmente de 5 cette valeur.
    Il n'y a pas de piège ! Il faut tout simplement marquer :
    INC A
    INC A
    INC A
    INC A
    INC A

    Mais il y a une astuce : on peut factoriser comme ceci :
    INC #5

    Mais comprenez bien que c'est un raccourci d'écriture, et non pas un opcode. En effet, un assembleur doit avant tout traduire l'ASM "officiel" ; mais rien ne lui empêche d'ajouter des raccourcis, des alias pour aider le développeur lorsque le code devient compliqué ou fastidieux. Nous avons déjà vu un raccourci d'écriture dans ce chapitre : le fait d'écrire INC sans argument. En théorie, INC doit obligatoirement être suivi d'un opérande. Cependant, il est couramment admis que l'écriture sans opérande signifie la même chose que INC A. C'est pourquoi les assembleurs trasm, xkas et asar acceptent cette forme (et c'est pourquoi vous l'avez apprise !). Il existe un autre alias pour INC A : INA. La preuve que les alias dépendent des assembleurs : INA n'est supporté que par xkas ; ce mnémonique ne fonctionne pas avec trasm et asar.
    Pour notre cas, INC #X n'est pas supporté par trasm, et signifie : Répète "INC A" X fois. INC A se traduit par un octet en langage machine : $1A. Que vous utilisiez la première version sur 5 lignes ou la forme factorisée, vous obtiendrez le même résultat, à savoir 5 fois l'octet $1A.

    Conclusion : attention aux raccourcis. Plus vous en utilisez, plus votre code sera léger et compréhensible, mais moins il sera compatible avec d'autres assembleurs.

  4. Sans connaître les valeurs de l'A, de X et de Y, écrivez un code pour faire en sorte que le contenu de A se retrouve dans X, celui de X dans Y et celui de Y dans A.
    Cette fois, il y a un piège ! C'est impossible, en l'état actuel de vos connaissances, de répondre à l'exercice. L'idée d'utiliser des opcodes de copie d'un registre à un autre est tentante, mais dès le premier Txx, vous allez écraser le contenu d'un registre sans pouvoir le récupérer plus tard.
    ; Supposons que	A = $01, X = $02, Y = $03
    TAX ; A = $01, X = $01, Y = $03
    TYA ; A = $03, X = $01, Y = $03
    TXY ; A = $03, X = $01, Y = $01

    La solution à ce problème est d'utiliser soit un autre registre soit de la mémoire externe pour stocker temporairement la première valeur, puis la restaurer à la fin des transferts.

  5. A votre avis, pourquoi l'horloge est divisée en deux blocs sur le schéma vu en partie 1 ? ("Timing cont." et "Clock Generator")
    Question qui sort un peu du contexte du tutoriel, mais dont la réponse n'en est pas moins intéressante. Smile

    Le processeur ne se contente pas d'un tic-tac électronique envoyé par l'horloge pour cadencer son fonctionnement. Je développe : une instruction n'est pas atomique, elle se déroule en plusieurs étapes. Chaque étape correspond à un cycle de l'horloge, ce qui veut dire qu'une instruction est complétée au bout de plusieurs cycles. C'est là que le Timing Control Unit intervient : il garde une trace de l'étape en cours. C'est un compteur qui est mis à 0 à chaque début d'instruction, et compte les étapes (les cycles). Lorsqu'un nouveau cycle commence, le TCU indique ainsi à quelle étape l'instruction en est.

    Le Clock Generator quant à lui génère les cycles, ou du moins les cycles du processeur. En réalité, le Clock Generator dépend d'une horloge externe : le processeur est relié à un oscillateur à base de cristal piézoélectrique par l'intermédiaire de la broche PHI2 (visible sur le schéma sous forme de flèche pointant vers le Clock Generator). Cet oscillateur est une horloge fixée sur la carte mère de la SNES (la partie sur laquelle sont fixés tous les composants de la SNES). L'oscillateur distribue les tic-tac à tous les composants qui en ont besoin, dont le processeur, à une fréquence d'environ 21 MHz. Le processeur modifie le tic-tac qu'il reçoit dans son Clock Generator : il va abaisser la fréquence en la divisant par 6, 8 ou 12 pour produire un tic-tac d'environ 3,6 MHz, 2,7 MHz et 1,8 MHz (respectivement). Ce sont ces dernières fréquences qui seront utilisées au sein du processeur (la fréquence choisie dépendra du type d'accès aux données : registre, mémoire, etc).



______________________


Mais, je lis pas de manga !


Dernière édition par SL le Jeu 21 Mar 2013 - 20:00; édité 1 fois
Revenir en haut
yogui
Admin ?
<b>Admin ?</b>

Hors ligne

Inscrit le: 08 Juin 2008
Messages: 2 925
Points étoile: 6 588
Moyenne des points: 2,25
Potentiel de hack:
Localisation: ツ
Masculin Balance (23sep-22oct) 羊 Chèvre

MessagePosté le: Mer 20 Mar 2013 - 00:07    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Exercices :

1. Sans utiliser LDX ?
LDA #$22
TAX
nerd

2. Heu...
LDA #$10
INC A
INC A


3.
INC A
INC A
INC A
INC A
INC A
Dois y avoir une fonction pour augmenter d'un nombre précis non ? Parce que sinon incrémenter que de 1 ça devient long.

4. Heu, impossible ? A moins de stocker temporairement un nombre, on peut pas échanger, vu que si on passe A dans X, on pourra pas passer X dans Y vu que X aura été écrasé par la valeur de A.
Sinon si tu veux dire qu'il faut passer les données de A à X à Y sans se soucier des données ben
TAX
TXY
TYA

5. Je sais pas... parce qu'il compte de deux manière différentes ?



____________________


Revenir en haut
Visiter le site web du posteur MSN Skype
Chme
Boo pêcheur
Boo pêcheur

Hors ligne

Inscrit le: 28 Avr 2011
Messages: 513
Points étoile: 718
Moyenne des points: 1,40
Potentiel de hack:
Localisation: Dans le grand nord, sous le blizzard et entre les caribous
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Mer 20 Mar 2013 - 16:46    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Le chapitre 3 !
Tu est vraiment génial SL, sur aucun autre site je n'ai vu de tutoriel aussi détaillé.
Bon, maintenant il va falloir que je me remette à l'ASM...

________________________________________
"See, you can have all the skill in the world and still have a bad day. It doesn't take much for the most fortunate man around to have a fall. It's life really, innit?"

Joshua (Fire Emblem: The Sacred Stones)


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Jeu 21 Mar 2013 - 20:02    Sujet du message: Tutoriel sur l'ASM Répondre en citant

@Yogui:
Merci d'avoir fait les exos T'es trop fort, mec!
1. et 2. Ouais, bah c'est facile hein, mais bon au moins ça va vite à répondre ;p
3. Bien vu, il existe un opcode pour faire des additions, nous le verrons dans 2 ou 3 chapitres. Sinon y avait un moyen de faire encore plus cours, mais je te renvoie vers la solution que j'ai mise, parce que y a des nuances à préciser.
4. C'est exact, c'est impossible =3 Tu as bien suivi yogui. Et bon même si tu as répondu avec "sans se soucier des données", la question était pas erronée, c'est un "piège".
5. Bien tenté ;3 la réponse est un peu plus compliquée. La réponse que j'ai donnée est très fournie, mais j'en attendais pas autant bien sûr. Les avantages de cette question c'est que ça invite à la réflexion, que c'est un peu plus dur que les autres questions et que ça change de l'ASM pur ;]


@Chme : Merci beaucoup ^^ oui je fais un vrai travail de recherche sur le sujet, ça me prend beaucoup de temps mais en même j'apprends, alors je dis pas non ! Et t'as aucune excuse pour ne pas te remettre à l'ASM maintenant que y a un tuto bien détaillé xP bon ok il est pas fini.


- Ajouté les réponses aux questions
- Ajouté une précision sur la casse des opcodes dans l'ASM (partie 2 § 2)

______________________


Mais, je lis pas de manga !


Revenir en haut
Lemonade
OMNOMNOMNOMNOM
OMNOMNOMNOMNOM

Hors ligne

Inscrit le: 30 Mai 2009
Messages: 1 054
Points étoile: 1 520
Moyenne des points: 1,44
Potentiel de hack:
Localisation: Languedoc
Masculin Verseau (20jan-19fev)

MessagePosté le: Jeu 21 Mar 2013 - 21:12    Sujet du message: Tutoriel sur l'ASM Répondre en citant

Encore une très sympathique addition à ce tutoriel qui me donne envie de réessayer de mettre la main à la pâte pour l'ASM...

J'ai eu à peu près les même réponses que Yogui. Par contre je pense que pour faire plus court au 3 on peut
utiliser un label, un BEQ et un JSR
?


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Ven 22 Mar 2013 - 13:37    Sujet du message: Tutoriel sur l'ASM Répondre en citant

@Lemonade :
Et bien non. Ces instructions modifie l'ordre d'exécution du programme. Pour ajouter 5, y a que 2 solutions : incrémenter, ou additionner. Alors je devine qu'avec ta solution tu voudrais faire une boucle pour automatiser le INC A. Si on se penche sur cette question :
- Le JSR n'est pas nécessaire ;
- Il faut garder une trace du nombre de tours que la boucle effectue, ce qui monopolise un autre registre (le X ou le Y) ;
- la boucle est très lourde pour une opération triviale comme 5 fois INC
Le fin mot de l'histoire, c'est qu'en supposant qu'on a le X ou le Y à disposition, la boucle se traduit en langage machine par 6 octets, alors que 5 fois INC ne prendra que 5 octets. La boucle sera vraiment "rentable" qu'à partir de ~10 ou plus INC (et encore, c'est sujet à appréciation : c'est surtout à partir du moment où ça te gave d'écrire des INC A partout ;p).

Mais bon, dans tout ça, quitte à utiliser des notions que je n'ai pas encore expliquées, autant me proposer l'opcode d'addition tout simplement Wink ça sera la solution la plus optimale possible.



- Mis à jour le glossaire avec les notions du chapitre 3 ;
- Mis à jour l'index également ;
- La prochaine fois on plongera dans la mémoire Smile

______________________


Mais, je lis pas de manga !


Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 12:06    Sujet du message: Tutoriel sur l'ASM

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Lunariville Index du Forum -> Lunar magic et le romhacking de SMW -> Tutoriaux Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  

Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com
Thème Lunariville: Shadoxx Aurion
Thème basé sur Pluminator: Maëlstrom