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

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
back2root:tutoriaux:assembler-tips [2024/11/12 11:38] 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 =====+===== 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. 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.
Ligne 12: Ligne 12:
  
 <code asm> <code asm>
-        ;        Cycles  : 386 | 486 +        ;              Cycles : 386 | 486 
-        mov    ax,[y]    ;  4  |  1 +        mov    ax,[y]         ;  4  |  1 
-        mov    bx,320    ;  2  |  1 +        mov    bx,320         ;  2  |  1 
-        mul    bx               ; 22  | 26 +        mul    bx             ; 22  | 26 
-        add    ax,[x]           ;  6  |  1 +        add    ax,[x]         ;  6  |  1 
-        ;               Total     34  | 29+        ;               Total 34  | 29
 </code> </code>
  
Ligne 26: Ligne 26:
 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. 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 simple [[back2root:ibm-pc-ms-dos:instr:shr|shr]]/[[back2root:ibm-pc-ms-dos:instr:sal-shl|shl]]ne demande "que" 9 cycles.+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 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: le code précédent peut donc s'écrire:
  
 <code asm> <code asm>
-                         ; cycles +                     Cycles : 386 | 486 
-        ; code           ; 386 | 486 +        mov    ax,[y]         ;  4  |  1 
-        mov    ax,[y] +        mov    bx,ax          ;  2  |  1 
-        mov    bx,ax +        xor    dx,dx          ;  2  |  1 
-        shr    ax,+        shld   ax,dx,6        ;  3  |  2 
-        shr    bx,8 +        shld   bx,dx,8        ;  3  |  2  
-        add    ax,bx +        add    ax,bx          ;  3  |  1  
-        add    ax,[x]+        add    ax,[x]         ;  6  |  2 
 +        ;               Total = 21  | 10
 </code> </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.1731407902.txt.gz · Dernière modification : 2024/11/12 11:38 de frater