Informatique Industrielle : Contrôle Systèmes à microprocesseurs 2017
Télécharger PDFExercice 1 : Analyse du programme et modes d’adressage
Instruction : Mode d’adressage : Description de l’opération réalisée : Contenu modifié (Mémoire, registres, pile, flags ...)
SEI : Implicite : Désactive les interruptions (masque des interruptions à 1). : Registre PSW (bit I = 1)
LDA A $0EA1 : Absolu : Charge le contenu de l’adresse $0EA1 dans le registre A. : Registre A = $BC, mémoire $0EA1 non modifiée
LDA B $0EA2 : Absolu : Charge le contenu de l’adresse $0EA2 dans le registre B. : Registre B = $CD, mémoire $0EA2 non modifiée
INC A : Implicite : Incrémente le contenu du registre A de 1. : Registre A = $BC + 1 = $BD
SUB B #$05 : Immédiat : Soustrait la valeur $05 du registre B et place le résultat dans A. : Registre A = $BD - $05 = $B8, Registre B non modifié, flags (N, Z, V, C) modifiés
LDX $0EA3 : Absolu : Charge le contenu de l’adresse $0EA3 dans le registre X. : Registre X = $CD (valeur supposée à $0EA3), mémoire $0EA3 non modifiée
JSR $00, X : Indexé-X : Appelle la sous-routine située à l’adresse pointée par X. : Registre PC = adresse de la sous-routine, pile modifiée (empile PC+2), flags non modifiés
TAP : Implicite : Transfère le contenu du registre A vers le registre PSW (bit T). : Registre PSW (bit T = valeur de A), Registre A non modifié
CLI : Implicite : Réactive les interruptions (masque des interruptions à 0). : Registre PSW (bit I = 0)
CLC : Implicite : Réinitialise le flag de retenue (C) à 0. : Flag C = 0
CLV : Implicite : Réinitialise le flag d’overflow (V) à 0. : Flag V = 0
SWI : Implicite : Interruption logicielle (appel de la routine d’interruption SWI). : Registre PC modifié, pile modifiée (empile PC+2 et PSW)
Exercice 2 : Code pour manipulation de la pile et des registres
Voici le programme demandé pour manipuler la pile et les registres :
LDA A #$00D0 ; Charger une valeur temporaire pour calculer SP TAP ; Transférer A vers PSW pour obtenir SP (exemple : 0x10) CLR A ; Réinitialiser A pour éviter interférence LDX #$0013 ; Charger X avec l'adresse de la valeur 5D dans la pile LDA A $00,X ; Lire la valeur 5D de la pile (adresse $0013) et la mettre dans B STB B ; Stocker la valeur dans B (5D) LDA A #$F9 ; Charger A par la valeur F9 STA A $00,X ; Empiler F9 au sommet de la pile (adresse $0013) ABA ; Additionner le contenu de A et de B INC B ; Incrémenter B TAP ; Transférer le contenu de A au CCR (PSW) LDA B #$00FF ; Charger B avec la valeur 0FFF (adresse de stockage) STA B $00,X ; Ranger le contenu de B à l’adresse mémoire $0FFF (valeur finale = B + 1) SWI ; Arrêter l'exécution par interruption programme
FAQ
Q : Comment calculer l’adresse de la valeur 5D dans la pile ?
R : La pile est descendante, donc l’adresse de la valeur 5D est SP + 1 (exemple : $0013 si SP = $0010).
Q : Pourquoi utiliser TAP pour transférer A au CCR ?
R : TAP transfère le contenu du registre A vers le registre PSW (Condition Code Register), ce qui modifie les flags du CCR.
Q : Comment incrémenter B après l’addition ?
R : Utiliser l’instruction INC B pour ajouter 1 au contenu du registre B.