Frage

Ich bin neu in Assemblersprache. Es scheint, dass gcc nicht _bittestandset Funktion in intrin.h hat wie MSVC tut, so implementiert ich ein neues. Dies funktioniert gut unter Linux, aber es schief geht mit mingw in WINVISTA Maschine, ist der Code:

inline unsigned char _bittestandset(unsigned long * a, unsigned long b)
{
    __asm__ ( "bts %1, %[b]"
          : "=g"(*a)
          : [b]"Ir"(b), "g"(*a) );
    return 0;
}
War es hilfreich?

Lösung

Könnten Sie einige weitere Erklärung geben was nicht funktioniert? Vielleicht ein einfaches Beispiel für die Nutzung oder so. Es ist schwer zu erraten, was mit dem Code falsch ..

Eine Sache, die käsigen sieht so weit: Sie etwas Test Opcode auszuführen, aber das Ergebnis ignorieren. Das Bit, das Sie testen (und eingestellt) endet in dem Carry-Flag nach dem Opcode auf.

Wenn Sie das Ergebnis benötigen Sie eine zusätzliche Anweisung erhalten mögen den Carry-Flag in ein anderen Ausgangsregister zu bekommen. (SBB EAX, EAX oder so ähnlich).

Ansonsten - wenn Sie das Ergebnis nicht brauchen - es ist viel billiger die BTS Anweisung mit drei einfacheren Assembler Opcodes zu ersetzen:

Etwas in diese Richtung:

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

Da ich mingw nicht mit Ihrer genauen Version eine Montage-Ausgabe eines einfachen Testfalls laufen könnte uns einen Hinweis geben, was falsch läuft.

Andere Tipps

Sie NICHT die BTS Anweisung verwenden. Es ist schrecklich langsam. Eine bessere Möglichkeit wäre, es zu implementieren mit einfacher shift + oder. Und als Bonus, können Sie es tun, ohne Montage, in der reinen, portable C ++.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top