Domanda

Sono nuovo nel linguaggio assembly. Sembra che gcc non abbia la funzione _bittestandset in intrin.h come MSVC, quindi ne ho implementato uno nuovo. Questo funziona bene in Linux, ma va male con Mingw nella macchina WinVista, il codice è:

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

Soluzione

Potresti dare qualche ulteriore spiegazione cosa non funziona? Forse un semplice esempio dell'uso o giù di lì. È difficile indovinare cosa c'è che non va nel codice ..

Una cosa che sembra di cattivo gusto finora: esegui un codice operativo bit-test ma ignori il risultato. Il bit testato (e impostato) finisce nella bandiera carry dopo il codice operativo.

Se si desidera ottenere il risultato è necessaria un'istruzione aggiuntiva per inserire il flag carry in qualche altro registro di output. (FFS EAX, EAX o qualcosa del genere).

Altrimenti, se non hai bisogno del risultato, è molto più economico sostituire l'istruzione BTS con tre opcode di assemblaggio più semplici:

Qualcosa del genere:

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

Dal momento che non ho alcuna relazione con la tua versione esatta in esecuzione un output di assemblaggio di una semplice testcase potrebbe darci qualche indizio su cosa non va.

Altri suggerimenti

NON utilizzare l'istruzione BTS. È terribilmente lento. Un modo migliore sarebbe implementarlo usando semplicemente shift + o. E come bonus, puoi farlo senza alcun assemblaggio, in C ++ puro e portatile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top