;// Tableau repris de 'Coke Hax':
;//Nom |o | Ko | Mo | Go | To | Po | Eo | Zo | Yo
;// |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;//Position |0 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08
.section .data
pos_depart: .long 1; // position d'unité de départ
pos_finale: .long 3; // position d'unité final
valeur: .long 1024*1024*25; // valeur à convertir
.section .text
unit:
mov pos_depart,%ecx; // charge position finale dans ECX
sub pos_finale,%ecx; // calcul la différence d'exposant (depart-finale) dans ECX
mov $10,%eax; // ajustement en produits de *2^10 (*1024)
mul %ecx; // -> *2^10
mov %eax,%ecx; // on remet le resultat dans ECX pour faire des décalages de bits
cmp $0,%ecx; // le resultat de mul et de mov ne permettent pas tester SF.
jl diviser; // si c'est négatif, il faut diviser par un multiple de 2
multiplier: // si c'est positif, il faut multplier par un multiple de 2
sall %cl,valeur; // on multiplie EDX par 2^CL (CL=LSB de ECX ce qui largement suffisant)
jmp fin; // on saute la division
diviser: //
neg %ecx; // on ramene ECX positif
sarl %cl,valeur; // on divise EDX par 2^CL (CL=LSB de ECX ce qui largement suffisant)
fin: // Fin du programme, EDX contient le résultat ...