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

Arithmétique n bits suite 1
JJE
Passioné
Passioné
Messages : 357
Âge : 79
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » lun. 29 juil. 2019 19:33

Bonsoir à tous,
En espérant ne pas lasser trop de gentils membres, je persiste dans cette suite de posts.
Je vais ajouter les fonctionnalités clrf et incf et, en passant, quelques commentaires supplémentaires qui auraient pu figurer dans le premier post sur ce sujet.
test AnB_Clrf
a la même structure que les deux tests précédemment décrits :

Code : Tout sélectionner

 .../...
    include "./AnB.inc"
    
    
#DEFINE AnB_NbOctets .10
    #DEFINE AnBS_MetQuoi AnB_MetClrf ; AnB_MetRien | AnB_MetIncf 
    #DEFINE AnBU_MetQuoi AnB_MetRien
    
    include 
"./AnB.inc"
    .../...

qui introduit le fichier AnB.inc

Code : Tout sélectionner

.../... la définition des variables du programme
  
; loger les variables du module en banque 0
    AnB_Installe  MYDATA_FIN
, 0x0800
;
.../...
 

qui installe ce module

Code : Tout sélectionner

init
.../...
 

qui définit la liste des tests réalisés dans ce programme
Premier test

Code : Tout sélectionner

    AnBU_Movl16To    Var1, h'1234'
    AnBU_Movl16To    Var1+2, 0x5678
    AnBU_Movl16To    Var1
+4, 0x9abc
    InitIT
    nop
    nop
    nop
    AnBUS_Clrf      Var1
, .6
    bcf     INTCON
, 5

On initialise les 6 octets aux adresses Var1 à Var1 +5
et on les annule avec la macro AnBUS_Clrf. Après avoir ouvert une fenêtre file registers dans MPLAB SIM, et rendu visible la variable Var1, une exécytion en pas à pas montre l'effet de ces différentes invocations de macro.
J"ai glissé, en passant, une mesure du nombre de micro-cycles nécessaires à cette macro. Pour ce faire une invocation de InitIT définie en début de fichier définit les paramètres de l'IT timer 0 et lance ce timer. Il est arrêté par la dernière instruction. Comme ce timer utilise un prescaler de 4, l'information lue dans timer0 dont il faut retirer .10 (voir l'initialisation) donne le nombre de cycles à 4 près. C'est la rôle des 3 nop ajoutés après l'initialisation. Vous pourrez constater qu'en enlever 1 donne 1 de moins dans timer 0. Comme le résultat lu donne 3, la macro consomme 9 cycles (4*3 -3). Les Curieux pourront vérifier en lisant le listing d'assemblage qu'il en est bien ainsi.
Deuxième test

Code : Tout sélectionner

    AnBU_Movl16To    Var1, h'1234'
    AnBU_Movl16To    Var1+2, 0x5678
    AnBU_Movl16To    Var1
+4, 0x9abc
    AnBU_Movl16To    Var1
+6, h'1234'
    AnBU_Movl16To    Var1+8, 0x5678
    AnBU_Movl16To    Var1
+.10, 0x9abc
    AnBU_Movl16To    Var1
+.12, h'1234'
    AnBU_Movl8To    Var1+.14, 0x56
;    AnBU_Movl16To    Var1+.16, 0x9abc
    AnBUS_Clrf  Var1
, .15
même chose sur une variable plus longue. En fait La macro AnBUS_Clrf met à 0 l'espace de mémoire débutant à l'adresse indiquée et de taille donnée, du moment que cet espace reste dans une même banque comme le montre le
troisième test

Code : Tout sélectionner

    ; erreur d'assemblage sur la ligne suivante si pas commentée
    ; variable sur deux banques
;    AnBUS_Clrf  Var1, .16
compte tenu de la position en mémoire donnée à Var1, Var1+15 et Var1 +16 sortent de la banque contenant Var1. L'assembleur pouvant s'en rendre compte, il le signale à l'utilisateur avec un message d'erreur. Dans tout ce développement, j'ai essayé de sécuriser au mieux l'usage de ces outils.
AnB_Incf
Le programme de test a rigoureusement la même organisation que le précédent sur laquelle je ne reviens pas. Bien sûr la définition de AnBS_MetQuoi est adaptée à la nouvelle situation.
Test 1

Code : Tout sélectionner

    AnBU_Movl16To     Var1,  0x1234
    AnBU_Incf  Var1
, .4

Le cas standard, on peut l'obesrver comme décrit ci-dessus dans Cltf avec une fenêtre file registers
test 2

Code : Tout sélectionner

    CHGBNK    AnB_DATA, Var1
    AnBU_Movl16ToA    Var1
,  0xfffe
    AnBU_Movl16ToA    Var1
+2,  0xffff
    AnBU_Incf  Var1
, .4
    AnBU_IncfA  Var1
, .4

Exemple de débordement en insigné (sur le deuxième Incf). Le CHGBNK est là pour l'exemple pour montrer qu'il est plus économique et mots programme d'appeler AnBU_Movl16ToA que AnBU_Movl16To quand on peut activer la bonne banque. C'est la même chose pour le AnBU_IncfA qui suit le AnBU_Incf. Pour l'observer, il suffit d'ouvrit la liste d'assemblage.
Pour observer le débordement, il faut ouvrir une fenêtre watch et y faire afficher le registre STATUS. Le débordement se manifeste par un STATUS, C armé.
Charge à l'utilisateur d'exploiter cette information qui signifie, en fait, qu'il a choisi un compteur d'une taille insuffisante :oops:. Pas grand chose à faire d'autre que de changer la taille du compteur incriminé, ce qui, en assembleur peut s'avérer être une opération assez lourde :sad:, d'où l'intérêt des déclarations de type dans les langages évolués .
test 3

Code : Tout sélectionner

    CHGBNK    AnB_DATA, Var2
    AnBU_Movl16ToA    Var2
,  0xfffe
    AnBU_Movl16ToA    Var2
+2,  0x7fff
    AnBS_Incf  Var2
, .4
    AnBS_IncfA  Var2
, .4

Exemple de débordement en signé (sur le deuxième Incf).En faisant une dernière vérification, je m'apperçois d'un problème sur ce dernier test. :cry:
Je m'en excuse platement :? et apporterai une correction dès que possible.
.Correction apportée le 30/07 (tôt) :sifflotte: .En fait, c'est la pire erreur que de signaler une erreur qui n'existe pas. Ce devait être l"heure un peu tardive de fin de journée ou l'appel de l'apéro, tout est clair, la macro donne bien 0x8000 et status, C armé, mais, en signé 0x8000 n'est pas le suivant de 0x7fff :?

Tout l'utile est ici :
FantasPic 2.zip
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

Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité