salut @ tous,
comment faire cette division:
merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part 7.5/2
salut @ tous,
comment faire cette division:
merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part 7.5/2
Bonjour,
en fait sur les x86 il existe deux unités de calcul, l'ALU (Arithmetic-logic unit ) qui sert au calcul sur les entiers et le FPU (Floating point unit) qui sert au calcul sur les réels.
Pour utiliser le FPU il faut faire appel au coprocesseur sur les anciens processeurs de la gamme x86 (comme le 8087). Sur les nouveaux (à partir du 486 [à vérifier, c'est peut être antérieur, je ne me rapelle plus]), le coprocesseur est dans la même unité.
voilà un bout de code pour 486 (syntaxe MASM) :
Il existe plusieurs formes pour FIDIV, ici j'utilise la forme "FIDIV mem32" ou mem32 est une adresse mémoire pointant sur le nombre entier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 .486 .model flat, stdcall ;modele mémoire 32 bits option casemap :none ;sensible à la casse .data nombre1 REAL4 7.5 ; réel codé sur 4 bytes nombre2 DWORD 2 ; entier codé sur 4 bytes .code start: finit ; initialise le coprocesseur arithmétique fld nombre1 ; charge le réel sur le FPU (st0) lea ebx, nombre2 ; ebx = adresse de nombre2 fidiv dword ptr [ebx] ; division d'un réel par un entier end start
Une fois FIDIV exécutée, st0 (le registre du haut de la pile FPU) contient 3.75 codé au format IEEE754. (en hexadécimal, double précision : 4000 F0000000 00000000 )
Pour plus d'info sur ce format voir http://en.wikipedia.org/wiki/IEEE_754
J'espère que ca répond à la question
La question est légèrement floue :
comment faire cette division:
Code :
7.5/2
tu précises diviser un réel...
Donc deux solutions : (syntaxe RosAsm)
Soit tu codes en dur car il est question de constante (j'imagine que non... quand-même ) -> [MaVarReel: R$ 3.75]
Soit effectivement, la fpu en vérifiant que tu rends la pile en état :
Pour un float et en utilisant la pile pour compléter ce que Neitsa t'a indiqué :
R$MaVarRell contient 3.75 au format réel et eax la valeur arrondie integer (selon la forme d'arrondi demandé à la FPU).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 [MaVarReel: R$ 7.5] push 2 fld R$MaVarReel | fidiv D$esp | fist D$esp | fstp R$MaVarReel pop eax
La forme peu paraître compliquée dans un premier temps mais tu verras que c'est très utile pour le chargement de constantes temporaires sans déclarations préalables comme dans l’exemple bourrin suivant. De plus, dans certains cas, tu peux vouloir récupérer dans un registre un contenu du lifo fpu.
fld1 fldz etc. permettent cependant de charger quelques constantes mais pas de fld2... désolé.
- fst retire un contenu du lifo
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 [MaVarReel: R$ 7.5 ;(attention à l'alignement QWORD) MaConstanteFloat2: F$ 2 ] ;(attention à l'alignement DWORD fld R$MaVarReel fdiv F$MaConstanteFloat2 fstp R$MaVarReel
- fstp idem mais pop le lifo
Tu peux aussi, si le contenu ne t'intéresse pas utiliser fstp ST0
voilivoilo
@+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager