Come utilizzare IA32 Istruzioni "Fabs" in VS C ++?
-
21-12-2019 - |
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.
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.