170 likes | 413 Views
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).
E N D
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 SWAP D1 Move remainder to D1(0:15) OR.W D1,D0 Insert 1s digit into LSN
Un exemple numérique 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. Adresse de l'adresse de la routine 32*4=128 33*4=132 … 47*4=188 Numéro du vecteur correspondant 32 33 … 47 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 • ...