Pregunta

Este es mi primer intento de usar el ensamblador y solo estoy intentando usar las instrucciones de Arquitectura Intel. FABS.(Haciendo referencia este documento en la página 399).

Se supone que esto simplemente borra el bit de signo.

Lo poco que sé sobre el ensamblaje involucra fuentes y destinos, pero no veo ninguna referencia a la notación de esta instrucción.

A continuación se muestra uno de mis intentos de usarlo (usando Visual Studio 2012, C++):

double myabs(double x){
  __asm(fabs(x));
return x;
}

Este intento en particular da el error C2400:error de sintaxis del ensamblador en línea en 'código de operación';encontró '('


Tenga en cuenta que quiero utilizar las instrucciones de ensamblaje y no estoy interesado en otras opciones "mejores" disponibles.

¿Fue útil?

Solución

Varios punteros: primero: está utilizando el ensamblaje en línea de estilo GCC, en MS Style podría usar -

__asm{ ... }

Segundo - Las instrucciones no son funciones, por lo que el paréntesis también está mal.

Por último, pero lo más importante: fabs no toma un argumento, simplemente funciona en la parte superior de la pila FP.Necesita cargar explícitamente su variable allí primero.Prueba esto:

__asm {
    fld x
    fabs
    fstp x
}

De todos modos, el uso de las instrucciones antiguas X87, probablemente no es algo bueno, es probable que sea bastante ineficiente, debe considerar cambiar a una solución SSE, consulte - ¿Cómo absoluto 2 flotadores dobles o 4 usando el conjunto de instrucciones de SSE?(Hasta SSE4)

Otros consejos

Con VC ++, no encierra el lenguaje de ensamblaje entre paréntesis.La sintaxis correcta sería más como:

__asm fabs

o:

__asm { 
    fabs
    // possibly more instructions here
}

En su caso específico, probablemente querrá algo como:

__asm { 
    fload x // load x onto F.P. stack
    fabs    // take absolute value
    fstp x  // store back to x and pop from F.P. stack.
}

En cuanto a la fuente y el destino, el punto flotante en un X86 usa una pila.A menos que especifique lo contrario, la mayoría de las instrucciones (excepto la carga / tienda) toman los operandos desde la parte superior de la pila y los resultados del depósito también en la parte superior de la pila.Por ejemplo, sin operando dado, fabs se llevará el valor absoluto del operando en la parte superior de la pila de puntos flotantes y depositará el resultado de nuevo en el mismo lugar.

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