2017-07-05 3 views
1

J'ai besoin de diviser un flottant dans disons st0 par un entier (dans cet exemple 2): Donc, sachez que je peux y parvenir simplement:Diviser un flottant dans l'un des st registres par une constante entière dans l'assemblage

mov rax, 2 
fild rax 
fdivp st1 

, mais est-il une version plus élégante et moins encombrante comme (et je sais que ce qui suit ne fonctionne pas):

fidiv 2 

: S s'il vous plaît laissez-moi savoir aussi s'il est impossible :) merci à avance

+0

Quel assembleur utilisez-vous? – fuz

+1

Notez qu'il n'y a pas d'instruction 'fild rax'. – fuz

Répondre

4

Aucune des instructions x87 ne prend en charge les valeurs immédiates. Ce que vous devez faire est de stocker la constante que vous voulez diviser par dans un emplacement de mémoire, puis le charger en utilisant implicitement un opérande de mémoire:

fdiv DWORD PTR two  ; st0 = st0/2 
    ... 

two REAL4 2.0 

Notez que la division par des constantes peut être accéléré massivement en multipliant avec la réciproque à la place:

fmul DWORD PTR two  ; st0 = st0 * 0.5 = st0/2 
    ... 

two REAL4 0.5 
+1

'fscale' est assez lent si – harold

+0

@harold Les tables d'Agner le confirment! Que suggérez-vous plutôt? – fuz

+1

Je ne peux penser à rien de mieux que de multiplier par la réciproque – harold