Académique Documents
Professionnel Documents
Culture Documents
_____________ __ \/ \/ \ ___________ / \ / \ / \ / \ / / / / \ \ / \ / /__\ / / \ / \ \/ / \ \/ / _____________\ \ \ \/ / \ \ / /\ \ / / \ _____________\ \ /\ / \ \ / \ / / \ \ __ \ \/__\/ / __ \ \ \ / / / \ \ \/ \ /\ \ / /\ / \ / / \ \ / / / / / / \ / \ /___\ / \ /___\ / /________\ / /__\ /__\ /\ /____________\
Les Instructions
~~~~~~~~~~~~~~~~ Si vous dsirez ds a prsent charger Asm-one, ce qui est une :excellente initiative, faites comme suit ( .ALLOCATE Chip/Fast/.....>C ( 'C' comme Chip (.WORKSPACE > 50 ( '50' Kb pour stocker la source ... Et on y va
D0 est un registre interne du processeur. Il en existe huit du mme * type ( D0 D1 D2 D3 D4 D5 D6 D7 ). Cette case n'a pas d'adresse et .lorsque on veut l'utiliser on utilise le nom D0 tout simplement L'instruction 'Move' est ma plus simple des instructions. C'est une * affectation. Le '#' signifie que l'on met une valeur directement dans .la destination. La destination est ici la case D0 Syntaxe : Move #Valeure,Registre .(!)L'instruction 'Add' sert ajouter * Syntaxe : Add #Valeur,Registre .'Il en est de mme pour l'instruction 'Sub Syntaxe : Sub #Valeur,Registre Donc ce stade :instructions Move Add Sub #24,D0 #10,D0 #4,D0 du ; 1 ; 2 ; 3 2, on ajoute 10 D0 (D0=34) 3,on ,1 programme, si on suit les trois premires
C'est simple mais on a dj vu trois instructions lmentaires. On : continue Move D0,result'. Voici encore notre instruction Move mais sous une' * : autre forme Syntaxe : Move Registre,Adresse Ici, on oublie le # car il ne s'agit plus d'une valeur directe mais de la valeur contenue dans la case D0. On sait que cette valeur est Donc 30 va tre mis dans la case mmoire qui a pour adresse .30 Result'. 'Result' est ce que l'on appelle un label. Un label est' une tiquette que l'on pose sur une adresse bien prcise. Donc au lieu d'appeler l'adresse $9A096 par exemple, on appellera .'l'adresse 'Result .Clr' signifie 'Clear'. Cela se passe de commentaire' * Syntaxe : Clr Registre Rts' signifie 'ReTurn from Subroutine'. Dans notre cas il montre la' * .fin du programme Syntaxe : Rts .Dc.w' sert assembler des datas directement en mmoire' * ...Syntaxe : Dc.w valeur,valeur,valeur,valeur,valeur..etc Ici 'Dc.w 0' assemble un 0. Donc si on dsassemble la mmoire partir de l'adresse 'Result', on trouvera une case qui avant l'excution est $0000 et aprs excution sera 30 ($001e). On peut visualiser
3
directement les cases mmoire avec la commande .avant et aprs excution du programme1 'H result'. Essayez
Dc' signifie 'Data Code'. La notation '.w' signifie que les' ?? .'valeurs assembles sont au format 'Word :On distinguera ainsi 3 types de format de donnes 'Byte (Octets) : $00 extension '.b (Valeurs allant de 0 255) 'Word (Mots) : $0000 extension '.w (Valeurs allant de 0 65535) 'Long (Long) : $00000000 extension '.l (!Valeurs allant de 0 bcp) ,Ces extensions s'appliquent sur la majeure partie des instructions : par exemple Move.b Move.w Move.l Add.l Sub.b #$10,d0 #$0666,d0 #$00109700,d0 #$45687987,d2 #$69,d0
-----------------------------------Programme 2-----------------------; :Start Bla1 Bsr Efface_Ecran Bla3 Jsr Affiche_Caractere Bra Fin Bla5 Bla5 Fin Rts ----------------; - Sous routines ; ----------------; :Efface_Ecran Bla2 Bla2 Bla2 Rts ----------------; :Affiche_Caractere Bla4 Bla4 Bla4 ; Instructions quelconques ; Saute la sous routine ; Saute a la sous routine
4
Rts --------------------------------------------------------------------; Voici la structure possible d'un programme utilisant des appels de sous routines. Pour comprendre, il faut suivre linairement le droulement du programme depuis le dbut. On commence a 'Start' puis le proc excut les premires instructions 'Bla1' avant de tomber sur 'Bsr Efface_Ecran' Bsr' ou 'Jsr' Cette instruction est gale au 'Gosub' du basic. Le' * programme saute une adresse mmoire pour excuter un morceau de programme mais il garde souvenir de l'endroit d'o il est 'parti. Lorsque dans la sous routine appele, le proc trouve un 'Rts ReTurn From Subroutine) il arrte d'effectuer la sous routine et) revient l'endroit o elle avait t appelle et continue le .programme Syntaxe : Bsr Adresse Syntaxe : Jsr Adresse Bsr' est une instruction code en relatif alors que 'Jsr' est code' en absolu. Du point de vue du programmeur leur fonctionnement est identique. Un 'Bsr' ne pourra pas sauter des sous routines .trop lointaine en mmoire alors qu'un 'Jmp' pourra .Si vous avez bien compris, suivez le .Vous devriez voir les 'Bla' dans l'ordre programme dans l'ordre
.'Bra' C'est un saut sans retour. L'quivalent Basic est 'Goto' * 'Idem pour 'Jmp Syntaxe : Bra Adresse Syntaxe : Jmp Adresse .Donc dans notre exemple les instructions 'Bla5' ne sont pas executes
Rts ; Fin du programme --------------------------------------------------------------------; 'Dbra' * Syntaxe : DBra Registre,Adresse Cette instruction utilise un registre (ici D0) qu'elle dcrmente
5
chaque tour de boucle et tant que ce registre ,n'est pas gal -1, il saute une adresse. On peut remarquer ici en excutant le programme que le rsultat dans d1 est $65 (=101). Donc attention, cette .instruction ralise un tour de boucle supplmentaire Le programme,pour ceux qui auraient l'esprit ailleurs,ralise 101 fois l'opration d1=d1+1 et d2=d2+2. On peut pour bien tre sr de ce qui se passe utiliser le traceur d'Asm-one. Pour cela choisissez la commande 'Debugger' dans le menu 'Assembler'. On peut suivre ainsi sur la droite de l'cran l'volution des registres. Pour excuter une ligne de programme utilisez la flche curseur vers le bas. Ici l'exemple est simple mais pour des algos plus compliqus trs .calculatoires, l'utilisation du 'Debugger' est importante
Vous remarquez que la seule faon d'avoir 1 en sortie d'une opration .Et' est d'avoir toutes les entres 1' :EXEMPLE ~~~~~~~~
6
: Cette opration peut tre faite sur plusieurs bits en mme temps ? = AND 0110011101110000 0010100101010000 Pour effectuer cette opration, il est prfrable de placer les : composantes l'une en dessus de l'autre 0010100101010000 AND 0110011101110000 rsultat-> .0010000101010000 = Il suffit de regarder les colonnes et d'effectuer l'opration And' bit par bit. Lorsque je parlais de reprsentation, ici nous' avons un trs bon exemple. Si vous dsassemblez la mmoire, vous ne verrez jamais les nombres reprsents en binaire comme ci-dessus. En (effet cette reprsentation est trop encombrante. (Voir Cours n1 Vous verriez : $2950 AND $6770 = $2150 .Ce qui est strictement la mme chose mais plus pratique manipuler EXEMPLE ~~~~~~~ La commande assembleur correspondante est AND. (Eh logique non ?) Elle ne peut se faire que sur les registres de donnes (d0 d1 d2 d3 d4 d5 (d6 d7 Syntaxe : AND #Valeur,Dx Syntaxe : AND Dx,Dx ------------------------------------Programme 4----------------------; :Start Move.l #$2950,D0 And.l #$6770,D0 Rts ; Fin du programme ---------------------------------------------------------------------; ou ------------------------------------Programme 5----------------------; :Start Move.l #%0010100101010000,D0 And.l #%0110011101110000,D0 Rts ; Fin du programme ---------------------------------------------------------------------; On trouve aprs excution de ce programme le rsultat dans d0. Pour bien tre sr du rsultat vous pouvez taper comme commande sous .Asm-One : '? $2150'. On retrouve bien ce que nous avions en binaire EXEMPLE ~~~~~~~ ? Mais concrtement, quoi a sert ce truc L'utilisation la plus courante (pour moi en tout cas) est la cration de masques. Par exemple on a le nombre binaire : 11011 et je ne veux pas m'occuper des deux derniers bits, c'est dire que je veux garder que les trois premiers. Donc je vais crer un masque qui filtre uniquement les trois premiers bits. Eh bien le masque peut tre fait .'facilement avec l'instruction 'And Donc si je fais 11011 AND 11100 = 11000
7
(Valeur) (Masque) (Rsultat)
.J'ai bien les trois premiers bits et j'ais vir les deux derniers ------------------------------------Programme 6----------------------; :Start Move.l #$fedf1234,d0 And.l #$0000ffff,d0 Rts ; Fin du programme ---------------------------------------------------------------------; Dans ce petit exemple, je ne veux garder que les 16 premiers bits .de d0. Donc le Rsultat sera $00001234 .OR : C'est le 'ou' logique ~~ :Voici sa table de vrit | 1 | 0 \ |-------|-| 1 | 0 | 0 |-------|-| 1 | 1 | 1 ----------.Si vous avez bien compris le 'AND', et bien c'est pareil Ici, pour avoir un 1 en sortie, il faut au moins un 1 dans une .des sources .Le 'Or' est utilis pour forcer 1 une srie de bits Syntaxe : Or #Valeure,Dx Syntaxe : Or Dx,Dx ------------------------------------Programme 7----------------------; :Start Move.l #$abcd1234,d0 And.l #$0000ffff,d0 Rts ; Fin du programme --------------------------------------------------------------------; Le Rsultat sera $abcdffff. Les 16 derniers bits ont t forc 1 .EOR : C'est le 'ou exclusif' logique ~~~ :Voici sa table de vrit | 1 | 0 \ |-------|-| 1 | 0 | 0 |-------|-| 0 | 1 | 1 ----------Ici, pour avoir un 1 en sortie, il faut avoir un seul dans les .deux sources Syntaxe : Eor #Valeur,Dx Syntaxe : Eor Dx,Dx .J'utilise cette instruction pour calculer des complments
8
------------------------------------Programme 8----------------------; Start: ; On veut calculer le complment de 10 63...(C'est 53 bien (!sur Move.w #10,d0
Avec le Eor ; Eor #63,d0 Voila ; Rts ; Fin du programme ---------------------------------------------------------------------; Cette mthode ne marche qu'avec des complments de multiples de 2 ...Cherchez pourquoi !(1-) ; Meme chose en une instruction
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cmp' signifie 'CoMPare'. Donc comme son nom l'indique a sert ' * faire des comparaisons. Cette instruction est utilise avec une .instruction de branchement conditionnel Syntaxe Syntaxe Syntaxe Syntaxe : : : : Cmp Cmp Cmp Cmp Registre,Registrex #Valeur,Registre #Valeur,Adresse Adresse,Registre
... Et tout a bien sur en .l, .w ou mme .b : Voici tout de suite un petit exemple concret -------------------------------------Programme 9---------------------; :Start Move.w #10,d0 ; D0 = 10 Cmp.w #10,d0 .Beq .ok Move.b ok Rts #1,Flag ; Fin du programme. ; Compare 10 et d0 ;Si c'est egal alors on saute .ok
Flag: Dc.b 0 ---------------------------------------------------------------------; Cet exemple est vraiment idiot, j'en conviens mais il faut que a .(! rentre d'une manire ou d'une autre (Hein l'ours, t'es d'accord Donc aprs un 'Compare' on utilise un 'Bcc'. (cc veut dire ('condition' 'Cmp.w #10,d0 'Beq .ok -> 'Compare -> 'Branch if Equal
En basic on aurait -> IF D0=10 THEN GOTO .ok 'On peut utiliser aussi 'BNE' -> 'Branch if Not equal
Il existe toute une liste de 'Bcc' telle que Bpl, bmi, bge, blt... On peut se limiter l'utilisation de 'Bpl' et 'Bmi' pour le 'suprieur '' et 'l'infrieur ------------------------------------Programme 10---------------------; :Start Move.w #10,d0 ; D0 = 10 Cmp.w #40,d0 Bpl .ok Move.b ok Rts #1,Flag ; Fin du programme. ; Compare 40 et d0 ; Si le rsultat est positif alors saut .ok
Flag: Dc.b 0 --------------------------------------------------------------------; Bon ici il faut faire une petite gymnastique spirituelle. Toutes les instructions 68000 sont comme je dirais 'Instinctive' contrairement Intel par exemple. Donc les instructions instinctives c'est de mettre la source gauche et la destination droite. Donc quand on crit 'Move #10,d0', on met 10 vers D0... Mais, car il y a un mais, 'Cmp' est la seule instruction non instinctive. Si on fait un 'CMP A,B', la machine ralisera l'opration B-A. Le rsultat ne sera pas explicite mais la machine gardera en mmoire si ce rsultat est .positif, ngatif ou gal zero Donc ici... D0=10 Cmp.w #40,d0 ; La machine excut 10-40=-30 .Donc le rsultat est ngatif ; 'Bpl .ok ; 'Branch if plus .On saute si c'est positif ; .Donc ici, on saute pas ; Si on a pas saut, on est ici et aprs on passe par .ok bien sur ; ok ; Si on a saut, on est venu ici sans passer par la case. .dpart et sans toucher 20000 ; .Btst' signifie 'Bit TeSt'. On test si un bit est 0' * : Essayez ce programme, il est marrant ------------------------------------Programme 11---------------------; ... ST: Move.b $dff006,$dff180 ; Eh eh Btst #6,$bfe001 ; Test du 6eme bit de l'octet de l'addresse $bfe001 ; .Bne St ; Si il est egal 0 on saute St Rts ---------------------------------------------------------------------; Pour sortir, on appuie sur le bouton gauche de la souris. Le bit 6 de l'octet contenu l'adresse $bfe001 correspond l'tat du bouton .gauche de la souris '...,Tst'. Cette instruction est quivalente un 'Cmp #0' *
(I Instructions : LSL LSR (Dcalages ~~~~~~~~~~~~~~~~~~~~~~~~ LSR et LSL' signifient 'Logic Shift to Right' et 'Logic Shift to' * .Left' Ce sont justes des dcalages de bits vers la droite ou la gauche .Par exemple. On veut dcaler %11010 vers la droite d'un cran
10
-----------------------------------Programme 12----------------------; :ST Move.b #%00011010,D0 Lsr #1,D0 ; Dcale d'un cran vers la droite Donc D0=00001101 ; Rts ---------------------------------------------------------------------; Voila c'est simple. On peut dcaler de 1 8 crans. Et selon les gots et les dsirs on peut utiliser d'autres instructions comme : 'ROR ROL er ASL ASR' L'avantage de ce genre d'instructions est que l'on peut faire des divisions et des multiplications. C'est beaucoup beaucoup plus rapide de dcaler des bits que de faire un .algorithme de multiplication Pour multiplier, on dcale vers la gauche. Chaque bit correspond une puissance de 2. Donc pour multiplier par 2, on dcale vers la gauche une fois. Si on veut multiplier par 4, on dcale deux fois.. etc etc .Et pareil pour la division avec le dcalage droite .Donc si on dcale n fois, on multiplie ou on divise par 2 puissance n -----------------------------------Programme 13----------------------; :ST Move.w #7,D0 ; D0 = 7 : Ce qu'il faut pas faire ; Mulu.w #4,D0 ; Multiplication par 4 !!! aie aie
: Ce qu'il faut faire ; Lsl.w #2,d0 ; Dcalage de 2 cran sur la gauche (Multiplication par 4 (2 puissance 2 = ; Rts ---------------------------------------------------------------------;
.AddQ' ben pareil que 'Moveq' sauf que a marche avec tout' * (Syntaxe: Addq #Valeur,Dx (Avec une valeur comprise entre 0 et 7 (Syntaxe: Addq #Valeur,Ax (Avec une valeur comprise entre 0 et 7 (Syntaxe: Addq #Valeur,Adresse (Avec une valeur comprise entre 0 et 7 .SubQ' ben tout pareil que Miguel. No comment' *
11
~~~~~~~~~~~~~~~~~~~~~~~~~~ .Pas de commentaire sur ces fonctions, elle sont assez explicites .Mulu' est la multiplication non signe. La plus utilise' * Syntaxe : Mulu.l Syntaxe : Mulu.w Syntaxe : Mulu.l Syntaxe : Mulu.l #Valeur,Registre #Valeur,Registre Registre,Registre Registre,Registre
.'La multiplication signe est obtenue avec 'Muls .Divu' est la division non signe' * : 'La division 'longue Syntaxe : Divu.l Syntaxe : Divu.l #Valeur,Registre Registre,Registre
Elle divise un long (32 bits) par un long et le rsultat est sur un .long : 'La division en 'Word Syntaxe : Divu.w Syntaxe : Divu.w #Valeur,Registre Registre,Registre
Le principe est le mme mais ici le rsultat est diffrent. On trouve sur les 16 bits de poids faible la partie entire et sur les 16 bits .de poids fort le reste de la division .'De mme la division signe sera 'Divs ------------------------------------Programme 14---------------------; :ST Clr.l d1 Clr.l d2 Move.l Mulu.l #10,d0 #40,d0 ; D0 = $0000000A ; D0 = $00000190
Divu.w #13,d0 ; D0 = $000A001E Reste~~~~~----Partie Entire ; Pour rcuprer la partie entire, il suffit de lire le registre d0 en mot ; Move.w d0,d1 ; Transfert des 16 bits de poids faible
Pour rcuprer le reste ($000A), il faut dcaler le registre ; 'fois vers la droite (Sauvage!) ou utiliser la commande 'Swap 16 ; .(!Bien mais faut lire le paragraphe d'aprs) ; Swap Move.w d0 d0,d2 ; Transfert les 16 bits de poids faible
Rts ---------------------------------------------------------------------;
12
Donc voila la multiplication et la division. Il ne faut pas oublier que ces instructions sont des oprations assez compliques donc elle prennent un peu plus de temps en excution que les autres instructions. Alors si vous pouvez viter d'utiliser des multiplications et des divisions dans vos sources et ben faites le. Et je rappelle que pour faire des multiplications et des divisions par .des multiples de 2 IL FAUT utiliser les dcalages
Exemple: le nombre $f000 en 16 bits sign est gal -4096 Si on veut l'utiliser en 32 bits sans tendre son signe on aura $0000f000 qui est gal 61440...aie Donc on tend le signe de $f000 et on obtient $fffff000 qui est lui .bien quivalent -4096 L'opration d'extension de signe consiste simplement recopier le bit de poid fort (c'est le signe!) Sur les 16 bits que l'on ajoute .devant Exg' Signifie 'Exchange'. Cette .contenu de deux registres Syntaxe : Exg Registre,Registre instruction permet d'changer le' *
13
Lorsqu'on fait 'Move (ax),d0', on met dans D0 le contenu de la case .mmoire dont l'adresse est contenue dans a0 : Voici un exemple -----------------------.... Admettons qu'a partir de $20000 on ait: $14 $18 $21 $52 $36 -----------------------,c'est a dire .... dans la case $20000 il y a $14 ) ,dans la case $20001 il y a $18 ( ...dans la case $20002 il y a $21
------------------------------------Programme 16---------------------; :Start Move.l #$20000,A0 ; Dans a0 on met $20000 ; Mais ici, on remplace cette adresse par une autre ; ...car c'est trs sale d'utiliser des adresses absolues ; Move.l #Datas,A0 ; Voila c'est mieux ----------------------; Move.b (A0),D0 C'est a dire $14 ; Move.w Move.l (A0),D1 (A0),D2 ; D0 reoit le contenu de la case $20000 ; D1 reoit $1418 ; D2 reoit $14182152
-----------------------; Move.b Move.b Rts (A0)+,D6 (A0)+,D7 ; D6 reoit $14 et on ajoute "1" A0 ; D7 reoit $18 et on ajoute "1" A0
; Fin du programme
Datas: Dc.b $14,$18,$21,$52,$36 ---------------------------------------------------------------------; Move nb(Ax)' c'est la mme instruction .peut se servir d'un index Syntaxe : Move nb(Ax),Dx Syntaxe : Move nb(Ax),Adresse Move (Ax,Dx)' c'est un 'Move' avec un index mais contrairement ' * l'instruction d'avant o l'index tait fixe,ici l'index est le contenu .d'un registre donc on peut le faire varier au cours du programme Syntaxe : Move (Ax,Dx.w),Dx que prcdemment mais on' *
14
Syntaxe : Move (Ax,Dx.w),Adresse : On peut aussi ajouter une multiplication du registre d'offset Syntaxe : Move (Ax,Dx.w*2),Dx Move (Ax)+' est un 'Move' avec une incrmentation automatique du' * registre Ax. Cette incrmentation est fonction de la taille de .l'lment que l'on dplace Par exemple, si on fait 'Move.b (a0)+,d0', on copie dans d0 un octet donc a0 sera incrmete de "1" pour pointe sur l'octet suivant. Avec un Move.w (a0)+,d0', on dplace un mot (= 2 octets) donc a0 sera' incrmenter de "2". Et logiquement pour un 'Move.l (a0)+,d0' a0 sera .(incrmenter de "4" (1 long= 2 mots= 4 octets Syntaxe : Syntaxe : +(Syntaxe +(Syntaxe Move (Ax)+,Dx Move (Ax)+,Adresse : Move (Ax)+,(Ax : Move Dx,(Ax
On peut utiliser aussi la dcrmentation. 'Move.w -(a0),d0'. Le "-" se .place devant car la dcrmentation est effectue avant le move -------------------------------------Programme 17--------------------; :Start Clr.l D0 Clr.l D1 Move.l #Datas,A0 ; Voila c'est mieux ; A0 pointe sur le dbut de la table + 2 ; D0 reoit $21 ; A0=A0-1 et D1 reoit $18
Add.l #2,A0 C'est a dire $21 ; Move.b Move.b Rts (A0),d0 -(A0),D1
~~~~~~~~~~~~~~~~~~~~~~~~~~ Lea' signifie 'Load Effective Address'. Cette instruction ne' * .(s'utilise qu'avec les registres d'adresses (a0 a1 a2 a3 a4 a5 a6 a7 Syntaxe : Lea Valeur,Ax Cette instruction sert charger une adresse 'pourrait aussi crire 'Move.l #Valuer,Ax dans un registre. On
Movem' est le 'Move multiple'. Il permet de transfrer plusieurs' * registres en une seule instruction. On l'utilise en gnral pour .sauvegarder tous les registres dans la pile .Movem.m D0-D7/A0-A6,-(a7) .Movem.l (a7)+,D0-D7/A0-A6 ; empile les registres ; depile les registres
15
Voil c'est pas compliqu, remarquez .l'envers. C'est une coutume juste qu'on utilise la pile
---------------------------------------------------------------------; .C'est simple... l'adresse 'Data1' on a assembl des octets l'adresse 'Data2' on a assemble des mots. Un mot ne peu pas tre sur une adresse impaire. Par exemple 'Move.w #1,$20001' ne marche .pas Donc pour cette raison, on ajoute une instruction 'Even' qui recale .l'adresse 'Datas2' sur une adresse paire Vous avez dans ce petit programme quelques .qu'accepte Asm-one. le '>>' signifie dcalage exemples de syntaxes
.Blk' est l'instruction qui permet de rserver une zone mmoire' * Par exemple si vous voulez rserver 10 octets pour travailler vous pouvez taper : Dc.b 0,0,0,0,0,0,0,0,0,0 ou Blk.b 10. La deuxime solution tant la bonne bien sr. Vous pouvez remplir ces donnes rserves par un motif... Par exemple 'Blk.b 10000,$ff' rservera octets et ils seront tous initialiss $ff au depart. On peut 10000 .'aussi faire des 'Blk.w' ou des 'Blk.l
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16