- 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
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
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
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 . 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 , 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.
Je m'en excuse platement et apporterai une correction dès que possible..Correction apportée le 30/07 (tôt) .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 :
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités