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

Multiplication 16 bits par 16 bits
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#11 Message par JJE » ven. 7 juin 2019 10:44 lien vers la Data-Sheet : Cliquez ici

Bonjour Temps-x,
Le résultat du produit se fait sur une longueur de 32 bits, ce qui donne,

tout à fait d'accord, merci de corriger cette erreur, mais ça milite plutôt pour ma proposition puisque ça ajoute encore quatre lignes de code à taper à l'utilisateur :wink: . Imagine que tu fournisses, en parallèle de ton sous-programme la macro suivante :

Code : Tout sélectionner

_multiplie macro V1, V2, res8
 movf V1
, W
 movwf multiplicateur
 movf V1
+1, W
 movwf multiplicateur
+1
 movf V2 W
 movwf multiplicande
 movf V2
+1, W
 movwf multiplicande
+1
 call multiplie
      movf produit
,W
      movwf res8
      movf produit
+1,W
      movwf res8
+1
      movf produit
+2,W
      movwf res8
+2
      movf produit
+3,W
      movwf res8
+3

L'utilisateur qui veut effectuer l'opération suivante Résultat = Opérande1* Opérande2, les trois étiquettes désignant des variables 16 bits, n'a plus qu'à écrire :

Code : Tout sélectionner

    _multiplie Opérande1, Opérande2, Résultat

N'est-ce pas plus facile pour lui ?

Temps-x a écrit :Source du message Il appartient à l'utilisateur de remettre les variables à zéro, c'est bien pour cela que j'ai fait dans l'exemple une fonction de remis à zéro

J'ai bien vu la fonction de remise à 0 d'un espace de zone mémoire dont je ne doute pas qu'il marche et qui doit être bien commode . Mais comme cette remise à zéro est obligatoire pour lancer la multiplication, pourquoi la confier à l'utilisateur qui risque de l'oublier plutôt que de la faire au début du code de multiplie (pas dans la macro que je propose ce qui gâcherait de la mémoire programme)
Tout à fait au début de multiplie on peut ajouter

Code : Tout sélectionner

;********************** mettre à zéro du résultat **************************

      movlw D'4'                         ; nombre d'octets utilisés par le produit 
      movwf loop1

      movlw low(produit)                        ; adresse de départ du produit
      movwf FSR  

      call efface_variable      


C'est ton code légèrement modifié pour ne mettre à 0 que le produit. Toujours ça de moins à faire pour l'utilisateur :-D .

Remarque que, dans les propos ci-dessus, je suis très léger. Ceci ne peut marcher, sans soucis, que si l'utilisateur n'utilise qu'une page de code et qu'une banque de RAM ce qui est très restrictif. Encore pas mal de lignes à écrire pour rendre ces questions transparentes à l'utilisateur.
Dans ces échanges, je ne veux surtout pas mettre de polémique, ce sont des points de vue différents et complémentaires. Ton propos est de montrer la mise en oeuvre d'un algorithme sur un point précis dont beaucoup ont besoin et c'est très bien réussi, mon propos pousse le bouchon un peu plus loin et essaye de faciliter le réemploi de ce travail par un tiers qui, a priori ne devrait avoir à se soucier que de la fonctionnalité, s'il fait confiance à l'auteur, et de sa mise en oeuvre. Comme cela a pu être observé dans pas mal de mes posts, c'est un de mes dadas. Il est vrai qu'ils ont peu d'écho :sad:
Cordialement

JJE

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

Multiplication 16 bits par 16 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#12 Message par Temps-x » ven. 7 juin 2019 15:26 lien vers la Data-Sheet : Cliquez ici

Bonjour JJE, et tout le forum,

JJE a écrit :Source du message L'utilisateur qui veut effectuer l'opération suivante Résultat = Opérande1* Opérande2, les trois étiquettes désignant des variables 16 bits, n'a plus qu'à écrire :

Code : Tout sélectionner


    _multiplie Opérande1
, Opérande2, Résultat


N'est-ce pas plus facile pour lui ?


Oui pour la simplicité, pas pour le programme qui va grossir à chaque fois que tu vas utiliser cette macro, tu vas augmenter la taille du programme.

Un sous programme le fait pas, donc quand c'est possible utilisation d'un sous programme.

La macro doit être utilisé à dose modéré, sinon on va se retrouvé avec un fichier énorme.

JJE a écrit :Source du message C'est ton code légèrement modifié pour ne mettre à 0 que le produit. Toujours ça de moins à faire pour l'utilisateur :-D


Oui c'est ce que je préconise ICI regarde l'exemple 2 le commentaire.

JJE a écrit :Source du message Ceci ne peut marcher, sans soucis, que si l'utilisateur n'utilise qu'une page de code et qu'une banque de RAM ce qui est très restrictif.


Avec les Pic18Fxxxx plus de problème de bank, quand l'utilisateur écrit son programme, c'est à lui de gérer c'est bank.

On va pas tout lui faire :lol:

JJE a écrit :Source du message Dans ces échanges, je ne veux surtout pas mettre de polémique, ce sont des points de vue différents et complémentaires.


J’apprécie tes remarques, et je ne vois aucune polémique dans tes propos, et :bravo: à toi pour nous reprendre. et on discuté.

Un forum ça sert à ça, heureusement qu'il y a pas qu'une idée, sinon le monde serais triste.


==> A+
Modifié en dernier par Temps-x le ven. 7 juin 2019 16:27, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Multiplication 16 bits par 16 bits
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#13 Message par JJE » ven. 7 juin 2019 16:24 lien vers la Data-Sheet : Cliquez ici

Temps-x a écrit :Source du message Oui pour la simplicité, pas pour le programme qui va grossir à chaque fois que tu vas utiliser cette macro, tu vas augmenter la taille du programme.

Un sous programme le fait pas, donc quand c'est possible utilisation d'un sous programme.

il faudra bien que l'utilisateur recopie ses variables dans celles du sous-programme, autant que la macro le fasse, ça ne prendra pas plus de code. Même chose pour la récupération du résultat.

Temps-x a écrit :Source du message Avec les Pic18Fxxxx plus de problème de bank, quand l'utilisateur écrit son programme, c'est à lui de gérer c'est bank.

Je ne suis pas du tout clair sur les Pic18, je vais m'y mettre, mais si j'ai bien compris il y a un registre BSR, je crois, qu'il faut renseigner par le numéro de la banque avant d'accéder à une variable de cette banque
Temps-x a écrit :Source du messageOn va pas tout lui faire

J'ai un avis différent, si on propose un outil, c'est pour décharger l'utilisateur de tâches standard. Ceci lui permet de ne s'intéresser qu'à son problème. Si je prends l'exemple de la CNC, l'intérêt du projet, dans sa partie informatique, c'est plus d'envoyer des pulses aux trois moteurs, de bien positionner leur sens de rotation en fonction des données lues, ce n'est pas tellement de faire des additions, multiplications 16, 24 ou 32 bits.
Si on me prête un couteau, j'aime bien qu'il coupe, s'il me faut l’affûter, je suis moins content :-D
Cordialement

JJE

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

Multiplication 16 bits par 16 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#14 Message par Temps-x » dim. 9 juin 2019 17:07 lien vers la Data-Sheet : Cliquez ici

Bonjour JJE, et tout le forum,

JJE a écrit :Source du message il faudra bien que l'utilisateur recopie ses variables dans celles du sous-programme, autant que la macro le fasse, ça ne prendra pas plus de code.


Si cette macro est utilisé 10 fois, tu réécris 10 fois les mêmes lignes dans ton code, je veux même pas imaginé la taille du programme, je reviendrais pas dessus.

JJE a écrit :Source du message Je ne suis pas du tout clair sur les Pic18, je vais m'y mettre, mais si j'ai bien compris il y a un registre BSR, je crois, qu'il faut renseigner par le numéro de la banque avant d'accéder à une variable de cette banque


BSR doit être mis à 0 au départ de ton pic, normalement il est à 0, mais moi je le mets des le départ, comme ça je suis tranquille, c'est tout, après
il faut se servir des nouvelles instructions pour ses Pics qui élimine l’accès au banc, exceptés les interruptions ou il faut manipuler BSR.

JJE a écrit :Source du message Si on me prête un couteau, j'aime bien qu'il coupe, s'il me faut l’affûter, je suis moins content :-D


Il faut un peu évoluer pour l'affuter quand il faut. :wink:

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Multiplication 16 bits par 16 bits
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#15 Message par JJE » jeu. 13 juin 2019 07:25 lien vers la Data-Sheet : Cliquez ici

Bonjour Temp-x,
M'intéressant à des problèmes voisins de ceux là, j'ai remis le nez dans le sous-programme que tu proposes dans ce sujet. En fait, je n'avais pas encore analysé comment tu sortais de la boucle sur les 16 bits. Je subodore des problèmes.
As-tu essayé quelque chose comme H'xx01' comme multipliCATEUR ? Je dirais bien qu'on sort de la boucle dès le traitement du premier chiffre.
En fait, tout nombre dont l'écriture en binaire comporte la suite de chiffre '00000001' dans son écriture posera problème, sauf si tous ceux situés à sa gauche sont des zéros.
un

Code : Tout sélectionner

            iorwf multiplicateur+1,

à la place du

Code : Tout sélectionner

      xorlw D'1'
 
devrait corriger le problème.
Je n'ai pas fait de test réel, je me trompe dans mon analyse ? :?:
Cordialement

JJE

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

Multiplication 16 bits par 16 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#16 Message par Temps-x » jeu. 13 juin 2019 20:52 lien vers la Data-Sheet : Cliquez ici

Bonjour JJE, et tout le forum,

JJE a écrit :Source du message je n'ai pas fait de test réel, je me trompe dans mon analyse ?


:sifflotte: Regarde le début de la routine, et essai là, STP :wink:

Code : Tout sélectionner


multiplie                                           
      btfsc multiplicateur
+0,0
      call impaire

paire                   
      movf multiplicateur
+0,W
      xorlw D
'1'
      btfsc STATUS,Z
      return      



Au début de la routine on teste la variable multiplicateur du poids faible, histoire de voir si celle-ci est impaire sur bit 0.

Puis en dessous si c'est pas le cas on test si elle n'est pas à 1
Si tu passe le premier test, tu arrives à la routine paire, hors tu ne pourras jamais avoir 1 au début de ta routine en passant le premier test

En réalité, c'est pareil ....., mais il y a une astuce ou ça demande réflexion, là il faut pensée en binaire ..... :lol: ,

Il y a qu'un truc qui peu planter la routine, c'est si le multiplicateur sur 16 bits est à 0, c'est tout.

J'ai omis cette fonction parce que faire une multiplication par 0, c'est ballot.


==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Multiplication 16 bits par 16 bits
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#17 Message par JJE » ven. 14 juin 2019 09:36 lien vers la Data-Sheet : Cliquez ici

Bonjour Temps-x,
J' ai commencé à mettre en doute mes vieux neurones, et, ne comprenant pas où je me trompais, j'ai fait un projet MPLAB avec ton source, en ne modifiant QUE la valeur des variables et voici le résultat sous MPSim
test.JPG

On constate bien que l'on sort de la boucle trop tôt, ni le multiplicateur ni le multiplicande n'ont été touchés, sans voir le bit armé dans multiplicateur+1 :wink:
La modification que je t'ai suggérer semble marcher, au moins sur un test.
En effet, un multiplicateur nul va planter, mais ce n'est rien à tester en début de routine, de plus le résultat est déjà prêt dans ce cas. C'est vrai que c'est ballot de multiplier par 0, mais l'appelant n'en sait parfois rien.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Cordialement

JJE

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

Multiplication 16 bits par 16 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#18 Message par Temps-x » ven. 14 juin 2019 14:29 lien vers la Data-Sheet : Cliquez ici

Bonjour JJE, et tout le forum,

:sifflotte: Fait un test avec un nombre, sur le multiplicateur et le multiplicande, et dit moi le nombre que tu as pris pour les deux :-D

Pour le test du 0 on peut effectivement le faire, car si on a une routine qui tourne, et qui fasse des multiplications tout seule :shock:

oops C'est mieux......


==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Multiplication 16 bits par 16 bits
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#19 Message par JJE » ven. 14 juin 2019 15:52 lien vers la Data-Sheet : Cliquez ici

Bonjour Temps-x,
voir la copie d'écran du post #17 :
    multiplicateur 0x0201
    multiiplicande 0x8745 (mais en pratique, n'importe quoi)
Cordialement

JJE

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

Multiplication 16 bits par 16 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#20 Message par Temps-x » ven. 14 juin 2019 17:45 lien vers la Data-Sheet : Cliquez ici

Bonjour JJE, et tout le forum,

Le programme fonction très bien, je vois pas ou est le problème.

Multiplication16.jpg


Regarde le résultat, qui est affiché à droit, il est correct, et de plus il y a bien sortie de la boucle comme tu peux le voir à gauche.

H'10F1145' = H'201' X H'8745'
17764677 = 512 X 34629

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le ven. 14 juin 2019 19:49, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:


Retourner vers « Langage ASM »

Qui est en ligne

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