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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top