Domanda

Questo è il mio primo tentativo di usare l'assemblaggio e sto solo cercando di utilizzare l'istruzione Intel Architecture FABS.(Riferimento Questo documento a pagina 399).

Questo dovrebbe semplicemente cancellare il bit del segno.

Il piccolo che conosco il montaggio coinvolge fonti e destinazioni ma non vedo alcun riferimento alla notazione per questa istruzione.

Di seguito è riportato uno dei miei tentativi di utilizzo (utilizzando Visual Studio 2012, C ++):

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


.

Questo particolare tentativo conferisce all'errore C2400: errore di sintassi delline assemblatore in 'opcode';trovato '('


.

Si prega di notare che voglio utilizzare le istruzioni di assemblaggio e non sono interessato ad altre opzioni / "migliori" disponibili.

È stato utile?

Soluzione

Diversi Puntatori: Innanzitutto - Stai utilizzando Assembly in linea Style GCC, in MS Style puoi usare -

__asm{ ... }
.

Second - Le istruzioni non sono funzioni, quindi la parentesi ci sono anche sbagliate.

Ultimo ma più importante - fabs non prende un argomento, funziona solo sulla parte superiore della pila FP.È necessario caricare esplicitamente la tua variabile lì prima.Prova questo:

__asm {
    fld x
    fabs
    fstp x
}
.

Comunque, usando le vecchie istruzioni X87 non è probabilmente una buona cosa, è probabilmente abbastanza inefficiente - dovresti prendere in considerazione il passaggio a una soluzione SSE, vedere - Come assolutamente 2 Double o 4 Gloats tramite set di istruzioni SSE?(Fino a SSE4)

Altri suggerimenti

Con VC ++, non alleggi la lingua di assemblaggio tra parentesi.La sintassi corretta sarebbe più simile a:

__asm fabs
.

o:

__asm { 
    fabs
    // possibly more instructions here
}
.

Nel tuo caso specifico, probabilmente vorresti qualcosa come:

__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.
}
.

Per quanto riguarda la fonte e la destinazione, il punto di galleggiamento su un X86 utilizza una pila.A meno che non si specifichi diversamente, la maggior parte delle istruzioni (diverse da caricare / archivio) prendi gli operandi dalla parte superiore della pila e dei risultati dei depositi sulla parte superiore della pila.Ad esempio, senza operando dato, fabs prenderà il valore assoluto dell'operando nella parte superiore della pila del punto flottante e depositerà il risultato nello stesso posto.

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