Escolar Documentos
Profissional Documentos
Cultura Documentos
Partie 3
ENSIMAG 1A
19 mai 2006
Exercice 1
Soit le programme ci-dessous :
L0
OPTION_REG EQU 1
bsf STATUS, RP0 L2
STATUS EQU 3
clrw movwf S1
TRISA EQU 5
movwf TRISA movf STATUS, W
TRISB EQU 6
movlw 0x0F movwf S2
PORTA EQU 5
movwf TRISB
PORTB EQU 6
clrw movf V, W
INTCON EQU 0xB
movwf OPTION_REG movwf PORTA
RP0 EQU 5
movlw 0x88 clrf V
V EQU 0x10
movwf INTCON
S1 EQU 0x11
bcf STATUS, RP0 movf S2, W
S2 EQU 0x12
clrw movwf STATUS
movwf PORTB movf S1, W
ORG 0
bcf INTCON, 0
goto L0
clrf V retfie
ORG 4
L1
goto L2
incf V, F end
ORG 0x30
goto L1
Question 2 (1 pt) Dans quels sens (i.e. entrée ou sortie) sont configurés les bits des ports A et B ?
Vous devez préciser la configuration de chaque bit des deux ports.
Les 5 bits du port A sont configurés en sortie, ainsi que les 4 bits de poids fort de B, et les 4 bits de
poids faible de B sont configurés en entrée (c’était inversé par rapport au TP).
1
Exercice 2
Question (1,5 pt) Le contenu mémoire suivant correspond à un programme PIC sous forme hexadéci-
male et symbolique. Complétez les cases marquées par des points d’interrogation et expliquez en quelques
lignes ce que fait le programme.
Le programme compte le nombre de bits à 1 de l’octet à l’adresse 0x11 et stocke le résultat à l’adresse
0x10.
Question (1,5 pts) Après avoir consulté la section 2.5 de la documentation PIC donnée en annexe,
expliquez ce que fait le programme ci-dessous. On suppose que la zone mémoire pointée par Src contient
24 octets initialisés à des valeurs appropriées.
STATUS EQU 3 Debut
C EQU 0 movf Ix, F
Z EQU 2 btfsc STATUS, Z
Proc
FSR EQU 4 goto Fin
movfw Val
INDF EQU 0 movf Src, W
iorlw 0
Cpt EQU 0x10 movwf FSR
btfsc STATUS, Z
Val EQU 0x11 movf INDF, W
goto FinProc
Src EQU 0x12 movwf Val
bcf STATUS, C
Dst EQU 0x13 clrf Cpt
rrf Val, F
Ix EQU 0x14 call Proc
btfsc STATUS, C
movf Dst, W
incf Cpt, F
ORG 0 movwf FSR
goto Proc
movf Cpt, W
Init movwf INDF
FinProc
movlw 0x20 incf Src, F
return
movwf Src incf Dst, F
movlw 0x40 decf Ix, F
end
movwf Dst goto Debut
movlw 0x18 Fin
movwf Ix goto Fin
Le pointeur Src désigne une zone mémoire de 24 octets remplie de valeurs quelconques. Le programme
parcours cette zone et, pour chaque octet, compte le nombre de bits à 1 de cet octet, et stocke le résultat
dans la zone mémoire pointée par Dst.
Question (0,5 pt) La zone mémoire pointée par Dst doit faire 24 octets pour stocker le résultat du
calcul. Comment pourrait-on optimiser ce calcul pour n’avoir besoin que de 9 octets dans la zone Dst ?
On ne vous demande pas de coder cette optimisation mais juste d’en expliquer le principe.
Il suffit de n’utiliser que 3 bits pour coder le nombre de bits à 1 (modulo 8), et de compacter ces
valeurs.