Notes sur le 68000 et Illustration sous Unix

publicité
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_16movl 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.
Téléchargement