chet B o u . 00 80 y Note ur le s s Dup 6 Bla G. n Notes sur le 68000 et Illustration sous Unix Gérard Blanchet Bertrand Dupouy Département Signal 8 6 0 0 0 TABLE DES MATIèRES I. La famille 68XXX ............................................................................................................. II. Les registres du 68000..................................................................................................... III. Les drapeaux .................................................................................................................. IV. Instructions..................................................................................................................... IV-1. Syntaxe.................................................................................................................. IV-2. Mouvements.......................................................................................................... IV-3. Opérations arithmétiques....................................................................................... IV-4. Opérations logiques............................................................................................... IV-5. Les décalages......................................................................................................... IV-6. Les manipulations de bits ...................................................................................... IV-7. Instructions DCB .................................................................................................. IV-8. Instructions de branchement.................................................................................. IV-9. Instructions privilégiées......................................................................................... IV-10. Instructions génératrices de trappes..................................................................... IV-11. Instructions sur registre d'état.............................................................................. V. Cycles ............................................................................................................................ V-1. Cycle de lecture....................................................................................................... V-2. Cycle d'écriture ....................................................................................................... V-3. Cycle d'arbitrage de bus.......................................................................................... VI. Les exceptions................................................................................................................ VII. Programmation en assembleur ...................................................................................... VII-1. Exemple ............................................................................................................... VII-1-1. Production d’un fichier exécutable.............................................................. VII-1-2. Lancement sous adb.................................................................................... VII-1-3. Le fichier ass............................................................................................... VII-2. Passage des arguments sur la pile ........................................................................ VII-2-1. Le programme............................................................................................. VII-2-2. Exécution sous adb ..................................................................................... VII-3. Compilation.......................................................................................................... VII-3-1. Un programme c et le code engendré correspondant.................................. VII-3-2. Références non satisfaites ........................................................................... 1 1 2 2 2 3 5 8 9 10 10 11 12 13 13 14 14 14 15 16 17 17 18 18 20 20 20 21 23 23 24 I. La famille 68XXX Le microprocesseur M68000, dont la conception a duré de 1976 à 1979, est le premier d'une famille de processeurs CISC dans lesquels ont été introduites des techniques qui caractérisent bon nombre de processeurs RISC. D. 16 16 8 16 16 32 16 32 68000 68HC000 68008 68010 68012 68020 68070 68030 1980 1987 1982 1983 1985 1985 1987 1988 68040 1991 32 Ad. 24 24 20 24 31 32 24 32 MV non non non oui oui oui oui oui 32 oui ≈75 000 tr. / reg.32 bits / mult.16*16. Pipe de 3 octets. ≈192 000 tr. Pipe de 3 mots. =68000+MMU+DMA+RS232+I2C+timer Cache données+MMU+Cache instructions (16 lignes de 16 octets). ≈300 000 tr. ≈68030+FPU+cache de 4ko+MMU. ≈1 200 000 tr. u chet B Note 00 80 y Caractéristiques générales du 68000 : – adressage A1-A23 + LDS / UDS (16 Mo ou plus avec les bits d'état), – espace d'adressage commun IO/MEM, – mécanisme d'arbitrage d'accès au bus, ur le s s Dup 6 – deux modes d'interruptions, o . – mémoire virtuelle impossible. Bla G. n II. Les registres du 68000 16 registres 32 bits : 8 de données, 8 d'adresses dont un utilisé comme pointeur de pile. Le compteur ordinal est sur 24 bits. D0 Données D7 A0 Adresses A6 USP Piles A7 SSP PC (24) SR CCR T Ø S Ø Ø I 0 I1 I2 Ø Ø Ø X N Z V C Notes sur le 68000 _________________________________________________________________________ 2 III. Les drapeaux X u IV-1. Syntaxe . Dupo 00 80 y IV. Instructions Note C chet B N V Positionné lorsque l'opérande destination est mis à zéro ou lorsque le résultat d'une comparaison est l'égalité. Bit de signe. Bit d'overflow, remis à zéro par la plupart des instructions non arithmétiques. Modifié par les opérations arithmétiques (opérations en complément à deux). Bit de retenue. Remis à zéro par la plupart des instructions non arithmétiques. Modifié par les opérations arithmétiques (opérations logiques). Bit d'extension. Non modifié par les instructions non arithmétiques et modifié par les opérations arithmétiques comme le bit C. Ne peut être testé par les instructions conditionnelles. ur le 6 ss Bla G. n Z Les exemples traités sont pris sur les machines SUN à processeurs 680x0. La syntaxe utilisée est légèrement différente de celle définie par Motorola. Ainsi la qualification de longueur des opérandes est donnée dans l'instruction elle-même et ne constitue pas une extension au code de l'instruction. Tous les mnémoniques et les noms de registres doivent être en minuscules. Ex. : MOVE.L … → movl … Notations : – ri = registre ai ou di, – ai = registre d'adresse, et di = registre de donnée, – ea = adresse effective, – disp = déplacement, – # = indicatif de valeur immédiate et @ = indicatif d'adresse. Ex. : an@ indique que l'adresse de l'opérande est donnée par le contenu du registre an. Mode 0 1 2 3 4 5 6 6 7/0 7/1 7/2 7/3 7/3 7/4 Syntaxe as dn an an@ an@+ an@– an@(d) an@(d,ri:w) an@(d,ri:l) xxx:l xxx:w pc@(d) pc@(d,ri:w) pc@(d,ri:l) #xxx,sr,ccr Adressage direct des registres dn Adressage direct des registres an Adressage indirect sur registre Adressage indirect sur registre avec post-incrément Adressage indirect sur registre avec pré-décrément Adressage indirect sur registre avec déplacement Adressage indirect sur registre avec index mot Adressage indirect sur registre avec index long Absolu long Absolu court Relatif au PC Relatif au PC avec index mot Relatif au PC avec index long Immédiat / adressage sr ou ccr. Notes sur le 68000 _________________________________________________________________________ 3 Les documentation MOTOROLA font référence à quatre catégories d'adressage selon les instructions : donnée, mémoire, contrôle et modifiable. La catégorie contrôle fait référence aux instructions : – jmp (branchement), – jsr (branchement vers un sous-programme) – lea (chargement d'adresse effective), – pea (mise en pile d'adresse effective), – movem (transfert multiple de registres de données et d'adresses), Mode dn an an@ an@+ an@– an@(d) an@(d,ri:w) an@(d,ri:l) xxx:w xxx:l pc@(d) pc@(d,ri:w) pc@(d,ri:l) #xxx Adresse effective Code Reg. 000 Reg. 001 Reg. 010 Reg. 011 Reg. 100 Reg. 101 Reg. 110 Reg. 110 Reg. 111 000 111 001 111 010 111 011 111 011 111 111 Donnée X Mém. Contr. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Modif. X X X X X X X X X X Les instructions sont commentées de la manière suivante : Drapeaux affectés XNZVC Taille des opérandes et Mnémoniques as Mnémonique Motorola code de l'instruction – rrr ou RRR = registre – aaaaaa = adresse effective – tt = taille (00/01/10 pour octet/mot/mot long) – mmmmm = mode opératoire – xxx … = donnée Modes d'adressage acceptés par l'instruction et syntaxe. Dans l'instruction, la lettre X peut être remplacée par b, w, l, s selon les mnémoniques indiqués dans la colonne de gauche. Notes sur le 68000 _________________________________________________________________________ 4 IV-2. Mouvements ––––– 32 EXG (Exchange Registers) 1100rrr1mmmmmRRR – mmmmm = 01000 : entre registres de donnée – mmmmm = 01001 : entre registres d'adresse – mmmmm = 10001 : entre registres de donnée et registre d'adresse S'il y a un registre de donnée, rrr spécifie toujours un registre de donnée. S'il y a un registre d'adresse, RRR spécifie toujours un registre d'adresse. r i ↔ rj exg ri , rj ––––– 32 LEA (Load Effective Address) 0100rrr111aaaaaa an@, an@(d), an@(d ; ri:w), an@(d ; ri:l), xxx:w, xxx:l pc@(d), pc@(d,ri:w), pc@(d,ri:l) lea ea , an ––––– LINK (Link and Allocate) link 0100111001010rrr déplacement_16movl A ,–(A7) i link #taille16,Ai ⇔ movl A7,Ai addl #taille16,A7 cc sr rn cr , , , , ea ea cr rn chet B movw movw movc movc . o u Cas des registres de contrôle : ur le s s Dup 6 00 80 y movc movX ea , ea movX #data , dn Note movb movw movl MOVE (Move Data from Source to Destination) destination : dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w source : tous modes d'adressage Bla G. n –NZ00 8/16/32 : link an , #disp X n'est pas altéré et C est mis à zéro. ––––– 16/32 movw movl MOVEA (Move Address) (source) → destination (extension automatique de signe). destination : registre d'adresse source : tous modes d'adressage. ––––– MOVEM (Move Multiple Registers) Notes sur le 68000 _________________________________________________________________________ 5 16/32 moveml movemw 01001d001taaaaaa masque_16 – t = 0/1 pour mot/mot long – d = 0/1 pour (reg.→mém./mém.→reg.) an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w, pc@(d), pc@(d,ri:w), pc@(d,ri:l) registres → destination ; (source) → registres Utile pour les sauvegardes multiples en pile. movemX #mask , ea movemX ea , #mask movemX ea , reglist movemX reglist , ea Ex : moveml a0-a3/d2–d4,sp@– – En mode prédécrémenté, seul est permis le transfert reg.→ mém., dans l'ordre A7→ A0,D7→ D0, à partir de <adresse>–2. Le masque de 16 bits est interprété : d0|d1| … |d7|a0| … |a7 Chaque bit à 1 indique le registre impliqué dans le transfert. – En mode postincrémenté, seul est permis le transfert mém.→ reg., dans l'ordre D0→ D7,A0→ A7, à partir de <adresse>. Le masque de 16 bits est interprété : a7|a6| … |a0|d7| … |d0 ––––– 16/32 MOVEP (Move Peripheral Data) (source) → destination movepl movepw movepX dn , an@(d) movepX an@(d) , dn DI n n+2 DI n n+4 n+2 n+6 –NZ00 32 MOVEQ (Move Quick) moveq donnée immédiate 8 bits → destination = registre dn. (la donnée est étendue à 32 bits et transférée dans dn). 0111rrr0xxxxxxxx moveq #data , dn ––––– PEA (Push Effective Address) Notes sur le 68000 _________________________________________________________________________ 6 32 pea 0100100001aaaaaa destination → sp@– destination : an@, an@(d), an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w, pc@(d), pc@(d,ri:w), pc@(d,ri:l) pea ea –NZ00 32 swap SWAP (Swap Register Halves) 0100100001000rrr [31:16] ↔ [15:0] swap dn Il n'existe pas de swapb. Il faut donc faire un rorw #8. ––––– unlk UNLK (Unlink) 0100111001011rrr movl Ai,A7 unlk Ai ⇔ movl (A7)+,Ai unlk an IV-3. Opérations arithmétiques XNZVC 8/16/32 addb addw addl ––––– 16/32 ADD (Add Binary) source : tous modes d'adressage destination : an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w addX addX addX addX ea , dn dn , ea ea , an (sauf addb) (voir ADDA) #data , ea (voir ADDI) ADDA (Add Address) source : tous modes d'adressage XNZVC 8/16/32 ADDI (Add Immediate) destination : dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w XNZVC 8/16/32 ADDQ (Add Quick) addqb addqw addql XNZVC 0101xxx0ttaaaaaa destination : an, dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w addqX #data , ea (1≤#data≤8) Le code zéro correspond à la valeur 8. ADDX (Add Extend) Notes sur le 68000 _________________________________________________________________________ 7 8/16/32 (destination)+(source)+X → destination addxb addxw addxl addxX di , dj addxX ai@– , aj@– –0100 8/16/32 CLR (Clear an Operand) destination : dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w clrb clrw clrl –NZVC 8/16/32 cmpb cmpw cmpl clrX ea CMP (Compare) (destination) – (source) destination : registre dn source : tous modes d'adressage cmpX ea , dn cmpX #data , ea –NZVC 8/16/32 CMPA (Compare Address) destination : registre an source : tous modes d'adressage –NZVC 8/16/32 CMPI (Compare Immediate) (destination) – donnée immédiate destination : dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w –NZVC 8/16/32 CMPM (Compare Memory) source : an@+ destination : an@+ cmpmb cmpmw cmpml XNZVC 32 ÷ 16 divs cmpmX ai@+ , aj@+ DIVS (Signed Divide) destination : dn (quotient dans mot de poids faible, reste dans mot de poids fort. Le reste, lorsqu'il est ≠ 0 possède le signe du dividende)) source : dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w, pc@(d), pc@(d,ri:w), pc@(d,ri:l), #xxx divs ea , dn XNZVC 32 ÷ 16 DIVU (Unsigned Divide) divu ea , dn divu XNZVC EXT (Sign Extend) Notes sur le 68000 _________________________________________________________________________ 8 8 → 16 extw 16 → 32 extl –NZ00 16*16 → 32 muls 0100100mmm000rrr – mmm = 010 : extension octet → mot – mmm = 011 : extension mot → mot long extX dn MULS (Signed Multiply) (source)×(dn)16 → dn32 source : dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w, pc@(d), pc@(d,ri:w), pc@(d,ri:l), #xxx muls ea , dn –NZ00 16*16 → 32 MULU (Unsigned Multiply) mulu ea , dn mulu XNZVC 8/16/32 negb negw negl XNZVC 8/16/32 NEG (Negate) dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w negX ea NEGX (Negate with Extend) negxX ea negxb negxw negxl XNZVC SUB (Substract Binary), SUBA (Substract Address), SUBI (Substract Immediate) 8/16/32 subX subX subX subX subb subw subl XNZVC 8/16/32 subqb subqw subql XNZVC 8/16/32 subxb subxw subxl ea , dn dn , ea ea , an #data , ea SUBQ (Substract Quick) 0101ddd1ttaaaaaa subqX #data , ea SUBX (Substract with Extend) subxX di , dj subxX ai@- , aj@- Notes sur le 68000 _________________________________________________________________________ 9 –NZ00 8 tas TAS (Test and Set an Operand) Instruction indivisible équivalente à une instruction TST suivie d'une instruction de mise à un du bit de poids fort de l'octet adressé. Cette instruction est une instruction de synchronisation par attente active. dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w tas ea –NZ00 8/16/32 tstb tstw tstl TST (Test an Operand) dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w tst ea IV-4. Opérations logiques OR, AND et EOR portant sur sr sont des opérations privilégiées. –NZ00 8/16/32 andb andw andl AND (And Logical) source : dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w, pc@(d), pc@(d,ri:w), pc@(d,ri:l), #xxx destination : an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w andX ea, dn andX dn, ea andX #data, dn –NZ00 8/16/32 ANDI (And Immediate) sr, dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w –NZ00 8/16/32 OR (Inclusive OR), ORI (Inclusive OR Immediate) orb orw orl XNZVC 8/16/32 eorb eorw eorl orX ea, dn orX dn, ea or #data, dn orb #data, cc orw #data, sr EOR (Exclusive OR), EORI (Exclusive OR Immediate) eorX eorX eorb eorw dn, ea #data, ea #data, cc #data, sr Notes sur le 68000 ________________________________________________________________________ 10 –NZ00 8/16/32 notb notw notl NOT (Logical Complement) dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w notX ea IV-5. Les décalages XNZVC 8/16/32 aslb aslw asll X 0 C ASL (Arithmetic Shift) décalages de registres : 1110rrr1tt100RRR ou 1110nnn1tt000RRR – RRR registre à décaler, – rrr contient le nombre de décalages, – ou nnn donne le nombre de décalages (0 correspond à 8) décalages de mémoire : 1110000111aaaaaa aslX di , dj aslX #data , di aslX ea X XNZVC asrb asrw asrl ASR (Arithmetic Shift) décalages de registres : 1110rrr0tt100RRR ou 1110nnn0tt000RRR décalages de mémoire : C 1110000011aaaaaa asrX di , dj asrX #data , di asrX ea XNZ0C X LSL (Logical Shift) 8/16/32 lslb lslw lsll 0 LSR (Logical Shift) lsrb lsrw lsrl C lslX di , dj lslX #data , di lslX ea XNZ0C 8/16/32 0 lsrX di , dj lsrX #data , di lsrX ea X C Notes sur le 68000 ________________________________________________________________________ 11 –NZ0C 8/16/32 rolb rolw roll C ROL (Rotate Left without Extend) décalages de registres : 1110rrr1tt111RRR ou 1110nnn1tt011RRR décalages de mémoire : 1110011111aaaaaa rolX di , dj rolX #data , di rolX ea –NZ0C 8/16/32 rorb rorw rorl C ROR (Rotate Right without Extend) décalages de registres : 1110rrr0tt111RRR ou 1110nnn0tt011RRR décalages de mémoire : 1110011011aaaaaa rorX di , dj rorX #data , di rorX ea C XNZ0C X ROXL (Rotate with Extend) 8/16/32 roxlb roxlw roxll roxlX di , dj roxlX #data , di roxlX ea C XNZ0C ROXR (Rotate with Extend) 8/16/32 roxrb roxrw roxrl X roxrX di , dj roxrX #data , di roxrX ea IV-6. Les manipulations de bits ––Z–– 8/32 btst BTST (Test a Bit) dn, an@, an@(d), an@+, an@–, an@(d,ri:w), an@(d,ri:l), xxx:l, xxx:w, pc@(d), pc@(d,ri:w), pc@(d,ri:l), #xxx btst dn , ea btst #data , ea ––Z–– BCHG (Test a Bit and Change) Notes sur le 68000 ________________________________________________________________________ 12 8/32 bchg 0000rrr101aaaaaa ou 0000100001aaaaaa 00000000bbbbbbbb – rrr contient le numéro de bit de l'opérande (numéro de bit dynamique), – ou bbbbbbbb donne le numéro (numéro de bit statique) bchg dn , ea bchg #data , ea Le complément du bit est mis dans Z puis mis à jour dans la destination. Si cette dernière est un registre de donnée, le numéro de bit est pris modulo 32, tandis que pour une case mémoire, il est pris modulo 8. ––Z–– 8/32 bclr ––Z–– 8/32 bset BCLR (Test a Bit and Clear) bclr dn , ea bclr #data , ea BSET (Test a Bit and Set) bset dn , ea bset #data , ea IV-7. Instructions DCB XØZØC 8 abcd XØZØC 8 sbcd XØZØC 8 ABCD (Add Decimal with Extend) abcd di , dj abcd ai@– , aj@– SBCD (Substract Decimal with Extend) sbcd di , dj sbcd ai@– , aj@– NBCD (Negate Decimal with Extend) nbcd ea nbcd IV-8. Instructions de branchement L'assembleur as offre la possibilité de remplacer la lettre "b" de l'instruction par la lette j. Ex. : jra pour bra. as se charge du calcul de la taille adéquate de l'offset. Pour l'instruction bsr, on utilise jbsr. Les codes conditions sont : Notes sur le 68000 ________________________________________________________________________ 13 code CC CS EQ F GE GT HI LE ––––– 16/32 bcc bccs Carry Clear Carry Set Equal False (Never) Graeter or Equal Greater Higher Lower or Equal cc cs eq f ge gt hi le 0100 0101 0111 f 1100 1110 0010 1111 code LS LT MI NE PL T VC VS Low or Same Less than Minus Not Equal Plus True (Always) Overflow Clear Overflow Set ls lt mi ne pl t vc vs 0011 1101 1011 0110 1010 t 1000 1001 Bcc (Branch Conditionally) 0110ccccdddddddd 0110ccccdddddddd déplacement_16 si dddddddd = 0 – dddddddd est un déplacement sur 8 bits. Si cc alors pc + d → pc (déplacement sur 8 ou 16 bits) cc peut prendre toutes les valeurs précédentes sauf t et f. bccX ea ––––– dbcc DBcc (Test Condition, Decrement and Branch) si cc faux alors debut dn := dn–1; si dn = –1 alors allera instruction suivante sinon allera pc+d; finsi; dbcc dn , label ––––– 8 scc ––––– bra bras ––––– bsr bsrs ––––– jmp Scc (Set According to Condition) Si condition vraie alors 0FFH → destination sinon 0 → destination scc ea BRA (Branch Always) pc+d → pc (déplacement sur 8 ou 16 bits) braX label BSR (Branch to Subroutine) pc → sp@– ; pc+d → pc bsrX label JMP (jump) modes d'adressage autorisés : an@, an@(d), an@(d ; ri:w), an@(d ; ri:l), xxx:w, xxx:l jmp ea L'option –j de as permet de transformer les jmp et jsr en branchements relatifs (à condition que l'adresse cible se trouve dans la zone ±32K). Notes sur le 68000 ________________________________________________________________________ 14 ––––– jsr JSR (Jump to Subroutine) modes d'adressage autorisés : an@, an@(d), an@(d ; ri:w), an@(d ; ri:l), xxx:w, xxx:l jsr ea ––––– rtr ––––– rts RTR (Return and Restore Condition Codes) sp@+ → cc ; sp@+ → pc RTS (Return from Subroutine) sp@+ → pc IV-9. Instructions privilégiées ––––– reset XNZVC rte XNZVC stop RESET (Reset External Devices) Commande de la ligne bidirectionnelle de Reset. RTE (Return from Exception) sp@+ → sr ; sp@+ → pc STOP (Load Status Register and Stop) La donnée doit définir un bit S à 1, sinon il y a violation de privilège. La reprise s'effectue : • lors d'une exception trace, (le bit T est positionné par l'instruction STOP), • lors d'une interruption de niveau supérieur au niveau défini par l'instruction STOP, • lors d'une réinitialisation. –NZ00 ORI to SR (Inclusive OR Immediate) –NZ00 ANDI to SR (AND Immediate) –NZ00 EORI to SR (Exclusive OR Immediate) ––––– MOVE USP (Move User Stack pointer) XNZVC MOVE EA to SR (Move to Status Register) Notes sur le 68000 ________________________________________________________________________ 15 IV-10. Instructions génératrices de trappes ––––– trap TRAP (Trap) TRAP #num ⇒ traitement de l'interruption "num". trap #vector ––––– –NØØØ 16 TRAPV (Trap on Overflow) TRAPV #num ⇒ traitement de l'interruption "num" dans le cas de de la condition d'overflow. CHK (Check Register against Bounds) IV-11. Instructions sur registre d'état –NZ00 ANDI to CCR (AND Immediate) –NZ00 EORI to CCR (Exclusive OR Immediate) –NZ00 ORI to CCR (Inclusive OR Immediate) XNZVC MOVE EA to CCR (Move to Condition Codes Register) ––––– MOVE SR to EA (Move from Status Register) Notes sur le 68000 ________________________________________________________________________ 16 V. Cycles I ur le 6 ss WS WS II III IV u chet B . Dupo 00 80 y Note V-1. Cycle de lecture 1 2 3 4 5 6 7 8 Bla G. n A1-A23 FC0-FC1 AS / UDS / LDS 9 DTACK D0-7 / D8-15 V-2. Cycle d'écriture I 1 2 II 3 4 WS 5 III 6 IV 7 8 A1-A23 FC0-FC1 R/W AS UDS / LDS DTACK D0-7 / D8-15 9 Notes sur le 68000 ________________________________________________________________________ 17 V-3. Cycle d'arbitrage de bus I II III IV A1-A23 hi FC0-FC1 hi R/W hi AS hi UDS / LDS hi DTACK D0-7 / D8-15 BR 1 BG BGACK 4 2 5 3 VI. Les exceptions Les exceptions sont classées en trois groupes définissant des règles de priorité de traitement dans le cas d'exceptions multiples. Causes externes : • initialisations (niveau 0), • interruptions (niveau 1), • erreurs bus (niveau 0). Causes internes : • division par zéro (niveau 2), • instructions d'interruptions software TRAP, TRAPV, (niveau 2), • instruction CHK (niveau 2), • instructions non valides (niveau 1), • erreurs d'adresses (recherche de mots à partir d'adresses impaires) (niveau 0), • violations de privilèges (niveau 1), • mode trace (traité comme une interruption interne de haut niveau) (niveau 1). Notes sur le 68000 ________________________________________________________________________ 18 Traitement : • copie interne du registre d'état, • mise à 1 de S et à 0 de T, • détermination du numéro d'interruption, • sauvegarde de l'état du processeur (sauf pour le reset) et du PC dans la pile superviseur, • chargement du PC à l'aide de la valeur lue en mémoire. S F PC h PC l Les erreurs de bus sont provoquées, entre autres, par une absence de réponse des circuits externes, par un problème lors de la lecture du numéro d'interruption ou un défaut de page dans un accès utilisant un MMU. I/N FC Traitement d'une erreur bus : R/W • copie interne du registre d'état, • mise à 1 de S et à 0 de T, AA h • détermination du numéro d'interruption (Vecteur Erreur Bus), AA l • sauvegarde de l'état du processeur (sauf pour le reset) et du PC Inst. Reg. S F dans la pile superviseur : la valeur sauvegardée est imprévisible, elle PC h dépend du cycle machine pendant lequel s'est passée l'exception (valeur PC l augmentée de 2 à 10 octets par rapport à l'adresse du premier mot de l'instruction), • sauvegarde du premier mot de l'instruction venant d'être traitée et de la l'adresse qui a provoqué cet état, • sauvegarde de l'état du processeur (lecture/écriture, code état, et traiteement d'instruction ou d'exception), • chargement du PC à l'aide de la valeur lue en mémoire. Numéro d'interruption 0 2 3 4 5 6 7 8 9 10 11 12-14 15 16-23 24 Adresse (hexa) 0 4 8 C 10 14 18 1C 20 24 28 2C 30-37 38 3C-5F 60 Valeur initiale du pointeur de pile superviseur (RESET) Valeur initiale du compteur ordinal (RESET) Erreur bus Erreur adresse Instruction interdite Division par zéro Traitement de l'instruction CHK Traitement de l'instruction TRAPV Violation de privilège Trace Emulation ligne 1010 Emulation ligne 1111 Vecteur non initialisé (fourni par la logique externe) Interruption parasite (erreur bus arrivant pendant le traitement d'une exception) Notes sur le 68000 ________________________________________________________________________ 19 25 26 27 28 29 30 31 32-47 48-63 64-255 Interruptions auto-vectorisées : niveau 1 niveau 2 niveau 3 niveau 4 niveau 5 niveau 6 niveau 7 Traitements des instructions TRAP (0 à 15) 80-BF C0-FF 100-3FF Vecteurs d'interruption utilisateurs (numéro lu sur le bus puis multiplié par 4). VII. Programmation en assembleur VII-1. Exemple On donne ci-après le canevas d'un programme écrit en assembleur sur Sun 3-60 (assembleur 68020). |********************************************* |Format general d'un programme en assembleur * |********************************************* chet B Note Bla G. n lea pile+3996,a7 movl const,sp@pea format jbsr _printf addqw #8,sp |nombre d'octets sur la pile |pour les parametres et |l'adresse du format pour printf pea 0 |exit(0) du langage C u |****** Segment de programme ************ .text .globl _main _main: |****** On sauvegarde le contexte (sp et a6) link a6,#0 00 80 y |******* Segment de donnees ************* .data format: .ascii "%d\012\0" |format de sortie |pour printf ur le const: .long 123 s s Dup 6 o . .lcomm pile,4000 Notes sur le 68000 ________________________________________________________________________ 20 |ou clrl sp@jbsr _exit |****** on restitue le pointeur de pile et a6, puis on sort unlk a6 rts VII-1-1. Production d’un fichier exécutable -lc ass.s ass.com ass.o ss.out ld <mambo.dupouy: 27>ass ass.s /bin/as -o ass.o ass.s bin/ld -Bstatic -e _main -o ass.out ass.o -lc Undefined _environ VII-1-2. Lancement sous adb On notera : – Les informations sans intêret pour l'application ont été remplacées par des ... . – Les textes entre parenthèses derrière les instructions sont des commentaires qui n'ont pas à être tapés. Voici, classées dans l’ordre où on les utilise généralement, les commandes de base du débogueur adb, outil rudimentaire, qui permet de travailler sur un fichier qui n’a pas été compilé avec l’option –g. Poser un point d’arrêt sur une instruction en prog+n Visualiser les points d’arrêt Lancer l’exécution Exécuter en pas à pas Lancer l’exécution jusqu’à la fin Visualiser les registres Visualiser n lignes de programme à partir de l’adresse prog Visualiser la cellule mot en héxadécimal (4 octets) Visualiser la cellule mot en décimal (4 octets) Visualiser la cellule mot en héxadécimal (2 octets) Visualiser la chaîne TabCar <mambo.dupouy: 28>adb ass.out main,10?ia (visualiser 10 lignes à partir de main) _main: prog+n:b $b :r :s :c $r prog,n?ia mot/X mot/D mot/x TabCar/s Notes sur le 68000 ________________________________________________________________________ 21 _main: _main+4: _main+0xa: _main+0x10: _main+0x16: _main+0x1c: _main+0x1e: _main+0x22: _main+0x28: _main+0x2a: _main+0x2c: _main+0x2e: linkw lea movl pea jsr addqw pea jsr addqw unlk rts orb a6,#0 pile+0xf9c:l,a7 const:l,sp@format:l _printf:l #8,sp 0:w _exit:l #4,sp a6 #0x4e56,d0 main+4:b (mettre un point d'arrêt en main+4) $b (visualiser les points d'arrêts) breakpoints count bkpt command 1 _main+4 :r (lancer l'exécution) breakpoint _main+4: lea lea :s (exécuter en pas à pas) stopped at _main+0xa: :s stopped at _main+0x10: chet B o Bla G. n _main+4: . u 0xdfffe88 0x2024 _main+0x4 0x0 __DYNAMIC ur le s s Dup 6 00 80 y sp pc ps Note $r (visualiser les registres) ... a6 0xdfffe88 pile+0xf9c:l,a7 pile+0xf9c:l,a7 movl const:l,sp@- pea format:l jsr _printf:l :s stopped at $r ... a6 sp pc _main+0x16: 0xdfffe88 0x2bc2c pile+0xf94 0x2036 _main+0x16 Notes sur le 68000 ________________________________________________________________________ 22 ps 0x0 __DYNAMIC _main+0x16: jsr _printf:l 2bc2c/X (visualiser 4 octets en héxadécimal) pile+0xf94: 20000 20000/X format: 25640a00 2bc2c+4/D (visualiser 4 octets en décimal) pile+0xf98: 123 :s stopped at :s stopped at _printf: linkw a6,#-4 _printf+4: movl d7,sp@ :c (relancer l'exécution) 123 process terminated $r ... a6 sp pc ps 0x2bc24 0x2bc20 0x2054 0x0 pile+0xf8c pile+0xf88 _printf+0x4 __DYNAMIC $q (quitter adb) VII-1-3. Le fichier ass est un script shell qui assure assemblage et édition de liens pour un fichier assembleur sans qu’on ait à faire appel à crt0.o lors de l’édition de liens. Ce dernier fichier assure l’interface avec le système et initialise les registres, en particulier le pointeur de pile sp. On peut se passer de ce fichier en initialisant sp avec l’adresse de début d’une zone mémoire qu’on aura prévue assez grande pour contenir tous les paramètres passés dans les fonctions systèmes (environ 4Ko). C’est ce qui est fait dans le canevas donné au premier paragraphe. ass #!/bin/sh # Assemblage et edition de liens pour ne pas utiliser crt0.o # Exemple de fichier source dans ass.exemple # if [ $# != 1 ]; then echo "il faut donner $0 nom du fichier exit !" Notes sur le 68000 ________________________________________________________________________ 23 fi Nom_Fic=`basename $1 .s` # # Appel a as -> assemblage echo "/bin/as -o $Nom_Fic.o $Nom_Fic.s" /bin/as -o $Nom_Fic.o $Nom_Fic.s # # Appel a ld -> edition de liens NON DYNAMIQUE echo "bin/ld -Bstatic -e _main -o $Nom_Fic.out $Nom_Fic.o -lc" /bin/ld -Bstatic -e _main -o $Nom_Fic.out $Nom_Fic.o -lc # # Appel a chmod (!) pour mettre execute chmod u+x $Nom_Fic.out VII-2. Passage des arguments sur la pile VII-2-1. Le programme On étudie ici le passage à un programme des trois paramètres de l'environnement Unix : argc, argv et arge. |********************************************* |Recuperation nom de commande et du premier * |parametre d environnement * |********************************************* taille = 0x1000 .data format: .ascii "%s\012\0" |format de |sortie pour printf const: .word 6 .lcomm pile,taille |on reserve de la place |pour la pile .text .globl _main _main: |****** On sauvegarde le contexte (sp et a6) link a6,#0 lea pile+taille-1,a7 movl a6@(0x8),sp@- |prendre dans la |pile argv [0] pea format Notes sur le 68000 ________________________________________________________________________ 24 jbsr addqw _printf #8,sp movl a6@(0x14),sp@|prendre dans pile arge[0] pea format jbsr _printf addqw #8,sp pea 0 |exit(0) du langage C |ou clrl sp@jbsr _exit |****** on restitue le pointeur de pile et a6, puis on sort unlk a6 rts VII-2-2. Exécution sous adb La séquence suivante illustre une séance de débogage du programme précédent. L'exécutable produit s'appelle arg.out. adb arg.out main,4:?ia _main: _main+4: _main+0xa: _main+0xe: linkw lea movl pea a6,#0 pile+0xfff:l,a7 a6@(8),sp@format:l main+0xa:b $b breakpoints count bkpt 1 _main+0xa $r ... a6 sp pc 0x0 0x0 0x0 :r param1 breakpoint $r ... a6 0xdfffe7c command __DYNAMIC __DYNAMIC __DYNAMIC _main+0xa: movl a6@(8),sp@- Notes sur le 68000 ________________________________________________________________________ 25 sp pc 0x2bc97 0x202a _main+0xa: 0xdfffe7c,5/X 0xdfffe7c: pile+0xfff _main+0xa movl 0 0 2 a6@(8),sp@dfffebc 0xdfffebc/X 0xdfffebc: 6172672e dfffebc/s 0xdfffebc: arg.out dfffec4/s 0xdfffec4: param1 0xdfffe7c,15/X 0xdfffe7c: 0 2 dfffebc 0 dfffecb dfffee2 dfffefc dffff08 dffff93 dffffbe dffffc2 dffffdb 6172672e 6f757400 70617261 4f4d453d dfffecb/s 0xdfffecb: HOME=/sig/eole1/dupouy dfffee2/s 0xdfffee2: SHELL=/bin/csh dffffa2/s 0xdffffa2: PWD=/sig/eole1/dupouy/asm68 :c arg.out HOME=/sig/eole1/dupouy process terminated $q dfffec4 dfffec4 dfffef1 dffffa2 0 6d310048 Notes sur le 68000 ________________________________________________________________________ 26 a6 dfffe7c Schéma du contenu de la pile : 2 = nombre de mots sur la ligne de commande (le paramètre argc du langage C). Ici figurent argv[0] et argv[1], puis un tableau de 10 pointeurs vers les variables d'environnement. Les premiers paramètres passés dans la pile sont les variables d'environnement (HOME=…), puis la ligne de commandes (arg.out param1). La pile 0 2 dfffebc dfffec4 0 dfffecb dfffee2 dfffef1 dfffefc dffff08 dffff93 dffffa2 dffffbe dffffc2 dffffdb 0 arg. out0 para m10H OME= VII-3. Compilation VII-3-1. Un programme c et le code engendré correspondant Soit le programme : /* Fichier opt1.c main () { int i,j; i= 2+3; i= 2*i; printf (" i = %d\n", i); j=i*2; j=j*3; printf (" j = %d\n", j); } */ et son code assembleur engendré, résultat de la compilation par la commande : argv[0] argv[1] arge[0] arge[1] arge[2] arge[3] arge[4] arge[5] arge[6] arge[7] arge[8] arge[9] Notes sur le 68000 ________________________________________________________________________ 27 cc -O -S opt1.c i= 2+3; i= 2*i; j=i*2; j=j*3; |############################### LL0: .data .data1 L17: .ascii " i = %d\012\0" .data1 L18: .ascii " j = %d\012\0" .data .text .proc |#PROC# 020 LF12 = 4 LS12 = 128 LFF12 = 0 LSS12 = 0 LV12 = 0 .text .globl _main _main: |#PROLOGUE# 0 link a6,#-4 movl d7,sp@ |#PROLOGUE# 1 moveq #10,d7 movl pea L17 jbsr addqw d7,sp@_printf #8,sp asll movl addl addl #1,d7 d7,d0 d0,d0 d0,d7 movl pea L18 jbsr addqw |#PROLOGUE# 2 movl unlk |#PROLOGUE# 3 rts d7,sp@_printf #8,sp a6@(-4),d7 a6 Notes sur le 68000 ________________________________________________________________________ 28 VII-3-2. Références non satisfaites Le fichier objet du premier exemple comportant des références inconnues (notées ici en gras), l'assembleur remplace les étiquettes correspondantes par les adresses longues. Ces références seront résolues lors de l'édition de liens par chargement de la bibliothèque C (option -lc de l'éditeur de liens). _main: linkw a6,#0 _main+4: lea _edata+0xf9c:l,a7 _main+0xa: movl const:l,sp@_main+0x10: pea format:l _main+0x16: jsr 0:l _main+0x1c: addqw #8,sp _main+0x1e: pea 0:w _main+0x22: jsr 0:l _main+0x28: addqw #4,sp _main+0x2a: unlk a6 _main+0x2c: rts DUMP HEXA : _main: 4e560000 48790002 4eb9 4ff90002 4eb9 0 fa42f39 0 584f4e5e 20004 504f4878 4e750000 Fichier objet correspondant : _main: linkw a6,#0 _main+4: lea pile+0xf9c:l,a7 _main+0xa: movl const:l,sp@_main+0x10: pea format:l _main+0x16: j s r _printf:l _main+0x1c: addqw #8,sp _main+0x1e: pea 0:w _main+0x22: jsr _exit:l _main+0x28: addqw #4,sp _main+0x2a: unlk a6 _main+0x2c: rts DUMP HEXA : _main: 4e560000 48790002 4eb9 4ff90002 4eb9 20a0 bc342f39 2050 584f4e5e 20004 504f4878 4e750000 BIBLIOGRAPHIE – Microprocesseur EF 68000 - THOMSON-EFCIS, – Programmation en Assembleur 68000 - L. Léon - Eyrolles, – Le microprocesseur 68000 et sa programmation - P. Jaulent - Eyrolles, – Revue Microscope Vol. II, Nov. 1986 - Lausanne, – Documentation Sun Microsystems : Assembly Langage Reference, – Documentation Sun Microsystems : Debbugging Tools.