Obligement - L'Amiga au maximum

Mercredi 26 août 2026 - 15:53  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in English


Réseaux sociaux

Suivez-nous sur Mastodon




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL



Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : Assembleur 68k - Optimiser le code
(Article écrit par Orlando et extrait de ZINE - octobre 1990)


J'ai déjà lu plusieurs articles dans d'autres magazines sur l'optimisation du code, mais je n'ai jamais vu un livre d'astuces complet sur l'optimisation. Le voici, du moins le début, présenté par Orlando de Brainstorm. Les valeurs de tactcycle et la plupart des exemples sont tirés d'un article de John A. Toebes. (Motorola compiler-manager).

Note : les commandes déplaisantes commencent par "D:" et les commande optimisées par "O:". b=bytes, c=tactcycles.

1. Toujours utiliser "moveq" avec des constantes 32 bits

D: and.l  #$e,d2    ( 6b, 16c )

O: moveq  #$e,d0    ( 2b,  4c )
    and.l  d0,d2     ( 2b,  8c )
                     -----------
                     ( 4b, 12c )
~
D: cmp.l  #1,d4     ( 6b, 14c )

O: moveq  #1,d0     ( 2b,  4c )
    cmp.l  d0,d4     ( 2b,  8c )
                     -----------
                     ( 4b, 12c )
~
D: move.l  #6,label (10b, 28c )

O: moveq   #6,d0    ( 2b,  4c )
    move.l  d0,label ( 6b, 20c )
                     -----------
                     ( 8b, 24c )
~
D: move.l  #4,d0    ( 4b, 12c )

O: moveq   #4,d0    ( 2b, 4c  )
~
D: clr.l   d0       ( 2b,  6c )

O: moveq   #0,d0    ( 2b,  4c )

Voici une astuce spéciale pour les valeurs qui sont trop grandes pour être utilisées avec la commande "moveq". Par exemple, si vous voulez charger la valeur 200 dans d0.

D: move.l #200,d0

O: moveq  #256-200,d0
    neg.b  d0

N'oubliez pas non plus les commandes "addq" et "subq".

D: add.l   #3,d0    ( 6b, 16c )

O: addq.l  #3,d0    ( 2b, 8c  )

2. Utilisation d'un registre

Mais il n'est pas nécessaire de toujours utiliser un registre ! Si vous voulez soustraire un petit nombre d'un registre, utilisez deux instructions "subq.l" !

d: sub.l  #10,d0    ( 6b, 16c )

O: subq.l #8,d0     ( 2b,  8c )
    subq.l #2,d0     ( 2b,  8c )
                     -----------
                     ( 4b, 16c )

Cela n'accélère pas, mais diminue la taille du code !

3. lea

La commande "lea" est très utile, mais peu de gens l'utilisent de la manière suivante :

D: add.l  #12,a0    ( 6b, 16c )

O: lea    12(a0),a0 ( 4b,  8c )

4. lea et les registres d'adresses

Vous pouvez également utiliser l'instruction "lea" pour charger des constantes dans un registre d'adresses.

D:  move.l #443,a1  ( 6b, 12c )

O:  lea    443.w,a1 ( 4b,  8c )

5. Registre de données

Si vous voulez écrire la valeur $4f0000 dans un registre de données, vous pouvez certainement utiliser cette méthode :

D: move.l #$4f0000,d0 (6b, 12c)

La version optimisée se présente comme suit :

O: moveq  #$4f,d0    ( 2b,  4c )
    swap   d0         ( 2b,  4c )
                      -----------
                      ( 4b,  8c )

6. Piles

Quelques conseils sur la manipulation des piles.

D: move.l #1,-(sp)   ( 6b, 20c )

Vous le remplaceriez certainement par :

O1:moveq  #1,d0      ( 2b,  4c )
    move.l d0,-(sp)   ( 2b, 12c )
                      -----------
                      ( 4b, 16c )

Mais la commande "pea" peut également être utilisée dans ce cas.

O2:pea    1.w        ( 4b, 16c )

7. Commandes mulu

Si votre objectif est la vitesse, utilisez les onglets avec des valeurs précalculées. Si votre objectif est la taille du code, utilisez la commande "mulu". La troisième méthode consiste à remplacer les commandes "mulu" par "lsl" et "add".

D: muls.w  #10,d0   ( 4b, 70c )

O: move.l  d0,d1    ( 2b,  4c )
    lsl.l   #2,d1    ( 2b, 12c )
    add.l   d1,d0    ( 2b,  8c )
    add.l   d0,d0    ( 2b,  8c )
                     -----------
                     ( 8b, 32c )

8. Registres d'adresses

N'effacez pas les registres d'adresses avec la commande "move" ou "clr". Utilisez "sub" !

D1:move.l #0,a1     ( 6b, 12c )

D2:clr.l   a1       ( 2b,  6c )

Ces lignes de commande appartiennent au passé. Les plus récentes sont :

O: sub.l   a1,a1    ( 2b,  4c )

9. Code relatif au PC

Utiliser si possible un code relatif au PC (distance d'adresse de 16 bits seulement).

D: move.l zine,label

O: lea    label(pc),a0
    lea    zine(pc),a1
    move.l (a1),(a0)
~
D: move.l a0,hello

O: lea    hello(pc),a1
    move.l a0,(a1)

10. Décalages

Vous pouvez gagner beaucoup de temps processeur en utilisant les différentes commandes de décalage. Voici quelques règles pour les commandes de décalage :
  • Si le nombre de positions de décalage est supérieur à 15, utilisez la commande "swap" et soustrayez 16 du nombre de décalages.
  • Si le nombre est égal ou supérieur à 8, utilisez les décalages avec la constante 8 et soustrayez 8 du nombre de décalages.
  • Si le nombre est un et que vous souhaitez effectuer un décalage vers la gauche, utilisez la commande "add".
Voici quelques exemples :

d0=1  left  --> add.l d0,d0

d0=2  left  --> lsl.l #2,d0

d0=4  left  --> lsl.l #4,d0

d0=8  left  --> lsl.l #8,d0

d0=9  left  --> lsl.l #8,d0
                 add.l d0,d0

d0=10 left  --> lsl.l #8,d0
                 lsl.l #2,d0

d0=16 left  --> swap  d0
                 clr.w d0

d0=24 left  --> swap  d0
                 clr.w d0
                 lsl.l #8,d0

d0=25 left  --> swap  d0
                 clr.w d0
                 lsl.l #8,d0
                 add.l d0,d0

d0= 1 right --> lsr.l #1,d0

d0=16 right --> clr.w d0
                 swap  d0

d0=25 right --> clr.w d0
                 swap  d0
                 lsr.l #8,d0
                 lsr.l #1,d0


[Retour en haut] / [Retour aux articles]