Software > Coding
ASM in C einbinden mit Variablenübergabe
tuxie:
Hallo,
bei der Treiberoptimierung möchten wir einige teile als Assemblerroutine auslagern, wie das einbinden so funktioniert weiß ich aber mein Problem ist, wie bekomme ich es hin das ich aus C heraus eine Assemblerroutine aufrufe und dabei Variableninhalte an die Assemblerroutine übergebe.
Und dann quasi das Ergebnis zurückliefert.
Wird mit (VOID) alle Variablen die im Scope sind dem Assembler zur Verfügung gestellt ? Und müssen dann im Assembler Teil mit global definiert werden ?
--- Code: ---MeineFunktion
global MeineFunktion
...
return
--- Ende Code ---
--- Code: ---extern void MeineFunktion(void);
...
int main(void){
...
MeineFunktion(); //Aufruf des Code in Beispiel.asm
...
}
--- Ende Code ---
Für ein paar Tips und Hinweise bin ich dankbar
mfro:
--- Zitat von: tuxie am Mi 16.08.2017, 18:26:37 ---bei der Treiberoptimierung möchten wir einige teile als Assemblerroutine auslagern, wie das einbinden so funktioniert weiß ich aber mein Problem ist, wie bekomme ich es hin das ich aus C heraus eine Assemblerroutine aufrufe und dabei Variableninhalte an die Assemblerroutine übergebe.
...
Für ein paar Tips und Hinweise bin ich dankbar
--- Ende Zitat ---
Tips und Hinweise: gerne. Was Du machen willst ist aber compiler- und assemblerabhängig (und dort wieder unterschiedlich je nach den gewählten Compiler- und Assembleroptionen), da gibt's keine "genormte" Vorgehensweise.
Von welchem Compiler-/Assemblergespann reden wir?
goetz @ 3rz:
--- Zitat von: tuxie am Mi 16.08.2017, 18:26:37 ---bei der Treiberoptimierung möchten wir einige teile als Assemblerroutine auslagern, wie das einbinden so funktioniert weiß ich aber mein Problem ist, wie bekomme ich es hin das ich aus C heraus eine Assemblerroutine aufrufe und dabei Variableninhalte an die Assemblerroutine übergebe.
--- Ende Zitat ---
Wie mfro schon schrieb: kommt darauf an, etwas „kompatibles“ gibt es da erstmal nicht. Du müßtest je nach Produkt auch entscheiden, ob Übergabe über’n Stack oder in Registern, wenn die dir ausreichen.
tuxie:
Ich nutze den gcc cross compiler von Vincent Riviera um den Freemint kernel zu kompilieren. Habe da einen Treiber für unser USB Interface angepasst und diesen wollen wir jetzt optimieren, halt mit Assembler Routinen. Hauptsächlich um Waits die im Treiber eingebaut sind in die Hardware zu verlagern also quasi mit dem CPLD abzubilden. Da wir ein CPLD Register haben, kann man da eventuell auch dinge definieren die dann konfiguriert werden und dafür wollen wr dann halt Assembler Routinen einbauen.
mfro:
--- Zitat von: tuxie am Mi 16.08.2017, 20:08:08 ---Ich nutze den gcc cross compiler von Vincent Riviera um den Freemint kernel zu kompilieren. Habe da einen Treiber für unser USB Interface angepasst und diesen wollen wir jetzt optimieren, halt mit Assembler Routinen. Hauptsächlich um Waits die im Treiber eingebaut sind in die Hardware zu verlagern also quasi mit dem CPLD abzubilden. Da wir ein CPLD Register haben, kann man da eventuell auch dinge definieren die dann konfiguriert werden und dafür wollen wr dann halt Assembler Routinen einbauen.
--- Ende Zitat ---
Mit dem gcc gibt's zwei Möglichkeiten: tatsächlich Funktionen in Assembler implementieren und von C-Funktionen aus aufrufen - oder (möglicherweise für Eure Zwecke besser geeignet): Inline Assembler.
hier gibt's einen ganz brauchbaren Artikel zum Einstieg in das Thema.
Wenn dann noch Fragen sind: nur zu ;). Es gibt da ein paar Stolperfallen (man muß gcc zum Beispiel genau sagen, welche Register man verändert hat).
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln