Outils pour utilisateurs

Outils du site


back2root:tutoriaux:assembler-tips

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
back2root:tutoriaux:assembler-tips [2024/11/12 11:11] – créée fraterback2root:tutoriaux:assembler-tips [2024/11/12 14:40] (Version actuelle) frater
Ligne 1: Ligne 1:
 ====== Assembler tips ====== ====== Assembler tips ======
 +
 +===== Remplacer MUL par du bit-shift (SHDL) =====
 +
 +Quand on fait des démos, il arrive souvent que l'on doive multiplier les y par la taille d'une ligne et ensuite d'y ajouter la valeur de x.
 +
 +<code c>
 +  int offset = (320*y)+x;
 +</code>
 +
 +ce qui se traduit en assembleur par quelque chose du genre:
 +
 +<code asm>
 +        ;              Cycles : 386 | 486
 +        mov    ax,[y]         ;  4  |  1
 +        mov    bx,320         ;  2  |  1
 +        mul    bx             ; 22  | 26
 +        add    ax,[x]         ;  6  |  1
 +        ;               Total = 34  | 29
 +</code>
 +
 +sauf que... cela prends du temps:
 +
 +Si, sur un 386, un [[back2root:ibm-pc-ms-dos:instr:mov|mov]] prends relativement peu de temps (~ 4 cycles d'horloge) et un [[back2root:ibm-pc-ms-dos:instr:add|add]] (~2 cycles), un [[back2root:ibm-pc-ms-dos:instr:mul|mul]] est BEAUCOUP plus couteux (jusqu'à 22 cycles sur un 386sx).
 +
 +on le voit, le 486 est plus optimisé pour les fonctions [[back2root:ibm-pc-ms-dos:instr:mov|mov]] et [[back2root:ibm-pc-ms-dos:instr:add|add]], mais le [[back2root:ibm-pc-ms-dos:instr:mul|mul]] est encore plus lourd; heureusement que les 486 sont généralement plus rapide que les 386.
 +
 +alors qu'un 386 dispose d'instructions simples mais puissantes [[back2root:ibm-pc-ms-dos:instr:shld-shrd|shld]]/[[back2root:ibm-pc-ms-dos:instr:shld-shrd|shrd]] qui ne demandent que 3 cycles pour s'executer.
 +
 +on peut donc ré-écrire le code 'c':
 +
 +<code c>
 +  int offset = (y<<6)+(y<<8)+x;
 +</code>
 +
 +le code précédent peut donc s'écrire:
 +
 +<code asm>
 +        ;              Cycles : 386 | 486
 +        mov    ax,[y]         ;  4  |  1
 +        mov    bx,ax          ;  2  |  1
 +        xor    dx,dx          ;  2  |  1
 +        shld   ax,dx,       ;  3  |  2
 +        shld   bx,dx,       ;  3  |  2 
 +        add    ax,bx          ;  3  |  1 
 +        add    ax,[x]         ;  6  |  2
 +        ;               Total = 21  | 10
 +</code>
 +
 +on "gagne" presque 40% du temps sur un 386, et 65% sur un 486; ce sont des gains énormes, surtout quand on calcule la position (offset) de centaines de points par frame.
 +
 +si vous désirez, avoir une résolution différentes, et tant que vous êtes en chained mode (càd que un octet représente un point directement dans la mémoire), vous pouvez utiliser cette fonction; il faut "juste" adapter les shift values:
 +
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  mul  ^ bitshift       ^
 +|  80   | (y<<6)+(y<<4)  |
 +|  320  | (y<<6)+(y<<8)  |
 +|  640  | (y<<9)+(y<<7)  |
  
  
 <nspages back2root/tutoriaux -simpleList -h1 -exclude:start -textPages="Tutoriaux disponible"> <nspages back2root/tutoriaux -simpleList -h1 -exclude:start -textPages="Tutoriaux disponible">
back2root/tutoriaux/assembler-tips.1731406302.txt.gz · Dernière modification : 2024/11/12 11:11 de frater