COURS 4.TXT/fr
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 DONNÉES: 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