Bienvenue aux nouveaux arrivants sur FantasPic !

- 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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

pour l'exemple un module arithmétique 8 bits signés
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » jeu. 11 avr. 2019 07:29

Bonsoir à tous,
Ce n'est pas que l'arithmétique 8 bits, même signée soit d'un grand intérêt. Je n'ai trouvé qu'une utilisation dans la conversion Celcius Farhenheit qui exige une multiplication par 9/5 et une addition sur des nombres signés (et oui, il peut faire froid). Encore faut-il pouvoir se contenter de la précision du degré et ne pas dépasser 52° celcius (53 converti en farhenheit c'est plus que 127 et 8 bits ne suffisent plus)
Je propose ci dessous un programme qui, sous le simulateur MPLABSIM, vous permet de tester toutes les opérations décrites plus loin.
Une fenêtre watch où on met les variables à observer, une exécution pas à pas et bon courage. Par curiosité, changez de pic d'une exécution à l'autre pour constater que les seules lignes à modifier sont les deux lignes définissant le pic mis en oeuvre. Pour l'instant, seuls les mid-range marchent, mais avec les infos reçues cet AM, je ne désespère pas propose le même programme pour les extended mid-range, en ne touchant qu'aux macros de gestion de banque.
► Afficher le texte

Je sais bien qu'il ne fait rien ce programme, mais potentiellement, il peut faire n'importe quoi en arithmétique 8 bits signés. en un peu plus de 100 lignes
Bien sûr il y a des accessoires, qui sont introduits dans le code par quelques lignes (3) qui seront interprétées par l'assembleur :
La première (ligne 35)

Code : Tout sélectionner


    include 
"A8BS.inc"

informe l'assembleur du chemin du fichier contenant les informations du module
La deuxième (ligne 85)

Code : Tout sélectionner


    A8BS_VAR    

invoque une macro qui va déclarer les variables nécessaires au module. Elle se développe en quelque chose comme :

Code : Tout sélectionner


    CBLOCK
    
.../...
    endc

les variables nécessaires au module sont donc en mémoire à l'adresse où a été écrite l'invocation de la macro A8BS_VAR.
Rien, n'interdit bien sûr de forcer une position particulière. si vous souhaitez qu'elles soient en début de la banque 1, il suffit de faire précéder l'invocation de la macro de :

Code : Tout sélectionner


    CBLOCK    0xA0
    endc

J'ai préféré cette manière de faire à la mise en oeuvre d'un paramètre à la macro car je ne sais pas gérer des paramètres optionnels et bien souvent on n'a aucune raison de positionner les variables du module à un endroit particulier de la mémoire. Une seule contrainte, Les variables du module doivent être dans la même banque mais un test est fait qui signale le problème et sort l'assembleur en erreur. Il ne reste plus qu'à déplacer l'invocation.
La troisième (ligne 112)

Code : Tout sélectionner


    A8BS_CODE   A8BS_METTOUT

C'est encore une macro dont l'invocation introduit le code du module. Ici, comme il est possible qu'on n'ait pas besoin de toutes les fonctionnalités, elle exige un paramètre précisant ce dont on a besoin, ici tout le code. Le module définit 5 valeurs

Code : Tout sélectionner


A8BS_METADD     EQU 1
A8BS_METSUB     EQU 2
A8BS_METMULT    EQU 4
A8BS_METDIV     EQU 8
A8BS_METTOUT    EQU A8BS_METADD 
+ A8BS_METSUB + A8BS_METMULT + A8BS_METDIV

