Question

Ceci est ma première tentative à l'aide d'assemblée et je suis juste essayer d'utiliser l'Architecture Intel instruction FABS.(Référencement ce document sur la page 399).

C'est simplement censé effacer le bit de signe.

Le peu que je sais à propos de l'assemblage implique sources et destinations, mais je ne vois aucune référence à la notation pour cette instruction.

Ci-dessous est l'un de mes tentatives d'utilisation (à l'aide de Visual studio 2012, C++):

double myabs(double x){
  __asm(fabs(x));
return x;
}

Cette tentative de donner à l'erreur C2400:assembleur en ligne erreur de syntaxe dans "opcode';trouvé '('


Veuillez noter que je veux utiliser l'instruction de montage et ne suis pas intéressé par les autres / "mieux" options qui sont disponibles.

Était-ce utile?

La solution

Plusieurs pointeurs:La première vous utilisez gcc style inline assemblée, dans le MME style que vous pourriez utiliser -

__asm{ ... }

Deuxième instructions ne sont pas des fonctions, de sorte que la parenthèse il y a aussi des mauvais.

Le dernier mais le plus important - fabs ne prend pas un argument, ça fonctionne, tout simplement sur le haut de la FP de la pile.Vous avez besoin de charger explicitement votre variable en premier.Essayez ceci:

__asm {
    fld x
    fabs
    fstp x
}

De toute façon, à l'aide de vieux x87 instructions est probablement pas une bonne chose, c'est probablement tout à fait inefficace - vous devriez envisager de passer à un ESS solution, consultez - Comment absolue 2 lit double ou 4 flotteurs en utilisant jeu d'instructions SSE?(Jusqu'à SSE4)

Autres conseils

Avec VC++, vous ne placez pas la langue de l'assembly entre parenthèses.Syntaxe correcte serait plus du genre:

__asm fabs

ou:

__asm { 
    fabs
    // possibly more instructions here
}

Dans votre cas particulier, vous voudrez probablement quelque chose comme:

__asm { 
    fload x // load x onto F.P. stack
    fabs    // take absolute value
    fstp x  // store back to x and pop from F.P. stack.
}

Aussi loin que la source et la destination d'aller, à virgule flottante sur un système x86 utilise une pile.Sauf indication contraire, la plupart des instructions (autres que les load/store) prendre des opérandes à partir du haut de la pile et le dépôt des résultats sur le haut de la pile ainsi.Par exemple, avec aucun opérande donné, fabs va prendre la valeur absolue de l'opérande en haut de la virgule flottante de la pile et de dépôt le résultat revient au même endroit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top