Domanda

ho postato questo Q per 28XX forum DSP di TI , ma non hanno sentito una risposta e capito forse qualcuno qui potrebbe sapere.


Io so come scrivere le funzioni in assemblea in modo che siano C-callable; se il nome di C-callable viene foo() quindi la funzione di montaggio è chiamato _foo().

Che cosa succede se voglio utilizzare C ++ e ottimizzare un metodo di classe in assemblea? Come lo faccio? Presumo le uniche questioni principali sono:

  • denominazione
  • accesso al puntatore "this"
  • l'accesso ai membri della classe da offset in qualche modo, sapendo

e se io non voglio preoccupare gli ultimi due, allora forse avrei scritto una funzione membro statica e fare questo:

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
};
È stato utile?

Soluzione

Il puntatore this viene passato come argomento aggiuntivo per la funzione, utilizzando lo standard convenzione di chiamata sulla propria piattaforma. Su tutte le piattaforme ho familiarità con esso viene passato come primo argomento, ma non faccio un sacco di C ++ codifica, quindi non sono sicuro se questo è garantito dalla norma. È sempre possibile disassemblare codice C ++ sulla piattaforma per confermare.

La denominazione C ++ simbolo è molto più doloroso che in C, e varia da compilatore a compilatore. Suppongo che si possa capire il nome del simbolo diritto di utilizzare smontando una definizione di funzione compilata, basta assicurarsi che:. La funzione è un membro della classe a destra, e ha il giusto numero e il tipo di argomenti

A meno che non si ha realmente bisogno di riprodurre una funzione C ++ in situ, probabilmente solo fare una funzione standard C ed eseguire la solita extern "C" { ... } intorno alla sua dichiarazione.

Altri suggerimenti

Il tuo compilatore ha una sintassi assembly inline? Se si dispone che, può essere l'opzione più semplice, e si può lasciare che il compilatore di gestire la funzione di denominazione e chiamare pezzi di sintassi.

In alternativa, il suggerimento di Stefano di scrivere il metodo C ++ come un involucro inline intorno ad una chiamata di funzione C "semplice" è un buon compromesso. (Probabilmente si vuole fare solo una funzione semplice, non una funzione di membro static come nel tuo post, per ottenere una semplice interfaccia C ad esso.)

avrei trovato la bandiera compilatore-dipendente e scrivere l'assemblaggio all'interno della funzione C ++. Di solito ci sono modi per fare riferimento variabili locali all'interno della sezione di montaggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top