2009-03-08 7 views
0

Ich bin neu in der Assemblersprache. Es scheint, dass gcc in intrin.h keine _bittestandset Funktion hat wie MSVC, also habe ich eine neue implementiert. Dieser funktioniert unter Linux in Ordnung, aber es schief geht mit mingw in WINVISTA Maschine, der Code ist:Was ist falsch mit meiner Version von _bittestandset

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

Antwort

3

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

Eine Sache, die bisher kitschig aussieht: Sie führen einen Bit-Test-Opcode aus, ignorieren aber das Ergebnis. Das Bit, das Sie testen (und setzen), endet nach dem Opcode im Übertrags-Flag.

Wenn Sie das Ergebnis erhalten möchten, benötigen Sie eine zusätzliche Anweisung, um das Übertrags-Flag in ein anderes Ausgangsregister zu bekommen. (SBB EAX, EAX oder so).

Andernfalls - 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 dies nicht tun Haben Sie mit Ihrer exakten Version zu tun, die eine Assemblerausgabe eines einfachen Testfalls ausführt, könnte uns einen Hinweis geben, was falsch läuft.

-1

Verwenden Sie NICHT die BTS-Anweisung. Es ist schrecklich langsam. Ein besserer Weg wäre, es mit einfachen Shift + oder zu implementieren. Und als Bonus können Sie es ohne Assembly in reinem, portablem C++ machen.

Verwandte Themen