Question

Je suis nouveau dans le langage assembleur. Il semble que gcc n’a pas la fonction _bittestandset dans intrin.h comme le fait MSVC, j’en ai donc implémenté un nouveau. Celui-ci fonctionne bien sous Linux, mais il ne va pas avec mingw dans la machine WinVista, le code est le suivant:

inline unsigned char _bittestandset(unsigned long * a, unsigned long b)
{
    __asm__ ( "bts %1, %[b]"
          : "=g"(*a)
          : [b]"Ir"(b), "g"(*a) );
    return 0;
}
Était-ce utile?

La solution

Pourriez-vous expliquer davantage ce qui ne fonctionne pas? Peut-être un exemple simple d'utilisation ou autre. Il est difficile de deviner ce qui ne va pas avec le code.

Une chose qui a toujours l'air moche: vous exécutez un opcode de test de bit mais ignorez le résultat. Le bit que vous testez (et définissez) se termine dans l'indicateur de retenue après le code d'opération.

Si vous voulez obtenir le résultat, vous avez besoin d’une instruction supplémentaire pour que l’indicateur de retenue soit reporté dans un autre registre de sortie. (EAB CFF, EAX ou quelque chose comme ça).

Sinon, si vous n'avez pas besoin du résultat, remplacer l'instruction BTS par trois codes d'opérateur plus simples pour l'assembleur est beaucoup moins cher:

Quelque chose dans ce sens:

  ; bit-index in cl
  ; Value in ebx
  ; eax used as a temporary (trashed)
  mov eax, 1
  shl eax, cl
  or  ebx, eax

Etant donné que je n'ai pas encore ma version exacte de votre version exécutant l'assemblage, la sortie d'un simple test-case pourrait nous donner une idée de ce qui ne va pas.

Autres conseils

N'utilisez PAS l'instruction BTS. C'est horriblement lent. Un meilleur moyen serait de le mettre en œuvre en utilisant simplement shift + ou. Et en prime, vous pouvez le faire sans assemblage, en pur C ++ portable.

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