Exemples de Programmation CHAPITRE 6 Exemples de Programmation Microprocesseur 68000
Filtrage d'une partie Utilisation de l'instruction "et logique" exemple : D0.W = xxxx xxxx xabc xxxx (en binaire) AND.W #$0070,D0 D0.W = 0000 0000 0abc 0000 (en binaire) LSR.W #4,D0 D0.W = 0000 0000 0000 0abc (en binaire)
Extension de signe d'une partie D0 contient une donnée signée sur 12 bits D0 = xxxx abcd efgh ijkl LSL.W #4,D0 D0 = abcd efgh ijkl xxxx ASR #4,D0 D0 = aaaa abcd efgh ijkl
Conversion binaire - BCD Exemple : $CC=204 $204 D0.b contient la valeur en binaire D0.w doit contenir la valeur en BCD (3 digits) CLR.L D1 Clear D1 for 32-bit dividend MOVE.B D0,D1 Copy source to D1 DIVU.W #100,D1 Get 100s digit in D1(0:15) MOVE.W D1,D0 Save digit in D0(0:3) SWAP D1 Move remainder to D1(0:15) AND.L #$FFFF,D1 Clear MSW of D1 DIVU #10,D1 Get 10s digit in D1(0:15) LSL.W #4,D0 Shift 100s digit one place OR.W D1,D0 Insert 10s digit in D0 LSL.W #4,D0 Shift digits one place OR.W D1,D0 Insert 1s digit into LSN
Un exemple numérique 11001100 (204) ---> 0010 0000 0100 11001100 (204) ---> 0010 0000 0100 CLR.L D1 D0 = 000000CC, D1 = 00000000 MOVE.B D0,D1 D0 = 000000CC, D1 = 000000CC DIVU.W #100,D1 D0 = 000000CC, D1 = 00040002 MOVE.W D1,D0 D0 = 00000002, D1 = 00040002 SWAP D1 D0 = 00000002, D1 = 00020004 AND.L #$0FFFF,D1 D0 = 00000002, D1 = 00000004 DIVU #10,D1 D0 = 00000002, D1 = 00040000 LSL.W #$4,D0 D0 = 00000020, D1 = 00040000 OR.W D1,D0 D0 = 00000020, D1 = 00040000 LSL.W #$4,D0 D0 = 00000200, D1 = 00040000 SWAP D1 D0 = 00000200, D1 = 00000004 OR.W D1,D0 D0 = 00000204, D1 = 00000004
Addition matricielle C = A + B, A, B, C sont des matrices mxn les matrices sont sauvegardée ligne par ligne a1,1 est à l'adresse A ai,j est à l'adresse A+(i-1)n+j-1 MOVEA.L #A,A0 A0 is base of matrix A MOVEA.L #B,A1 A1 is base of matrix B MOVEA.L #C,A2 A2 is base of matrix C CLR.W D2 Clear element offset MOVE.W #m,D0 D0 is row counter L2 MOVE.W #n,D1 D1 is column counter L1 MOVE.B (A0,D2.W),D6 Get element from A ADD.B (A1,D2.W),D6 Add element from B MOVE.B D6,(A2,D2.W) Store sum in C ADDQ.W #1,D2 Increment element pointer SUB.W #1,D1 Repeat for n columns BNE L1 SUB.W #1,D0 Repeat for m rows BNE L2
Compteur de '1' Sous programme pour compter le nombre de 1 dans un octet – D0.B : registre d'entrée/sortie ONE_CNT MOVEM.L D1-D2,-(A7) Save D1 and D2 CLR.B D1 Clear 1’s counter MOVEQ #7,D2 D2 points to MSB NXT_BIT BTST D2,D0 Test D2th bit of D0 BEQ.S LP_TST Do nothing if 0 ADDQ.B #1,D1 Else incr 1’s cnt LP_TST SUBQ.B #1,D2 Decr bit pointer BGE NXT_BIT Repeat until done MOVE.B D1,D0 Put count in D0 MOVEM.L (A7)+,D1-D2 Restore D1 and D2 RTS Return
Calcul de R = (P² + Q² )/(P² - Q²) MOVE.W D0,-(A7) Push P MOVE.W D1,-(A7) Push Q PEA R Push reference to R BSR Cal_R Call subroutine ...
Sous programme Cal_R MOVEM.L D6/A6,-(A7) Save working registers LINK A0,#-8 Allocate 8-byte stack frame MOVE.W 22(A0),D6 Get P MULU.W D6,D6 Calc P2 MOVE.L D6,-4(A0) Save on SF MOVE.L D6,-8(A0) Save again MOVE.W 20(A0),D6 Get Q MULU.W D6,D6 Calc Q2 ADD.L D6,-4(A0) Store P2 + Q2 on SF SUB.L D6,-8(A0) Store P2 - Q2 on SF MOVE.L -4(A0),D6 Get P2 + Q2 DIVU.W -6(A0),D6 Calc (P2 + Q2)/(P2 - Q2) LEA 16(A0),A6 Get ptr to addr of R MOVEA.L (A6),A6 Get address of R MOVE.W D6,(A6) Modify R in caller UNLK A0 Deallocate SF MOVEM.L (A7)+,D6/A6 Restore working registers RTS Return
CHAPITRE 7 Exceptions Deux catégories d'exceptions Interruption circuit La requête d'interruption a une source extérieure On ne sait pas à quel moment elles arrivent Suivant le type d'interruption, un programme particulier s'exécute Les interruptions logicielles (exceptions) ont deux origines différentes causé par des événement internes du processeur (division par zéro) explicitement par le programme moyennant l’instruction TRAP
Instruction TRAP Interruption logicielle TRAP Elle fait partie du programme Il y en a plusieurs identifiées par des numéros (0-15) Suivant le numéro, un programme particulier s'exécute Elles ressemblent à un appel à un sous programme La différence : Le programmeur sur une carte complète n'est pas censé de connaître l'adresse de la routine Se gère comme une interruption et non pas comme un sous programme L'adresse des routines d'exception se trouvent dans une table dont l'adresse est fixée par Motorola
Vecteur d'exception A chaque exception correspond une adresse où l'adresse de la routine d'exception est sauvegardée. Numéro du vecteur correspondant 32 33 … 47 Adresse de l'adresse de la routine 32*4=128 33*4=132 … 47*4=188 Exception TRAP #0 TRAP #1 … TRAP #15
Exceptions L’intérêt des TRAP est de débarrasser le programmeur sur les détails du système exemple en TP : TRAP #0 va mettre le système dans un état contrôlé par le PC Le fonctionnement des TRAP dépend du système sur lequel on travail Ainsi les fabricant des cartes (ou des PC) mettent des programmes tous faits à des adresses qu'ils fixent dans la table des vecteurs d'interruption
Les TRAP disponibles sur la carte de TP (MC 1000) Les exceptions disponibles TRAP #0 pour retourner au moniteur TRAP #13 pour exécuter des fonction BIOS (Basic Input/Output System) TRAP #1 pour exécuter les routines des fonctions logiques du système (RDOS RAM/Disk Operating System) Procédure d’appel d’une routine système Passer les paramètres de la routine sur la pile move.x <Pn>,-(a7) … move.x <p1>,-(a7) Passer la fonction voulu de l'interruption sur la pile (s'il y en a) move.w #<Fonct>,-(A7) Appeler la routine d’exception trap #<num> Récupérer la pile add.l #<taille>,a7
Exemple Trap #1 A cette commande correspond plus d’une vingtaine de fonctions. La fonction 9, par exemple, nous permet d’écrire une chaîne de caractères sur l’écran. Le programme ci-dessous en montre un exemple: movea.l #$0FFF000,A7 initialisation de la pile utilisateur lea TAB(PC),a0 récupérer l’adresse de début de table move.l a0,-(A7) passer le premier paramètre à la routine : l’adresse de début de table move.w #9,-(A7) fonction 9 de l’exception trap #1 appel de l’exception pour écrire la chaîne de caractères addq.l #6,a7 récupération de pointeur de pile trap #0 retour au moniteur TAB dc.b "C ’est un test!",13,10,0 13 est le retour chariot, 10 est pour passer à la ligne et 0 pour terminer la chaîne
Changer l'adresse d'une routine d'interruption sur la carte MC1000 Pour changer ou initialiser l’adresse de la routine d’interruption dans la table de vecteurs d’interruptions, la carte MC 1000 met à notre disposition la fonction 5 du « trap #13 » . Deux paramètre à envoyer sur la pile : adresse de la routine d’interruption à implanter (mot long) numéro du vecteur d’exception à changer (mot) exemple lea R_INT(PC),a0 R_INT … move.l a0,-(A7) … move.w #34,-(A7) correspondant à trap #2 rte move.w #5,-(A7) trap #13 addq.l #8,a7 ...
Table des adresses de routines d’interruption