dont les noms suffisent à informer de leur fonction.
Ces trois lignes étant insérées (l'endroit où elle le sont est important), il est possible d'utiliser les fonctionnalités retenues de ce module, par exemple par

Code : Tout sélectionner


    movlw   
-.3
    movwf   A0_1
    movlw   
-.5
    movwf   A0_2
    A8BS_ADDV   A0_1
, A0_2, REP0
    nop

le programme initialise deux de ses variables et invoque la macro A8BS_ADD. à l'instruction nop qui suit, la variable REP0 contiendra la valeur -8 (0xf8). Par curiosité, vous pouvez déplacer chacune de ces variables dans la banque e votre choix, charge à vous de les gérer, l'invocation de la macro A8BS_ADD n'aura aucunement à être modifiée
Une remarque notable est que ce programme test est opérationnel sur tous les pics mid-range :sifflotte:
J'ai découvert récemment les pics extended mid_range auxquels je ne m'étais pas encore intéressé. Il me semble que dans ce module, seuls les changements de banque sont incompatibles entre les deux familles. Je ne désespère pas d'écrire des macros de changement de banque compatibles (au niveau du source) pour les deux.


Parlons un peu du fichier A8BS (pour Arithmétique 8 Buts Signés) que voici:
► Afficher le texte

Il définit quelques macros qui permettent, entre autre, d'appeler les sous-programmes de traitement sur les variables
A lecture du code vous pourrez constater les précautions prises pour informer l'utilisateur de situations délicates.
Prenons dans l'ordre
ligne 64 macro CHGBNK : permet un changement de banque avec le strict minimum d'instructions, à la condition de savoir dans quelle banque on est au moment de l'invocation ce qui est le cas dans toutes les macros qui vont suivre.
suivent deux petits gadgets
A8BS_8To16 : les commentaires suffisent. Il n'est pas écrit que son usage nécessite que la variable sur laquelle on l'appelle doit avoir 2 octets
A8BS_16To8 : teste la faisabilité d'un tronquage. Se contente d'armer ou désarmer le bit C de STATUS
toutes les autres sont sur le même modèle
8 lignes de passage de paramètre, une ligne d'appel di sous-programme qui fait le travail, 3 lignes de passage du résultat.
Remarquons le premier BANKSEL qui ne peut pas être un CHGBNK puisqu'on ne peut pas savoir la banque active au début de la macro. Bien d'autres manières de faire étaient possibles, en particulier de demander à l'appelant d'être dans la banque mémoire contenant le premier paramètre d'appel au moment d'invoquer la macro mais comme ceci ne peut pas être testé par l'assembleur, j'aipréféré cette méthode plus coûteuse.
A8BS_ADDV
A8BS_ADDL
les commentaires décrivent leur fonction. Noter qu'il faut distinguer les cas où le deuxième opérande est une variable de celui où il est une constante. Je n'ai pas trouvé de méthode dans l'assembleur qui permettent de le faire
Les autres fonctionnalités suivent ;
A8BS_SUBV
A8BS_SUBL
A8BS_OPP calculer l'opposé, utile car A-B est traité comme A+(-B)
A8BS_MULTV
A8BS_MULTUV utile car A*B est traité comme ABS(A)*ABS(B) le signe étant traité à part
A8BS_MULTL
A8BS_DIVV
A8BS_DIVl
A8BS_DIVU
Quelques infos sur la division entière ici,
Enfin, la dernière A8BS_CODE dont l'invocation introduira le code dans votre source.

Merci si vous êtes arrivé jusqu'à cette ligne oops en espérant avoir retenu votre attention.

Qui s'y colle pour un module A16BS ? Temps-x qui nous a déjà fait la multiplication humour!! ?

petit complément, le code de l'autre module utilisé callx
► Afficher le texte
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

pour l'exemple un module arithmétique 8 bits signés
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#2 Message par Claudius » jeu. 11 avr. 2019 10:13

Bonjour JJE et tout le forum,

Très joli travail et ô combien utile quant à la capitalisation pour différents projets

Maintenant, la difficulté de cette réalisation est la vérification exhaustive de toutes les opérations en parcourant la totalité des valeurs dans les plages 8, 16, xxx bits avec le test incontournable des cas limites comme la division par zéro.
Cette qualification est ici possible car il y a un nombre, certes important, mais limité de combinaisons.

A noter que cette vérification exhaustive est impossible en arithmétique flottante (mais pas incontournable comme je le présenterai bientôt) et à laquelle je m’intéresse actuellement dans le cadre de l'utilisation du coprocesseur flottant Micromega uM-FPU

Sinon, afin d'éviter d'être juge et partie, il est toujours bon de faire ce même travail de qualification en utilisant une autre implémentation et naturellement comprendre les différences, s'il y en a, entre ces 2 implémentations :geek:

Pour cela, j'ai déjà eu l'occasion de donner le lien sur le formulaire en ligne que je remets ici - Multibyte Arithmetic Assembly Library for PIC Microcontrollers - qui permet de générer le code assembleur dans toutes les arithmétiques souhaitées notamment en 32 bits :roll:

Cf. MultibyteArithmetic32.lst avec les 5 opérations sur 32 bits occupant exactement 176 mots programme sur un PIC16 de la famille mid-range; à savoir: Comparaison, Addition, Soustraction, Multiplication et Division (quotient et reste) avec en plus les 2 opérations du type logique que sont le décalage à gauche et le décalage à droite

NB: Le portage vers la famille extended mid-range ne devrait pas poser de problèmes particuliers mais pour moi, ce portage avec l'accueil facilité des changements de bank, devrait aussi concerner les nouvelles instructions de cette famille; à voir combien de mots programme sont "gagnés" ...

JJE, félicitations pour cette contribution très documentée sur l'arithmétique 8 bits de nos PICs préférés qui est pour moi d'un très grand intérêt :+1:

pour l'exemple un module arithmétique 8 bits signés
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#3 Message par JJE » jeu. 11 avr. 2019 18:52

Merci Claudius,
Je ne crois pas qu'il y ait d'erreur, mais je ne garanti rien, mon propos ici était plutôt d'essayer de décrire une méthode pour écrire du code réutilisable facilement. Je crois que l'exemple parle bien.
Je ne connais pas assez les extended pour voir ce qu'ils apporteraient à ces quelques petites fonctions mais il va bien falloir que je m'y colle.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

pour l'exemple un module arithmétique 8 bits signés
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#4 Message par JJE » jeu. 18 avr. 2019 05:07

Bonjour Claudius,
Complément de réponse un peu tardif, mais en ce moment, je suis toujours sur ces aspects de réemploi de code et ce n'est pas si facile d'écrire quelques lignes convaincantes sur le sujet.
En ce qui concerne la portabilité du code entre mid-range et extended mid-range, peut-être moins utile, je suis allé voir le lien cité sur les nouvelles instructions des extended, il me semble possible et relativement facile d'écrire une quinzaine de macros qui, développées différemment pour un mid_range et un extended feraient le travail (ifdef BSR faute de mieux). Un prochain module (bien que je n'aie pas l'impression que ce sujet retienne beaucoup l'attention :cry: )?
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 43 invités