COURS 4.TXT
Jump to navigation
Jump to search
******************************************************************
* *
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST *
* *
* par Le F‚roce Lapin (from 44E) *
* *
* Cours num‚ro 4 *
* *
******************************************************************
Nous allons aborder maintenant les registres d'adresse. Tout comme
les registres de donn‚es, ces registres sont cod‚s sur 32 bits (un
long mot). Donc … priori aucune diff‚rence, puisque le micro-pro-
cesseur ne connaŒt que des chiffres, que ceux-ci repr‚sentent des
donn‚es ou des adresses, peu lui importe. C'est vrai en grande
partie et d'ailleurs sur certains micro-processeurs, il n'y a
qu'un ou deux registres, qui peuvent contenir indiff‚remment
adresse ou donn‚es.
Voyons, grƒce … un exemple, les diff‚rences en ce qui concerne le
68000 MOTOROLA.
Tapons donc le programme suivant, aprŠs avoir, bien s–r, effac‚
l'ancien, et assemblons.
MOVE.L #$12345678,D0
MOVE.B #$AA,D0
MOVE.L #$12345678,A0
MOVE.B #$AA,A0
MOVE.L #$12345678,A1
MOVE.B A1,D1
L'assembleur note 2 erreurs et nous les annonce par 'invalid size
at line 4' et la mˆme chose pour 'line 6'. Puisque c'est la taille
et non l'op‚ration elle-mˆme qui semble poser problŠme, nous en
d‚duisons que le MOVE vers ou … partir d'un registre d'adresse,
n'est pas possible sur un byte. Rectifions donc la ligne 4 et la
ligne 6 en rempla‡ant les MOVE.B par des MOVE.W et r‚-assemblons.
Note: Lorsque l'assembleur note une erreur, il donne la ligne o—
se situe celle-ci. Dans cette num‚rotation les lignes vides sont
compt‚es.
Ainsi si vous aviez pass‚ une ligne aprŠs MOVE.L #$12345678,D0 les
erreurs auraient ‚t‚ annonc‚es ligne 5 et 7.
Cela fait d‚j… une diff‚rence puisque si vous regardez bien le
programme, nous voulions r‚aliser une op‚ration avec D0: Le
remplir au maximum de sa taille, puis v‚rifier que le MOVE de la
ligne 2, n'affecterait que le byte de poids faible, puis r‚aliser
la mˆme op‚ration sur A0.
Impossible … priori. Tant pis, suite … notre modification,
l'op‚ration se d‚roulera donc sur un word au lieu d'un byte.
D‚buggons notre programme. PremiŠre constatation: l'assembleur,
voyant que les op‚rations ont lieu avec des registres d'adresse et
non pas des registres de donn‚es, a automatiquement modifi‚ les
MOVE vers A0 et A1, pour les transformer en MOVEA, ce qui se lit
MOVE ADDRESS
Ex‚cutons le programme pas-…-pas. D0 prend la valeur $12345678,
puis seul son byte de poids faible est modifi‚, D0 prenant alors
la valeur $123456AA. Ensuite A0 prend la valeur $12345678. AprŠs
la ligne suivante, l'op‚ration affectant le word, nous devrions
avoir $123400AA. Et bien pas du tout! Nous obtenons $000000AA.
Nous venons donc de voir qu'un registre d'adresse est totalement
influenc‚ (donc sur un long mot) lorsqu'il est la destination de
l'op‚ration. Qu'en est-il donc lorsqu'il en est la source ?
Continuons donc notre programme, avec le remplissage de A1 et de
D1. Nous constatons par la suite que seul le word de poids faible
de A1 vient ‚craser celui de D1.
NOTE: $AA est bien en chiffre en hexad‚cimal. Si vous pensiez
qu'il s'agissait de simples lettres de l'alphabet, dormez 1 ou 2
jours, et reprenez le cours … la premiŠre le‡on!
De tout ceci nous d‚duisons 2 d‚finitions:
REGISTRES DE DONNES: Chaque registre de donn‚es a une longueur de
32 bits. Les op‚randes sous forme d'octet occupent les 8 bits de
poids faible, les op‚randes sous forme de mot, les 16 bits de
poids faible et les op‚randes longs, la totalit‚ des 32 bits.
Le bit de poids le plus faible est adress‚ comme bit 0, le bit de
poids le plus fort est adress‚ comme bit 31.
Lorsqu'un registre de donn‚es est utilis‚ soit comme op‚rande
source, soit comme op‚rande destination, seule la partie appro-
pri‚e de poids faible est chang‚e. La partie restante de poids
fort n'est ni utilis‚e, ni modifi‚e.
REGISTRES D'ADRESSE: Chaque registre a une longueur de 32 bits, et
contient une adresse sur 32 bits. Les registres d'adresse
n'acceptent pas une op‚rande dont la taille est l'octet. Par
cons‚quent lorsqu'un registre d'adresse est utilis‚ comme op‚rande
source, soit le mot de poids faible, soit l'op‚rande long dans sa
totalit‚ est utilis‚, en fonction de la taille de l'op‚ration.
Lorsqu'un registre d'adresse est utilis‚ comme destination
d'op‚rande le registre entier est concern‚, ind‚pendamment de la
taille de l'op‚ration. Si l'op‚ration porte sur un mot, tous les
autres op‚randes subissent une extension de signe sur 32 bits,
avant que l'op‚ration ne soit effectu‚e.
D‚finitions extraites du document r‚f EF68000 (circuit int‚gr‚s
MOS THOMSON EFCIS), 45 avenue de l'Europe 78140 Velizy.
Dans ces d‚finitions, nous remarquons un nouveau terme: op‚rande.
C'est le terme qui d‚signe la valeur utilis‚e dans l'op‚ration.
Ainsi dans MOVE.W D0,D1 l'op‚rande source, c'est le word de poids
faible de D0 alors que l'op‚rande destination, c'est le word de
poids faible de D1.
Nous savons maintenant ce qu'est le PC, un registre de donn‚es, un
registre d'adresse, nous avons un peu id‚e de ce que nous montre
les fenˆtre de MONST, continuons donc … d‚cortiquer ce fabuleux
outil !
Pour observer la fenˆtre de MONST, si vous n'avez pas assembl‚ de
programme, impossible d'utiliser Alternate+D. Il vous sera r‚pondu
qu'il n'y a pas de programme en m‚moire. Tapez donc Alternate+M,
vous voyez MONST apparaŒtre, mais vous demandant quel fichier
charger. Tapez ESC et nous voici tranquille pour une observation.
Nous voyons bien dans la fenˆtre du haut nos registres de donn‚es
et … droite nos registres d'adresse. Sous les registres de donn‚es
SR puis PC. Le PC (program counter), nous savons ce que c'est,
mais le SR ?
LE STATUS REGISTER
Le SR (prononcer Status Register, ce qui veut dire en Fran‡ais
registre d'‚tat), est un registre cod‚ sur un word (16 bits) et
qui, comme son nom l'indique, nous renseigne sur l'‚tat du
micro-processeur.
Il est l'exemple frappant de ce que nous avons vu dans l'introduc-
tion du cours 3, … savoir qu'il est bien dangereux de traiter un
ensemble de bits comme un simple chiffre, plus ou moins grand.
Voyons la d‚composition du Status Register.
num‚ro des bits 15----------------------------------0
appellation T . S . . . I2 I1 I0 . . . X N Z V C
Tout d'abord il faut savoir que certains bits du SR ne sont pas
utilis‚s. Ils sont ici symbolis‚s par un point chacun.
Commen‡ons par la description des bits de droite, en commen‡ant
par le 0.
Le bit C (C signifie Carry donc retenue en Fran‡ais).
Ce bit est mis … 1 lorsqu'il y a une retenue dans le bit le plus
‚lev‚ (donc de poids le plus fort) de l'op‚rande objet, dans une
op‚ration arithm‚tique.
Le bit V (V signifie oVerflow donc d‚passement en Fran‡ais).
Imaginons une addition de 2 nombres positifs, lorsque le r‚sultat
va d‚border les limites du registres, on obtiendra en fait un
nombre n‚gatif … compl‚mente … 2. En effet le fait de mettre le
bit de poids le plus fort … 1 indique que le nombre est n‚gatif.
Comme ce n'est pas,dans le cas pr‚sent, le r‚sultat recherch‚, on
est pr‚venu du d‚passement par le fait que le bit V est mis … 1.
Il indique ‚galement, lors de divisions, que le quotient est plus
grand qu'un word ou bien que nous avons un dividende trop grand.
Le bit Z (Z signifie Z‚ro). Il n'indique pas que le r‚sultat est
‚gal … 0, mais plut“t que le r‚sultat est pass‚ de l'autre cot‚
de 0. En effet, ce bit est … 1 lorsqu'aprŠs une op‚ration le bit
de poids le plus fort du r‚sultat est mis … 1, ce qui signifie que
nous sommes en pr‚sence d'un nombre n‚gatif en compl‚ment … 2. Le
bit N (N signifie Negate ) signifie que nous sommes en pr‚sence
d'un nombre n‚gatif.
Le bit X (X signifie eXtend donc extension). C'est un bit bien
sp‚cial qui se comporte un peu comme une retenue. Les instructions
qui utilisent ce bit le pr‚cisent dans leur nom. Par exemple ADDX
qui se lit add with extend est une op‚ration d'addition prenant en
compte ce bit X. Ce bit X est g‚n‚ralement le reflet du bit C,
mais, contrairement, … celui-ci, certaines instructions ne le mo-
difient pas.
Lorsque nous ‚tudierons de plus pr‚s les instructions du 68000, le
fait que l'instruction affecte ou non tel ou tel bit sera parfois
trŠs important.
Le bit T (T signifie Trace donc suivre en Fran‡ais).
Lorsque ce bit est … 1, le 68000 se trouve en mode Trace.
Alors l…, soyez bien attentif, ce qui va suivre est primordial
pour la suite des cours!!!
Le mode Trace est un mode de mise au point pour les programmes. Et
oui, c'est carr‚ment DANS le microprocesseur qu'une telle commande
est ins‚r‚e. A chaque fois que le 68000 ex‚cute une instruction,
il va voir dans quel ‚tat se trouve le bit T. S'il trouve ce bit …
0, il passe … la prochaine instruction. Par contre, si ce bit est
… 1, le 68000 laisse de c“t‚ (temporairement) le programme
principal pour se d‚tourner vers une routine (un 'bout' de pro-
gramme) qui affichera par exemple la valeur de tous les registres
(D0 … D7 et A0 … A7). Imaginons qu'il faille appuyer sur une
touche pour sortir de cette routine: Nous avons donc tout le temps
de consulter ces valeurs. Nous appuyons sur une touche: fin de
notre routine, le 68000 retourne donc au programme principal,
ex‚cute l'instruction suivante, teste le bit T, le trouve … nou-
veau … 1, se branche donc sur notre routine, etc... Nous avons
donc un mode pas-…-pas. Or, vous avez d‚j… utilis‚ cette parti-
cularit‚ en visualisant le d‚roulement des instructions avec
MONST!
Tapez le programme suivant:
MOVE.W #$23,D0
MOVE.W #$15,D1
Assemblez et faites Alternate+D pour passer sous MONST. Appuyez
une fois sur Control+Z et observez le Status Register. MONST a
affich‚ T, indiquant ainsi que ce bit est … 1. Nous sommes donc
bien en mode Trace. Quittez le programme par Control+C.
Nous arrivons maintenant … nous poser une question: Le 68000 a
trouv‚ le bit T … 1. D'accord, il sait o— est son Status register
et il sait que le bit T c'est le 15Šme. Mais aprŠs ? Le 68000
s'est d‚tourn‚ vers une routine qui dans le cas pr‚sent se trouve
ˆtre une partie de MONST.
Mais comment a-t-il trouv‚ cette routine ? MONST est en effet un
programme tout … fait ordinaire, qui a ‚t‚ charg‚ en m‚moire …
partir de la disquette, et qui peut ˆtre plac‚ n'importe o— dans
cette m‚moire.
Une premiŠre solution consisterait … toujours placer ce programme
au mˆme endroit. MOTOROLA aurait ainsi pu concevoir le 68000 en
pr‚cisant: Les programmes de mise au point qui seront appel‚s
grƒce … la mise … 1 du bit T, devront commencer … l'adresse $5000.
Simple, mais trŠs gˆnant car il devient pratiquement impossible de
faire r‚sider plusieurs programmes en m‚moire simultan‚ment, sans
courir le risque qu'ils se marchent sur les pieds!!!
Il y a pourtant une autre solution, un peu plus tordue mais en re-
vanche beaucoup plus souple, qui consiste … charger le programme
de mise au point n'importe o— en m‚moire, de noter l'adresse … la-
quelle il se trouve, et de noter cette adresse … un endroit pr‚-
cis. Lorsque le 68000 trouvera le bit T … 1, il foncera … cet en-
droit pr‚vu … l'avance par MOTOROLA, il y trouvera non pas la
routine mais un long mot, adresse de cette routine, … laquelle il
n'aura plus qu'… se rendre.
Cet endroit pr‚cis, o— sera stock‚ l'adresse de la routine …
ex‚cuter lorsque le bit T sera trouv‚ … 1, c'est un endroit qui se
situe dans le premier kilo de m‚moire (donc dans les 1024 premiers
bytes). En l'occurrence pour le mode trace il s'agit de l'adresse
$24.
R‚sumons: MONST se charge en m‚moire. C'est un programme complet
dont certaines routines permettent l'affichage des registres.
MONST regarde l'adresse … laquelle commencent ces routines, note
cette adresse puis va la mettre … l'adresse $24. Ce long mot est
donc plac‚ … l'adresse $24, $25, $26 et $27 puisque nous savons
que le 'diamŠtre' du 'tube' m‚moire n'est que d'un octet (byte).
Lorsque le microprocesseur trouve le bit T … 1, il va … l'adresse
$24, il y pr‚lŠve un long mot qui se trouve ˆtre l'adresse des
routines de MONST, et il fonce … cette adresse. ok?
Nous allons maintenant r‚aliser un petit programme et nous allons
'planter' votre ATARI!
Tapez ce qui suit:
MOVE.W #$1234,D1
MOVE.W #$6789,D2
MOVE.W #$1122,D3
Assemblez puis taper Alternate+D pour passer sous MONST. Faites
une fois Control+Z. Le bit T du Status register est mis … 1, indi-
quant que nous sommes en mode Trace. Comme nous avons ex‚cut‚ une
instruction, D1 se trouve rempli avec $1234. Appuyons maintenant
sur Alternate + 3.
Nous venons d'activer la fenˆtre de droite (la num‚ro 3).
Appuyons sur Alternate+A. Une demande s'affiche: nous devons
indiquer quelle adresse sera la premiŠre visible dans la fenˆtre.
Il faut taper cette adresse en hexad‚cimal. Nous tapons donc...24.
(pas de $ avant, MONST sait de lui-mˆme que nous parlons en hexa)
Nous voyons s'afficher l'adresse 24 en haut de la fenˆtre et en
face un chiffre qui est l'adresse de notre routine de MONST!
Pour moi c'est 00027086 mais comme je l'ai dit pr‚c‚demment cela
d‚pend des machines. Dans mon cas lorsque le 68000 trouve le bit T
… 1, il fonce donc ex‚cuter la routine qui se trouve en $00027086.
Je vais donc modifier cette adresse! Appuyons sur Alternate+E pour
passer en mode ‚dition. Le curseur est plac‚ sur le premier nibble
de l'adresse. Tapez par exemple 11112222 ou n'importe quel autre
chiffre.
Repassez maintenant dans la fenˆtre 1 en tapant Alternate+1.
Maintenant r‚fl‚chissons: Nous allons refaire Control+Z. Le 68000
va foncer en $24, va maintenant y trouver $11112222, et va foncer
… cette adresse pour y ex‚cuter ce qu'il va y trouver c'est-…-dire
n'importe quoi! Il y a trŠs peu de chance pour qu'il r‚ussisse … y
lire des choses coh‚rentes et vous indiquera une erreur.
Allez y, n'ayez pas peur, vous ne risquez pas de casser votre
machine!
Hop Control+Z et, suivant les cas, vous obtenez divers messages
(Illegal exception, Bus Error etc...).
Quittez en faisant Control+C ou bien en dernier ressort faites un
RESET.
J'espŠre que ce principe est TRES TRES BIEN COMPRIS. Si cela vous
semble … peu prŠs clair, relisez tout car la suite va trŠs souvent
faire r‚f‚rence … ce principe d'adresse dans le premier kilo,
contenant l'adresse d'une routine.
La prochaine fois, nous finirons d'‚tudier le Status Register, en
attendant je vais me prendre une petite vodka bien fraŒche. A la
v“tre!
Back to ASM_Tutorial