- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Ce sujet a déjà fait l'objet de plusieurs sujets dans différents sous-forums, en se limitant en général à une opération (multiplication) et des entiers 16 bits.
Je reprends en généralisant à des entiers de n*8 bits signés ou non et à l'ensemble ou presque des opérateurs arithmétiques unaires ou binaires.
Mon objectif est de fournir un outil, clef en main, qui permette à l'utilisateur d'intégrer à son application une ou plusieurs des fonctionnalités proposées dont voici la liste :
- Initialisation avec un littéral
Mise à 0
Incrémentation
Décrémentation
Extension du bit de signe
Tronquabilité
Opposé
Copier
Addition
Soustraction
Multiplication
Division
Modulo
Comparaison
Conversion Ascii hexa
Conversion Ascii décimal
Dans le fichier joint , vous trouverez deux projets
- test Anb_Var.mcp illustrant le paragraphe précédent
test AnBS_MovlTo.mcp une application sur la première fonctionnalité mentionnée
Bien qu'il ne fasse pratiquement rien, ce projet est important parce qu'il décrit l'organisation d'un programme source exploitant ce module.
Code : Tout sélectionner
#DEFINE NbPages 1
include "callx.inc"
include "BNK.inc"
introduit deux modules dont il a été question sur ce site et sur lesquels je ne reviens pas
Code : Tout sélectionner
include "AnB.inc"
#DEFINE AnB_NbOctets .10
#DEFINE AnBS_MetQuoi AnB_MetRien ; AnB_MetRien | AnB_MetIncf
#DEFINE AnBU_MetQuoi AnB_MetAdd
include "AnB.inc"
introduit le module lui-même, avec cette bizarerie du double incules AnB.inc, sur lequel je reviens ci-dessous
La suite est très classique, définition de quelques macros, de quelqies constantes et description de l'espace de données du programme qui se termine par
Code : Tout sélectionner
AnB_Installe MYDATA_FIN, 0x100
Instanciation de la macro AnB_Installe qui est en fait le nerf de la guerre.
Rien d'autre, à partir de cette ligne, les fonctionnalités installées sont utilisables, voir le deuxième projet.
1.1Minimiser le code installé
C'est le rôle des trois lignes suivantes
Code : Tout sélectionner
#DEFINE AnBS_MetQuoi AnB_MetRien ; AnB_MetRien | AnB_MetIncf
#DEFINE AnBU_MetQuoi AnB_MetAdd
include "AnB.inc"
Dans les deux premières, on définit deux constantes AnBS_MetQuoi et AnBU_MetQuoi qui sont chacune un ensemble de flags armés si la fonctionnalité doit être installée. Ces flags sont définis par une étiquette qui a été définie par le include précédent.
Le fichier AnB.inc a la structure suivante :
Code : Tout sélectionner
ifndef AnB_Param
; Constantes servant à définir les inclusions partielles
; pour le code
#define AnB_MetMovlf 0x01
.../...
#define AnB_MetRien 0x8000
#define AnB_Param
else ; ndef AnB_Param
Lors du premier include, la constante AnB_Param n'étant pas définie, seule le début du fichier est inclus, mais comme elle se termine par un #define AnB_Param, au deuxième include, c'est la suite (jusqu'à la fin) ou on trouve le endif associé qui est lue.
Le début de cette deuxième partie est un test sur les constantes qui, si elles ne sont pas définies se voient attribuer une valeur qui permet d'intégrer toutes les fonctionnalités.
Suivent une centaine de ligne qui évitent à l'utilisateur de demander une fonctionnalité particulière parce qu'elle est utilisée par l'une de celles demandées : exemple
Code : Tout sélectionner
if (_AnBS_MetQuoi & AnB_MetCopy) != 0
if (_AnBS_MetQuoi & AnB_MetExpand)==0 || (_AnBS_MetQuoi & AnB_MetIsTronquable) == 0
_AnBS_MetQuoi set _AnBS_MetQuoi | AnB_MetExpand | AnB_MetIsTronquable
_AnBS_MetQuoi_Mod += 1
endif
endif
si l'utilisateur a demandé AnB_MetCopy sans demander l'une ou l'autre AnB_MetExpand ou AnB_MetIsTronquable, on lui ajoute et on s'en souvient _AnBS_MetQuoi_Mod += 1 pour boucler dans une boucle while tant qu'il y a eu des ajouts. En sortie de cette boucle, toutes les fonctionnalités nécessaires à celles demandées sont ajoutées, il n'y a plus à craindre d'erreur d'assemblage.
On peut alors calculer la variable d'assemblage AnBS_UseDATA qui mémorise les variables nécessaires aux fonctionnalités.
Les lignes suivantes servent à définir les variables nécessaires aux fonctionnalités demandées. Jusqu'en ligne 280, on définit quelques variables dépendant de la taille max des entiers demandés par l'utilisateur en particulier NbOReels qui est le nombre d'octets réellement attribué aux variables du module pour contenir les variables de la taille demandée par l'utilisateur. Ces variables ont pour fonction de faciliter la gestion du registre FSR.
Jusqu'en ligne 780 sont définies une série de macro sans difficulté dont la fonction principale est de faciliter la lecture (et l'écriture du code).
Arrive en fin :
1.2La macro AnB_Installe
Son premier paramètre permet de préciser l'adresse en mémoir de données où l'utilisateur veut mettre les données du module, le deuxième l'adresse en mémoire programme pour mettre le code du module
Les données du module respectent la structure suivante :
[list=]
AnB_O1 NbOReels octets
AnB_O2 NbOReels octets
AnB_Aux 2*NbOReels octets
Anb_Serv NbOReels octets
8 octets de travail pour les sous-programmes
[/list]
Pour une gestion sereine de FSR, il est nécessaire que la zone des données du module soit installée à une adresse convenable satisfaisant le masque calculé à l'inclusion du module. c'est le rôle de ce petit bout de code qui calcule la première adresse V2 postérieure à l'adresse passée en paramètre satisfaisant la contrainte.
Code : Tout sélectionner
#DEFINE _AnB_Installe_Invoquée
variable V2 = V
if (_AnBS_MetQuoi & AnBS_UseDATA ) != 0
while (V2 & masque) != 0x0
V2+= 1
endw
On déclare alors l'espace de données par une directive CBLOCK classique qui réserve NbOReels*AnBS_UseDATA + 8 octets
Suivent la définition de quelques étiquettes facilitant l'utilisation de cet espace de données.
Pour terminer, un test impose que l'espace de données du module réside dans une même banque.
Les deux dernières lignes de cette macro
Code : Tout sélectionner
org Ad_Code
_AnB_Code
installent le code à l'adresse passée en paramètre
1.3 le programme de test
Il permet d'observer dans le listing d'assemblage la taille du code installé en modifiant les paramètres AnBS_MetQuoi et AnBU_MetQuoi et d'observer dans le fichier .lst les valeurs des variables AnB_DATA et AnB_FIN_DATA en modifiant les paramètres AnBS_MetQuoi et AnBU_MetQuoiet AnB_NbOctets
Test AnB_Movlx
Toutes les macros Anb_Movl n'ont besoin ni d'espace mémoire du module, ni de code, l'instanciation de AnB_Installe est donc inutile.
La principale différence est la possibilité d'activer l'IT timer0 qui permet de compter le nombre de cycles nécessaires à l'exécution d'une macro du module.
Pour vérifier le fonctionnement, dans MPLABn choisir comme debugger MPLAB SIM et exécuter en pas à pas. une vue sur File Register permet de voir les variables traitées.
Une seule séquence mérite une remarque
Code : Tout sélectionner
AnBU_Movl8To Var1, 0xD2
AnBU_Movl16To Var1, 0xD234
AnBU_Movl24To Var1, 0xD23456
; dans l'instruction suivante, si on garde AnBU_, la macro plante
; en considérant 0xD2345678 comme un nombre négatif. Comme la
; constante occupe les 4 octets, on peut utiliser AnBS_ sans
; dommage
AnBS_Movl32To Var1, 0xD2345678
bien que le fichier d'aide dise
Note: Intermediate values in constant expressions are treated as 32-bit unsigned integers. Whenever an attempt is made to place a constant in a field for which it is too large, a truncation warning will be issued.
Suite sur les autres fonctionnalités dans les jours qui viennent.
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
je vois que tu abats un énorme travail .
Est-tu en train de faire un nouveau langage de programmation ?
en encapsulant l'ASM traditionnel.
Pour ma part, je prefere rester sur le classique , qui est d'usage
déja assez lourd à apprendre, mais qui garde un air familier quelque soit le Processeur utilisé.
..6502, Z80,8086,PIC
Voyons par la suite , si la communauté ASM t'encourage à poursuivre dans cette voie.
car je suis finalement mal placé, vu que j'utilise (maintenant) surtout le C .
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Une super idée que tu as là JJE, j'aime bien le concept de code clé en main/caisse à outils réutilisable.
Pour la forme puisque PaulFjujo l'a dit je ne peux que ré-enchérir . Sans vouloir te froisser et sans ouvrir de polémique JJE je préfère moi aussi le beau code ASM, simple et bien aligné qui me rappelle les premiers ordinateurs personnels quand je codais sur les Z80, 6502 et 68000.
C'est d'ailleurs cette nostalgie qui m'a fait revenir à l'asm plutôt qu'au C et pour ma part je n'ai pas envie de le dénaturer en le faisant ressembler à un langage évolué.
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
Tente de mettre à jour Chrome car pas de problème avec:
Google Chrome
Google Chrome est à jour
Version 75.0.3770.142 (Build officiel) (64 bits)
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités