Pregunta

Soy nuevo en lenguaje ensamblador. Parece que gcc no tiene la función _bittestandset en intrin.h como MSVC, así que implementé una nueva. Este funciona bien en Linux, pero funciona mal con mingw en la máquina winVista, el código es:

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

Solución

¿Podría dar una explicación más detallada de lo que no funciona? Tal vez un ejemplo simple del uso o algo así. Es difícil adivinar qué tiene de malo el código ...

Una cosa que parece cursi hasta ahora: ejecutas un código de operación de prueba de bits pero ignoras el resultado. El bit que prueba (y configura) termina en el indicador de acarreo después del código de operación.

Si desea obtener el resultado, necesita una instrucción adicional para obtener el indicador de acarreo en algún otro registro de salida. (SBB EAX, EAX o algo así).

De lo contrario, si no necesita el resultado, es mucho más barato reemplazar la instrucción BTS con tres códigos de operación de ensamblador más simples:

Algo a lo largo de estas líneas:

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

Como no tengo problemas con su versión exacta, ejecutar una salida de ensamblaje de un simple testcase podría darnos alguna pista de lo que está mal.

Otros consejos

NO utilice la instrucción BTS. Es terriblemente lento. Una mejor manera sería implementarlo usando simple shift + o. Y como beneficio adicional, puede hacerlo sin ningún tipo de ensamblaje, en C ++ puro y portátil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top