begin process at 2012 05 25 04:16:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Assembleur

 > 

Archives

 > 

c, c++ et asm

 > 

FPU et puissance d'un nombre


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

FPU et puissance d'un nombre

samedi 19 mars 2005 à 09:07:41 | FPU et puissance d'un nombre

AlexMAN

Membre Club
Bonjour,

Voila, j'ai 'codé' 2 fonctions permettant de calculer un nombre n a une puissance exp (la fonction est bourrin, cad pas de decoupages de la fonction selon que le nombre soit pair ou impair..), une en ASM avec les instructions du CPU, et une autre avec les instructions de la FPU (celle dont j'ai vraiment besoin, pour certaines raisons..).
Et j'ai donc décidé de comparer la vitesse des 2fonctions, et la reponse est sans appel : Cpu plus rapide que Fpu (Avec mes fonctions a moi !).
Donc j'aimerais savoir comment 'optimiser' la fonction FPU ci dessous :

__declspec(naked) int __stdcall PuissFPU(int n, int exp)

{

__asm {

mov eax, [esp + 8] //eax == exp

fild [esp + 4] //empile n, ST(1) == n

fild [esp + 4] //empile n, ST(0) == n, Contiendra le resultat

sub eax, 1

Deb:

fmul ST, ST(1)

sub eax, 1

test eax, eax

jne Deb

sub esp, 4

fist dword ptr[esp]

mov eax, [esp]

add esp, 4

ret 8

}

}

__declspec(naked) int __stdcall Puiss(int n, int exp)

{

__asm {

mov ecx, [esp + 4]

mov edx, [esp + 8]

mov eax, ecx

sub edx, 1

Deb:

imul eax, ecx

sub edx, 1

test edx, edx

jne Deb

ret 8

}

}

Voila, merci d'avance a tous ;)
Amicalement, Alex

+2(p - n)
samedi 19 mars 2005 à 12:04:55 | Re : FPU et puissance d'un nombre

BruNews

Administrateur CodeS-SourceS
Dans tous les cas il est normal que par FPU soit plus lent qu'avec les 3 registres généraux.
Tu peux gagner un peu en passant les params en registres.
Inutile de déplacer ESP en sortie, c'est trop couteux, surtout si tu indexes sur lui l'instruction suivante.

__declspec(naked) int __fastcall PuissFPU(int n, DWORD exp)
{ // ECX = n, EDX = exp
  __asm {
    mov     [esp-4], ecx  ; n
    dec     edx
    jle     short puissExit
    fild    dword ptr[esp-4]
    fld     st(0)
  boucle:
    fmul    st(0), st(1)
    dec     edx
    jne     short boucle
    fistp   dword ptr[esp-4]
    fstp    st(0)
puissExit:
    mov     eax, [esp-4]
    ret     0
  }
}

Je n'ai pas mesuré, je te laisse faire, pas le temps.
Si exp <= 1, je retourne n, c'est pas très orthodoxe, tu adapteras selon besoin.

ciao...
BruNews, MVP VC++
samedi 19 mars 2005 à 12:44:53 | Re : FPU et puissance d'un nombre

AlexMAN

Membre Club
En fait, je ne veux pas passer toucher aux registres generaux, c'est ca la raison qui m'a poussé a utiliser le FPU...Parce que dans ma fonction appellante, je dois conserver la valeur presente dans ces registres, donc pas de __fastcall...Donc ca me rassure, merci ;)
Puis ce que je te tiens, je veux decomposer un nombre en tous ses chiffres et partie de ses chiffres de taille egale :

1634 => Soit 1, 6, 3, 4 soit 16, 34
100  => 1, 0, 0

J'utilise pour cela le reste de la division entiere par 10^x mais bien sur, c'est une division et c'est lent, donc je me demandais s'il n'existait pas une maniere de coder ca en deplacant des bits ou un truc plus rapide.

Merci Brunews
A bientot

+2(p - n)
samedi 19 mars 2005 à 12:55:46 | Re : FPU et puissance d'un nombre

BruNews

Administrateur CodeS-SourceS
mais non, une division par une constante, 10 ici, se fait par multiplication, va voir bnultoa dans mes sources.

ciao...
BruNews, MVP VC++
samedi 19 mars 2005 à 12:59:32 | Re : FPU et puissance d'un nombre

BruNews

Administrateur CodeS-SourceS
Je viens de t'envoyer ReciDiv.zip qui te donnera le code asm suivant le diviseur indiqué.

ciao...
BruNews, MVP VC++


Cette discussion est classée dans : int, mov, eax, esp, fpu


Répondre à ce message

Sujets en rapport avec ce message

Assembleur et tableau + linux + bof [ par flocic ] Bonjour, J'ai un petit pb de comprehension, j'ai un programme qui deborde au bout 44 octet  à cause d'un depassement d ela taille du tableau. Mais ce Petit problème pour comparer (cmp) [ par smok1360 ] Bonjour à tous,Pour commencer, j'espère de ne pas avoir choisis le mauvais lieu pour poster, j'ai un petit peu hésité Donc, j'ai décidé d'apprendre l' AT&T erreur de compilation etc... [ par maminovadu75 ] Bonjour, j'aimerais me mettre a l'assembleur mais j'ai quelque problème.voici mon code morceau de code pour trier un tableau de int : ( mélange de C/C conversion en syntaxe intel [ par marooh ] bonjour, j'ai un code écrit en syntaxe at&t et je veux le rendre en syntaxe intel.si vous pouvez bien m'aider... voici le code Project title : m Proj Resultat de la vitesse des : Registre, instruction, calcul, et mémoire ! ! ! [ par rebixav ] Voici la liste que j'ai créé : asm : ( inc ) = 0.065 asm : ( and ) = 0.08 asm : ( or ) = 0.08 asm : ( xor ) = 0.08 asm : ( not ) Saisie & Calcul de sa taille de caractère en tasm [ par baz13shaz ] je veut saisir une chaine de caractère & calculer sa taille,et je veut charger la chaine saisie en mémoire centrale? que doit je faire? comment je peu un énorme travail de votre part [ par mana ] bonjour, voici un programme écrit en c++ (il permet de passer d'une image en couleur 24bits(ARGB) a une image en 256 niveaux de gris(toujours sur 24bi tasm [ par yosrasouaifi ] DOSSEG ;Modele de segmentation DOS .MODEL SMALL ;Fixe le modele de segmentation :petit modele .STACK 100h .DATA mes afficher la somme de 2 entiers superieur à 9 [ par Benh_m ] Bonjour à tous ! Alors voila, j'ai un devoir en Assembleur à faire et j'ai un problème : je dois faire la somme de deux entiers, jusque la tout va bi Voir si un caractère est dans une chaine [ par Wayth ] Bonsoir, Je viens sur votre forum car je n'arrive pas à trouver un label fonctionnel pour voir si un caractère se trouve ou non dans une chaîne de ca


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,087 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales