CORRIGE EXAMEN FINAL
EXRCICE I
1- Plusieurs bonnes réponses sont possibles :
Dans l’architecture Von Neumann, les instructions et les données sont stockées
dans la même unité de mémoire tandis que dans l’architecture Harvard, il existe
deux unités de mémoire séparées, une pour les instructions et une pour les
données.
Dans l’architecture Von Neumann, il existe un seul bus pour relier la mémoire
au CPU. Ce bus sert alternativement à transmettre les instructions et les
données. Dans l’architecture Harvard, il y a présence de deux bus physiquement
distincts pour relier les deux unités de mémoire au CPU. Un de ces bus sert à
transmettre les instructions et l’autre bus sert à transmettre les données.
Dans l’architecture Von Neumann, on ne peut réaliser qu’un seul accès à la
mémoire en un cycle d’horloge. Il y a donc embouteillage puisqu’un seul mot
binaire peut circuler à un instant donné sur le bus. Dans l’architecture Von
Neumann, il est possible de réaliser deux accès à la mémoire en même temps
(un pour les instructions, un pour les opérandes), ce qui accélère la vitesse de
traitement.
L’architecture Von Neumann est simple à implémenter et nécessite peu de
circuits. L’architecture Harvard nécessite de doubler l’espace réservé aux bus, ce
qui donne généralement des circuits assez volumineux.
L’architecture Von Neumann permet une petite bande passante sur le bus de
données et donc, elle est bien adaptée pour les microprocesseurs effectuant des
opérations complexes, comme les processeurs CISC. L’architecture Harvard
permet une grande bande passante sur le bus de données et donc, elle est bien
adaptée pour les microprocesseurs effectuant beaucoup d’opérations simples,
comme les processeurs RISC.
2- Pour microprocesseur : adresse de saut sur 16 bits directement.
Adresse de retour conservé dans la pile.
Pour Microcontrôleur : adresse de saut sur 10 bits contenu
directement dans l’instruction donc il faut mettre bout à cout ces 10 bits avec
les bits 3 et 4 du PCLATH. Ces bits constituent le numéro de page
3- :L'instruction spécifie un registre
dans lequel se trouve l'adresse de la donnée.
a)MICROPROCESSEUR : Seuls les registres BX, BP, SI et DI peuvent
être utilisés en mode indirect. Par défaut le
segment utilisé est DS sauf avec BP qui
utilise SS.
valeur DW 1234h
mov si, OFFSET valeur ; si <-- adresse(valeur)
mov ax,[si] ; ax <-- ((si)) = 1234h
b)PIC : Les registres FSR et INDF sont utilises dans le mode indirect
movlw 0x50 ; chargeons une valeur quelconque
movwf mavariable ; et plaçons-la dans la variable " mavariable "
movlw mavariable ; on charge l’ADRESSE de mavariable,
movwf FSR ; on place l’adresse de destination dans FSR.
movf INDF,w ; charger le CONTENU de INDF dans W.
Le contenu de INDF est considéré par le Pic comme étant le contenu de l’adresse pointe
par FSR
EXERCICE II
;L'objectif est de lire l'état des microswitchs connectés sur le port A (RA0 à RA3).
; L'état de chaque microswitch sera visualisé par une LED. Les LEDs sont connectées sur le
port B
début
Initialiser accès à Bank 1
Initialiser RB0 à RB5 en sortie Et RB6 et RB7 en entrée
Initialiser RA0 à RA7en entrée
Initialiser accès à Bank 0
1ecture du port A
Ne garder que les 4 bitsde poids faibles de la lecture
Ecriture du résultat dans le port B
list p=16f84
#include <[Link]>
__CONFIG _CP_ON & _WDT_ON & _PWRTE_ON & _HS_OSC
org 0x00
;movlw B'00000111' ; Disable Comparator module's pour utiliser le port A en logique
;movwf CMCON
bsf STATUS,RP0 ; Acces a BANK1
movlw B'11000000' ; Ne pas mettre RB6 et RB7 en sortie, RB5 a RB0 en entrée
movwf H'06' ; Programmation du registre TRISB (config port B)
movlw B'11111111' ; RA0 a RA7 en entree (port A)
movwf H'05' ; Programmation du registre TRISA (config port A)
bcf STATUS,RP0 ; Acces a BANK0
fin movf PORTA,W ; Registre W= lecture port A
andlw B'00001111' ; Et logique pour ne garder que les 4 bits de poids faibles
movwf PORTB ; LEDs (RB0) allumees en fonction des switchs
goto fin
end
EXERCICE III ; Multiplication Simple Précision 8 * 8 -> 16 non signée
; N * D -> R non signée
LISTp=16F84
#include <[Link]>
__CONFIG _CP_ON & _WDT_ON & _PWRTE_ON & _HS_OSC
cblock 0x20
N0 : 1
D0 : 1
R1,R0 : 1
C0: 1
endc
ORG 0x0000
goto main
main bsf STATUS,RP0 ; Bank 1pour initialisation ports .0
movlw B'00010000';
clrf TRISB ; PortB en sortie
clrf TRISA ; Port A en sortie
bcf STATUS,RP0 ; Bank0
clrf PORTB ;
clrf PORTA ;
movlw 0xFF ; D0=FF (le multiplicateur)
movwf D0 ;
movlw 0x02 ; N0=02 (le multiplicande )
movwf N0 ;
movlw 8 ; C0=8, pour les 8 bits donc 8 boucles
movwf C0 ;
clrf R1 ; initialiser à 0 le résultat R1 et R0
clrf R0 ; R1=0 (high)et R0=0(low)
movf N0,W ; N0W
bcf STATUS,C ; 0 Carry
BOUCLE rrf D0,F ; bit de poids faible de D0 Carry
btfsc STATUS,C ; cary =0(n’ ajoute pas N0), on saute
addwfR1,F ; carry=1(on ajoute N0)
rrf R1,F ; décalage du resutat high R1 droite
rrf R0,F ; décalage du resutat lowR0 droite
decfsz C0,F ; verifier fin des 8 additions (boucles)
goto BOUCLE ; si pas la fin recommencer
end
Debut: D0=FF; N0= 02 ; R1= 00 : R0=00
Exécution D0 = 00 ; N0= 02 ; R1= 01 ; R0=FE(multiplication 02parFFresultat dans
R1retR0)
Debut: D0=FF; N0= FF R1= 00 : R0=00
Exécution D0 = 00 N0=FF; R1= FE ; R0=01 (multiplication 02parffreuslatat dans
R1retR0)