Pergunta

Eu postei este Q para de TI 28xx DSP fórum mas não ouvi uma resposta e percebi que talvez alguém aqui poderia saber.


Eu sei como escrever funções em conjunto para que eles sejam C-exigível; se o nome de C-exigível é foo() então a função de montagem é nomeado _foo().

E se eu quiser usar C ++ e otimizar um método de classe em assembléia? Como faço isso? Eu assumo os únicos grandes questões são:

  • nomear
  • acessando o ponteiro "este"
  • acessando os membros da classe por offsets de alguma forma sabendo

E se eu não quiser se preocupar com os dois últimos, então talvez eu iria escrever uma função de membro estático e fazer isso:

class MyClass
{
  int x;
  static int _doSomething(int u); // implement this in assembly
public:
  inline void doSomething() { x = _doSomething(x); } 
  // lightweight C++ wrapper to handle the class member / "this" pointer stuff
};
Foi útil?

Solução

O ponteiro this é passado como um argumento adicional para a função, usando a convenção de chamada padrão em sua plataforma. Em todas as plataformas que eu estou familiarizado com ele é passado como o primeiro argumento, mas eu não faço um monte de codificação em C ++, então eu não tenho certeza se isso é garantido pela norma. Você sempre pode desmontar algum código C ++ em sua plataforma para confirmar.

O símbolo de nomenclatura C ++ é muito mais dolorosa do que em C, e varia de compilador para compilador. Eu suponho que você poderia descobrir o nome do símbolo direito de uso por desmontar a definição de função compilado, apenas certifique-se de que:. A função é um membro da classe direita, e tem o número certo e tipo de argumentos

A menos que você realmente precisa para reproduzir uma função C ++ in situ, eu provavelmente apenas fazer uma função C padrão e fazer o extern "C" { ... } habitual em torno de sua declaração.

Outras dicas

O seu compilador tem uma sintaxe assembly embutido? Se você tem isso, pode ser a opção mais fácil, e você pode deixar a alça compilador as funções de nomeação e de chamadas peças de sintaxe.

sugestão de escrever o método C ++ como um invólucro inlined em torno de uma chamada "simples" função C Alternativamente, de Stephen é uma boa. (Você provavelmente vai querer fazê-lo apenas uma função simples, não uma função de membro estático como no seu post, para obter uma interface simples C a ele.)

eu iria encontrar a bandeira dependente do compilador e escrever a função de montagem dentro do C ++. Normalmente existem maneiras de referência variáveis ??locais de dentro da seção de montagem.

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