Autor Thema: ASM in C einbinden mit Variablenübergabe  (Gelesen 262 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline tuxie

  • Benutzer
  • Beiträge: 5.815
  • Falcon! Milan! Schuetzt die Raubvoegel!
    • tuxie.de
ASM in C einbinden mit Variablenübergabe
« am: Mi 16.08.2017, 18:26:37 »
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 ?

MeineFunktion
   global MeineFunktion
   ...
   return

extern void MeineFunktion(void);

...

int main(void){
   ...
   MeineFunktion();   //Aufruf des Code in Beispiel.asm
   ...
}

Für ein paar Tips und Hinweise bin ich dankbar
Tschau Ingo


PC Intel i7 4820, 16gb quad @2400,Mac OS X El Capitan
http://tuxie.de http://hwbot.org/user/tuxie/

Offline mfro

  • Benutzer
  • Beiträge: 929
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #1 am: Mi 16.08.2017, 19:13:56 »
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

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?

Offline gh-baden

  • Benutzer
  • Beiträge: 513
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #2 am: Mi 16.08.2017, 19:31:02 »
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.

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.
Wider dem Signaturspam!

Offline tuxie

  • Benutzer
  • Beiträge: 5.815
  • Falcon! Milan! Schuetzt die Raubvoegel!
    • tuxie.de
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #3 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.
Tschau Ingo


PC Intel i7 4820, 16gb quad @2400,Mac OS X El Capitan
http://tuxie.de http://hwbot.org/user/tuxie/

Offline mfro

  • Benutzer
  • Beiträge: 929
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #4 am: Mi 16.08.2017, 20:14:05 »
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.

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).
« Letzte Änderung: Mi 16.08.2017, 20:15:41 von mfro »

Offline gh-baden

  • Benutzer
  • Beiträge: 513
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #5 am: Mi 16.08.2017, 20:43:18 »
Ich nutze den gcc cross compiler von Vincent Riviera um den Freemint kernel zu kompilieren

https://www.google.de/search?client=safari&rls=en&q=gcc+inline+68k+assembler&ie=UTF-8&oe=UTF-8&gfe_rd=cr&ei=2ZGUWYDGG63c8AeM3YuQDQ

-> https://bus-error.nokturnal.pl/article2-Incorporating-m68k-assembly-code-GNU-GAS-in-GCC-C-C-programs

Da der gcc das kann würde ich es inline machen, wenn es nicht seitenweise Assembler ist. Ansonsten halt in .s auslagern. Der erwähnte Artikel ist ganz gut.
Wider dem Signaturspam!

Offline mfro

  • Benutzer
  • Beiträge: 929
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #6 am: Mi 16.08.2017, 21:44:22 »
Zuallererst würde ich mir mal anschauen, ob da überhaupt gar so viel Optimierungspotential ist.

Normalerweise erzeugt der gcc schon ganz brauchbaren Code. Manchmal muß man ihn auch ein wenig überreden ;)

Offline czietz

  • Benutzer
  • Beiträge: 1.209
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #7 am: Do 17.08.2017, 16:54:17 »
Ich würde mir auch erst einmal den von gcc generierten Code ansehen. Z.B. mit objdump. Wie viele Zyklen braucht der und wie viele der selbstgeschriebene Assemblercode?

Die Aussage "zeitkritischen Code muss man in Assembler schreiben" galt vielleicht früher. Bei EmuTOS haben wir die Erfahrung gemacht, dass man -- manchmal mit etwas Überredung, wie von @mfro formuliert -- auch ziemlich performanten Code in C schreiben kann.

PS: Da dieses Forum mich nicht reinlässt, wenn ich das Hotel-WLAN nutze, bin ich nur sporadisch hier online. Bitte m Nachsicht bei Rückfragen.

Offline gh-baden

  • Benutzer
  • Beiträge: 513
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #8 am: Do 17.08.2017, 20:01:35 »
Die Aussage "zeitkritischen Code muss man in Assembler schreiben" galt vielleicht früher. Bei EmuTOS haben wir die Erfahrung gemacht, dass man -- manchmal mit etwas Überredung, wie von @mfro formuliert -- auch ziemlich performanten Code in C schreiben kann.

Nicht nur C, sondern, wenn man mag, sogar C++:

https://www.youtube.com/watch?v=zBkNBP00wJE

Mein Lieblingslink zum Thema. Da baut einer mit neuestem C++-Sprachstandard ein Spiel für’n C64. Man sieht beim Entwickeln live den generierten 6502-Code. Und der ist echt kompakt.
Wider dem Signaturspam!

Offline tuxie

  • Benutzer
  • Beiträge: 5.815
  • Falcon! Milan! Schuetzt die Raubvoegel!
    • tuxie.de
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #9 am: Do 17.08.2017, 20:10:21 »
Darum geht es in diesem fall gar nicht !!!! geht hier nicht darum um Routinen durch Asm Code direct zu ersetzen. Hier geht es darum das wir bestimmte dinge in die Hardware auslagern wollen. Und da Holger perfekt Assembler kann, will er die kleinen Änderungen in Assembler machen. Leider bin ich nicht so Fit in C um dies in C umzusetzen.
Tschau Ingo


PC Intel i7 4820, 16gb quad @2400,Mac OS X El Capitan
http://tuxie.de http://hwbot.org/user/tuxie/

Offline mfro

  • Benutzer
  • Beiträge: 929
Re: ASM in C einbinden mit Variablenübergabe
« Antwort #10 am: Do 17.08.2017, 20:19:12 »
Darum geht es in diesem fall gar nicht !!!! geht hier nicht darum um Routinen durch Asm Code direct zu ersetzen. Hier geht es darum das wir bestimmte dinge in die Hardware auslagern wollen. Und da Holger perfekt Assembler kann, will er die kleinen Änderungen in Assembler machen. Leider bin ich nicht so Fit in C um dies in C umzusetzen.

Es geht um noch was.

Der MiNT kernel (und die Treiber) unterstützen nicht "nur" m68k-, sondern auch ColdFire-Prozessoren. Wenn Ihr also (sozusagen ohne Not) Assembler in den Kernel einbringen wollt, müsst Ihr entweder zwei Versionen abliefern oder eine, die auch auf ColdFire läuft (oder eben den Treiber - oder worum's geht - von vornherein für die ColdFires abschreiben und in den Makefiles ausschließen, was natürlich schade wäre).

Wenn Du ein bißchen genauer würdest, worum es genau geht, könnte man sicher mit ein wenig C helfen ...