Informatique Industrielle : Correction exercices: Instructions de branchement et bouc
Télécharger PDFBranchement et Boucles : Instructions et Exemples en Assembleur PIC
Exercice 1 : Décrémentation et Branchement Conditionnel
Etiquette : Instructions de branchement et boucles Description :
| Instructions | État des registres |
|---|---|
movlw 0x02 |
(w) = 0x02 |
movwf xdata |
(xdata) = 0x02 |
decfsz xdata,f |
(xdata) – 1 = (xdata) → (xdata) = 0x01 |
goto saut |
Instruction non exécutée, car (xdata) ≠ 0 |
movlw 0x0A |
(w) = 0x02 (la valeur précédente n'est pas écrasée) |
movwf xdata |
Instruction non exécutée, car (w) n'est pas modifié |
saut |
decfsz xdata,f → (xdata) – 1 = (xdata) → (xdata) = 0 |
Exercice 2 : Incrémentation et Boucle Infinie
Etiquette : Instructions de branchement et boucles Description :
| Instructions | État des registres |
|---|---|
movlw 0xFF |
(w) = 0xFF |
movwf xdata |
(xdata) = 0xFF |
incfsz xdata,f |
(xdata) + 1 → (xdata) → (xdata) = 0x00 (boucle exécutée 256 fois) |
goto boucle |
Instruction non exécutée, car (xdata) = 0 |
movlw 0x01 |
(w) = 0x01 |
movwf xdata |
(xdata) = 0x01 |
boucle decfsz xdata,w |
(xdata) – 1 → (w) → (w) = 0 |
goto boucle |
Instruction exécutée, car (w) ≠ 0 → (xdata) = 0x00 |
decf xdata,f |
(xdata) – 1 → (xdata) → (xdata) = 0xFF |
Exercice 3 : Boucle avec Condition et Incrémentation
Etiquette : Instructions de branchement et boucles Description :
| Instructions | État des registres |
|---|---|
clrf ydata |
(ydata) = 0 |
movlw 0x0A |
(w) = 0x0A |
movwf xdata |
(xdata) = 0x0A |
rec incf ydata,f |
(ydata) + 1 → (ydata) → Instruction exécutée 10 fois → (ydata) = 0x0A |
decf xdata,f |
(xdata) – 1 → (xdata) → Instruction exécutée 10 fois → (xdata) = 0 |
btfss STATUS,Z |
Z = 1 ? (xdata = 0 ?) |
goto rec |
Si (xdata) ≠ 0, aller à rec |
decf xdata,f |
(xdata) – 1 → (xdata) → (xdata) = 0xFF |
Exercice 4 : Compteur Modulo 10
Etiquette : Instructions de branchement et boucles Description :
| Instructions | État des registres |
|---|---|
clrf compt |
(compt) = 0 |
compter movf compt,w |
(compt) → (w) → (w) = 0 |
movwf PORTB |
(PORTB) = 0 |
incf compt,f |
(compt) + 1 → (compt) |
movlw 0x0A |
(w) = 0x0A |
xorwf compt,w |
(compt) XOR (w) → (w) → Vérification si (w) = 0 |
btfss STATUS,Z |
Z = 1 ? ((w) = 0 ?) |
goto compter |
Si (w) ≠ 0, aller à compter |
goto début |
Si (w) = 0, aller à début |
La fonction réalisée par ce programme est un compteur modulo 10.
FAQ sur les Boucles et Branchements en Assembleur PIC
1. Que signifie l'instruction decfsz ?
decfsz décrémente une variable et saute à une étiquette si le résultat n'est pas nul. Elle combine une décrémentation et une vérification de zéro en une seule instruction.
2. À quoi sert l'instruction xorwf dans la boucle modulo 10 ?
xorwf effectue une opération XOR entre le registre W et la variable compt. Si le résultat est nul, le bit Z du registre STATUS est positionné à 1, ce qui permet de vérifier si compt a atteint la valeur 10.
3. Pourquoi utiliser btfss STATUS,Z plutôt que btfsc ?
btfss STATUS,Z vérifie si le bit Z est à 0 (ce qui signifie que le résultat de l'opération précédente n'est pas nul). Cela permet de sauter vers une boucle tant que le compteur n'a pas atteint 10, contrairement à btfsc qui saute si le bit est à 1.