******************************* * L'ASSEMBLEUR * * et le processeur saturn * * par COCOHP le ASMFLAHeur * ******************************* INTRODUCTION Ce cours est destiner a connaitre les bases du langage assembleur. Il ne vous permetra pas de programmer mais plutot de comprendre la suite. Vous allez vous amuser avec les champs, rigoler avec les transfert memoire et pouffer de rire devant les drapeau quand vous aurez finis de lire tout ca. S'il y a une seule petite ambiguit‚ n'hesites pas: *CRS sur RTC-ONE. ASSEMBLEUR ET LANGAGE MACHINE On ecris tous nos programmes en assembleur(des fichiers textes avec dedant A=A+1 A...plein d'instructions quoi).Ce fichier texte est ensuite compiler par un compilateur(par exemple ASMFLASH sur HP) en langage machine(une serie de chiffres correspondant aux instructions du fichier texte). FICHIER TEXTE ASSEMBLEUR CORRESPONDANCE LANGAGE MACHINE(page 366,367) " A=A+1 A E4 D0= 7050E 1BE0507 R0=A 100 ..." ensuite vous les mettez a la suite: "E41BE0507100" et vous lancer GASS qui vous met ca dans la memoire directement vous obtenez un "code" qui signifie que c'est OK. Il y a evidemment plus simple que de tout traduire a la main(mais ne rigolez pas c'est ce que je faisait au d‚but). Il existe des programmes sp‚ciaux qui traduise votre fichier texte directement en chaine avec tous les nombres et meme directement en "code"(=programme en langage machine executable). Ces programmes (des vrais dons du ciels) sont appelez assembleur. ASMFLASH sur HP est un assembleur sur HP. TASM ou MASM sur PC sont des assembleur. DEVPAC ou SEKA sont des assembleurs sur AMIGA. Vous pouver cependant tres bien le faire a la main: en utilisant voyage page 366/367 vous metez dans un autre fichier texte tous les chifres(vous n'oublier pas l'entete qui dit que c'est un prog asm CCD20 puis la taile du code... vous lancer ensuite GASS page 213). Dans tous les cas il doit y avoir marqu‚ Code au niveau 1 de la pile utilisateur. Ceci signifie que c'est un prog ASM(on ne peu pas voir le contenu). En appuyant sur EVAL vous le lancer. En resumer l'assembleur est le langage que l'on utilise, grace a un compilateur(ou a la main) on obtient du langage machine que comprend directement le processeur. FONCTIONNEMENT DE ASMFLASH Vous tapez vos instruction dans un fichier texte(grace a l'editeur de la HP ou a stringwriter..). Par exemple taper avec l'editeur de la HP: "!CODE GOSBVL 0679B A=DAT1 A D1=A D1=D1+ 10 A=DAT1 W A=A+A W DAT1=A W GOSBVL 067D2 A=DAT0 A D0=D0+ 5 PC=(A) @" le dernier caractere : @ est indispensable a ASMFLASH. Vous le faites avec alfa puis fleche-bleu puis enter Ce doit etre le dernier caractere(pas de enter apres) Taper ceci sauvez et mettez le dans la pile puis lancer ASM(ou ->ASM suivant la version). Il apparait code dans la pile. Tapez #5 (ENTER) faite un swap on a alors: 2: # 5h 1: Code faite EVAL vous obtenez # 10d ou # Ah suivant votre base. Ce programme multipli par 2 un binaire dans la pile. le menu OPT de ASMFLASH est un menu d'option par defaut -CODE/HEX indique le resultat de la compilation(chaine avec les nombres corespondant aux instruction ou directement programme en langage machine) -0-15/1-16 indique quelle numerotation prendre pour certain test(CBIT..). -PC/HP permet differentes notation: ?A#0 A est bien interpreter si on est en notation PC mais fait une erreur en notation HP(il faut le signe different) -JMP autorise a un programme d'en appeler un autre(il suffit alors de taper le nom du programme preced‚ de ') ex: faite "GOSBVL 0679B @" 'PRO' STO "GOSBVL 067D2 A=DAT0 A D0=D0+ 5 PC=(A) @" 'ENDE' STO tapez ensuite "'PRO 'ENDE @" Lancer ASM:vous obtenez un code. ASMFLASH est aller chercher le contenu des deux noms 'PRO' et 'ENDE' et les a inserer. Ca permet d'alleger les programmes. Ce code est inactif vous pouvez le lancer. -ON/OFF indique l'‚tat de l'ecran pendant la compilation. Vous gagnez 13 pour cent du temps en eteignant l'ecran(position OFF) mais cela est inutile pour les sources de moins de 20000 pas(ca bousille l'ecran). -EXIT sort du menu Ce sont la les options par defaut vous pouvez par exemple utiliser la notation PC meme si dans votre menu OPT c'est sur HP. Pour cela il faut que vous metiez au debut de votre programme(ou meme au milieu) votre option precede de !. Dans le premier exemple j'ai mis !CODE pour etre sur que le resutat de la compilation soit un prog directement executable. le $ sert a inserer des chiffres dans le code: ex "$123456789 @" si je compile et que j'execute ca va me donner n'importe quoi parce que le processeur va considerer mon chiffre comme des instructions. Si vous regardez page 366/367 il fera donc AR3EX,GOC ... Ne le lancer pas vous risquez un memory clear. le C barr‚ sert a inserer des lettres. En fait seul les codes ASCII en hexa des lettres sont inseres(voir manuel de la HP annexe C) (si je pose c barr‚=# car je n'ai pas le caractere sur mon PC) "#AAAA "$14141414 @" et @" donneront les meme code. Le code ASCII de la letre A etant 41h (il faut le retourner pour que le processeur puisse le lire). le % permet de mettre des commentaires le / est comme le ' il permet d'appeler un sous programme qui doit etre dans un repertoire special... Vous pouvez maintenant vous servir de ASMFLASH, les choses serieuses vont commencer. LES REGISTRES DU PROCESSEUR Je ne vais pas detailler tout mais que le principal. Le processeur possede des variables a lui tout seul. Ce sont exactementcomme des variables RPN. Il y a tout de meme des differences: -elles sont en nombre limite(les variable se nomment A,B,C,D,D0,D1) -ces varaible ne contiennent que des nombres enties(0,1,2,4 etc) -elles ont une taille precise(elles font 16 cases(quartets) pour A,B,C,D c'est a dire qu'elle peuvent contenir au maximun 16 chiffres hexadecimaux et 5 cases pour D0 et D1) ex: on ne pourra pas mettre le chiffre decimal 18446744073709551616 soit(10000000000000000h en hexa qui fait 17 chiffres) dans la variable A car il depasse. de meme pour 100000h dans la variable D0 ou D1 -Voila sinon ce sont des variable normales et c'est avec elles, en les additionant,les comparant etc..que on peut faire des scrolls... -On appelle(pour une raison inconnue) les variables du processeur les REGISTRES. Moi je les appelerais variable du processeur pour ne pas vous embrouiller. LES TRANSFERT MEMOIRE: C'est de loin ce qu'il y a de plus dur a comprendre. L'avantage c'est que quand on a compris c'est pour la vie:sur tous les ordinateurs c'est pareil. Les tranfert memoires sont en fait la lecture de la memoire et l'ecriture dans la memoire: les registres(heu variables du processeur) D0 et D1 contiennent un chiffre. Ce chiffre peut etre un compteur ou n'importe quoi mais c'est generalement une adresse(une adresse est un nombre comme un autre). De plus ca tombe bien car la taille de ces variables est de 5 cases(5 quartets) et les adresse vont de 0h a FFFFFh. Donc on peut avoir n'importe quel addresse dans D0 ou D1. Par exemple si on veut mettre le chiffre 12345h dans D0 on fait: "D0= 12345 @"(attention ne pas lancer:dangereux) cela peut etre l'adresse 12345h ou tout simplement le nombre 12345h de toute facon c'est pareil. maintenant supposons que l'on ait cela: adresse contenu 12345h 0 12346h 1 12347h 5 12348h ... Quand on fait A=DAT0 3 le processeur va lire 3 cases a l'adresse qu'il y a dans D0.(ca y est il y en a qui decrochent) Il y a D0 et DAT0 supposons que l'instruction A=D0 existe comme D0=12345h on aurais A=12345h Cependant ici c'est A=DAT0 3. Cela veut dire au processeur: il y un nombre dans D0(ici 12345h) et bah tu te dis que en fait c'est une addresse et tu prend 3 cases que tu mets dans A. On a donc A=510h (et non pas 015 car le processeur retourne les donnes lors de la lecture et de l'ecriture). Maintenant ca se corse, pour faire le contraire(ecrire le contenu de A dans la m‚moire on fait exactement le contraire: DAT0=A 3(3 signifie 3 cases) (attention cela n'est pas D0=A qui existe aussi). Le processeur voit un nombre dans D0(par exemple 12345h) mais il ne le considere pas comme un nombre mais comme une addresse et il y ‚cris le contenu des 3 premiŠres cases de la variable A. Si j'avais fais D0=A alors comme A= 0000000000000510 on aurait eu D0=00510h(5 cases max dans D0 et D1). Ici A=0000000000000510 et D0=12345h on fait DAT0=A 3 et cela fait que apres on a toujours A=0000000000000510 et D0=12345h mais a l'adresse 12345h on a ecris 0,a 12346h on a ‚cris 1 et a 12347h on a 5. POURQUOI RETOURNER LES DONNE Et il le fait pas expres il est ne comme ca et si vous comprenez ce que je vais raconter alors vous verez que c'est plutot logique. Quand le processeur lit une donne il commence par le debut, supprosons que je fasse A=DAT0 3 (avec D0= 12345h) la variable A possede 16 cases et il va commencer par remplir les premieres. Il lit le contenu de l'adresse 12345h(0h) et le met dans la case 0 Il lit le contenu de l'adresse 12346h(1h) et le met dans la case 1 Il lit le contenu de l'adresse 12347h(5h) et le met dans la case 2 et puis il s'arrete parcequ'on a mis 3 apres A=DAT0. on a donc les 16 cases de A: numero de la case F E D C B A 9 8 7 6 5 4 3 2 1 0 contenu de la case 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 0 c'est plus simple que de d'abord calculer la taille pour savoir dans quelle case on va mettre le premier quartet de donne(le chiffre A). En effet si on avait A= 015(ordre non renvers‚) il faudrait que le processeur mette 0 dans la 3eme case,(1 dans la 2eme et 5 dans la derniere): il faudrait qu'il commence par la case 3. Si par exemple on avait fait A=DAT0 4(lire 4 cases de donnes) alors il aurait fallu mettre le zero dans la quatrieme case et tout decaler: il aurait fallu tout commencer a la case 4. Alors que si on inverse(ce qui est le cas) le zero est toujours mis dans la case 0, le 1 dans la case 1 et le 5 dans la 3eme case(que ce soit A=DAT0 3 ou A=DAT0 4(a ce moment on lit 1 case de plus c'est tout)). La technique du renversement est donc bien plus simple mais bien plus chiante aussi(la plupart des autres processeurs ne renversent pas les donn‚s) LES CHAMPS Beaucoups de mecs ont souvent des problemes avec les champs A , B, X, W, WP , P, S, XS. En fait c'est hyper simple. Les variables(ou registres) ont 16 cases. Si on faisait toutes les operation(A=DAT0 16) sur ces 16 cases cela serait hyper lent(deja que ca l'est beaucoup). On ne prend donc qu'un nombre plus petit de cases pour faires les calculs(2 cases,5 cases...). On dit que si on prend 5 cases c'est le champs A. Bon je m'explique. Prenons un champs, un vrai(avec des vaches et tout) alors on peut le diviser en 16 partie egales que l'on numerote de 0 a F. Facile non. On a donc 16 petits champs(avec chacun leur propre vache et tout). On regroupe alors ces petits champs en petits groupe. -le champs 0 et le champs 1 forment un plus grand champs appel‚ champs B -le champs 0,1 et 2(ou le champs B et 2) forment un grand champs appel‚ le champ X(hey j'appelle mes champs comme je veux! merde) -Le champs 0,1,2,3 et 4 forment le champs A -J'appele le champs 2 le champs XS et le champs numero F le champs S... Prenez maintenant voyage page 365: il y a mes 16 champs et les noms que j'ai associ‚ a certain groupement(A pour les 5 Premier). Supposons que les champs 5,6,7,8,9,A,B,C,D,E,F soient deja tondu. Ca serait une perte de temps de retondre tous les champs, je ne vais donc m'occuper que des champs de 0 a 4, c'est a dire du champs A car il regroupe tous les cinqs. Et bah c'est pareil pour les variable. Supossons que les cases 5,6,7,8,9,A, B,C,D,E,F soit a 0 et que l'on fasse l'operation A=0 sur les 16 cases. Alors il suffit de faire A=0 A(le dernier A signifiant champs A, c'est a dire les 5 premieres cases). C'est clair ex: on a A= 0000000000000123 (16 cases) si on fait A=0 B(champs B: cases 0 et cases 1) on a A= 0000000000000100 (le 1 reste parce que c'est la case numero 2 si on avait fait A=0 A(champs A=cases 0,1,2,3,4) il serait parti. En fait l'ideal ici etait de faire A=0 X(cases 0,1,2) Alors ca rentre? Attention il ne faut surtout pas confondre les variable A, B,C,D,D0,D1 et les champs(ou groupe de cases): A,B,X,XS,M,S,W,P,WP. Il y a souvent une confusion entre la variable A et le champs A(5 cases). Le pire ‚tant A=B A,B=A B, B=B+B B, A=A+B A... Bon ils auraient pus les appeler autrement ces champs(groupement de cases) a la con.je rappelle une derniere foi que la lettre qui suis l'operation correspond a des groupement de cases(A:5 premiere cases,B:2 premieres). Si vous regardez bien page 365 vous ne voyez pas le champs P, ni le champs WP. P est une variable(comme A,B,C,D,D0,D1) mais avec une unique case. On peut mettre des valeurs dedan donc de 0 a F.Si P=0 et que l'on fait A=A+A P alors la cases 0 sera aditionner a elle meme(vous n'avez qu'a remplacer par sa valeur. Pour WP, c'est toutes les cases jusqu'a la cases numero P. Par exemple si P=1 A=A+A WP est pareil que A=A+A B(2 premiere cases), si P=4 A=0 WP est pareil que A=0 A. Atention quand on fait une operation sur un groupement de case precis(le champs A par exemple(5 premiere)) alors il se detache totalement des autre. si on a par exemple A= 00000000000FFFFF on fait A=A+1 W(toutes les cases) et on a A= 0000000000100000 on fait A=A+1 A(5 premiere cases) et on a A= 0000000000000000 et oui si on prend toutes les cases l'addition se fait normalement mais si on neprend que les 5 premiere, il n'est pas question que la case 5(la sixieme case car la numerotation commence a 0) soit modifi‚(l'operation se fait sur les 5 cases). On fait l'operation normalement sauf que on ne garde que les 5 premieres cases. Comme dans ce cas il y a eu "depassemet de champs" (normalement on aurait du affecter la sixieme case et on l'a pas fait) on met la carry(la retenu: juste une variable vrai ou fausse) a vrai.C'est tout. De meme par simetrie si on a A= 0000000000000000 et que l'on fait A=A-1 A on a A= 00000000000FFFFF et la carry(retenu) est mise a vrai. LES FLAGS En francais flag signifie drapeaux. En fait pour une variable drapeau il y deux positions: drapeau baiss‚ et drapeau dans le vent(lev‚). Le processeur possede 16 variables drapeaux numerotes de 0 a F. On peut utiliser les drapeaux 0 a 9 librements, les autres le systeme s'en sert pour les interuption... Un drapeau a donc deux positions 0 ou 1, faux ou vrai, baiss‚ ou lev‚. On les notes ST(ST 1,ST 2....). En fait c'est une variable cod‚e sur un seul bit(0 ou 1). Les drapeaux sont tres utiles, ce sont comme des variables booleenes en pascal. Par exemple si vous avez vu mon viewer VADOR, je me sert du drapeau 3 pour la vitesse: si le drapeau est baiss‚(?ST=0 3) alors je ne passe pas par une boucle d'attente (vitesse maximale), s'il est mis (?ST=1 3) je fais la boucle d'attente (ralentissement). CONCLUSION Ceci n'est qu'une breve introduction. Ce sont les bases indispensables. Il est a noter que la variable D1 se comporte exactement pareil que la variable D0, que la variable C exactement pareil que la variable A, les variable B et D ne pouvant cependant pas faire de tranfert avec la memoire (DAT0=B 3 n'existe malheusement pas, pas plus que B=DAT0 3, pareil pour D). Dans le prochain cours: premier programs comment‚s.