Como usar a instrução IA32 'fabs' no VS c++?
-
21-12-2019 - |
Pergunta
Esta é minha primeira tentativa de usar assembly e estou apenas tentando usar as instruções da arquitetura Intel FABS
.(Referência esse documento na página 399).
Isto é simplesmente suposto para limpar o bit de sinal.
O pouco que sei sobre montagem envolve fontes e destinos, mas não estou vendo nenhuma referência à notação desta instrução.
Abaixo está uma das minhas tentativas de usá-lo (usando Visual Studio 2012, C++):
double myabs(double x){
__asm(fabs(x));
return x;
}
Esta tentativa específica fornece o erro C2400:erro de sintaxe do assembler embutido em 'opcode';encontrado '('
Observe que desejo usar as instruções de montagem e não estou interessado em outras opções/"melhores" disponíveis.
Solução
Várias dicas:Primeiro - você está usando o assembly embutido no estilo gcc, no estilo MS você poderia usar -
__asm{ ... }
Segundo - as instruções não são funções, então os parênteses também estão errados.
Por último, mas mais importante - fabs
não aceita argumentos, apenas funciona no topo da pilha FP.Você precisa carregar explicitamente sua variável primeiro.Experimente isto:
__asm {
fld x
fabs
fstp x
}
De qualquer forma, usar instruções x87 antigas provavelmente não é uma coisa boa, provavelmente é bastante ineficiente - você deve considerar mudar para uma solução SSE, consulte - Como absoluto 2 duplos ou 4 carros alegóricos usando o conjunto de instruções SSE?(Até SSE4)
Outras dicas
Com VC++, você não coloca a linguagem assembly entre parênteses.A sintaxe correta seria mais parecida com:
__asm fabs
ou:
__asm {
fabs
// possibly more instructions here
}
No seu caso específico, você provavelmente desejaria 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.
}
No que diz respeito à origem e ao destino, o ponto flutuante em um x86 usa uma pilha.A menos que você especifique o contrário, a maioria das instruções (exceto load/store) pega operandos do topo da pilha e deposita os resultados no topo da pilha também.Por exemplo, sem nenhum operando fornecido, fabs
pegará o valor absoluto do operando no topo da pilha de ponto flutuante e depositará o resultado de volta no mesmo lugar.