Pergunta

Eu sou novo para a linguagem assembly. Parece que gcc não tem _bittestandset função em intrin.h como MSVC faz, então eu implementado um novo. Este funciona muito bem em linux, mas vai errado com mingw na máquina WinVista, o código é a seguinte:

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

Solução

Você poderia dar alguma explicação adicional que não está funcionando? Talvez um exemplo simples do uso ou assim. É difícil adivinhar o que está errado com o código ..

Uma coisa que a aparência de queijo até agora: Você executar um código de operação-teste pouco, mas ignorar o resultado. O pouco que você teste (e definido) acaba no flag de carry após o código de operação.

Se você deseja obter o resultado que você precisa uma instrução adicional para obter o flag carry em algum outro registo de saída. (SBB EAX, EAX ou algo parecido).

Caso contrário - se você não precisa o resultado - é muito mais barato para substituir a instrução BTS com três opcodes assembler simples:

Algo ao longo destas linhas:

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

Uma vez que eu não tenho mingw com a sua versão exata executando uma montagem de saída de um testcase simples poderia nos dar alguma idéia do que está acontecendo de errado.

Outras dicas

NÃO use a instrução BTS. É terrivelmente lento. A melhor maneira seria para implementá-lo usando simples mudança + ou. E como um bônus, você pode fazê-lo sem qualquer montagem, em puro, C ++ portátil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top