TI DSP: interface C ++ e montagem
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
};
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.