Forum: Compiler & IDEs C-Funktionen in Assembler aufrufen


von Tobi (Gast)


Lesenswert?

Hi!

Ich habe mir die Soft-USB-Lösung (alles in Assembler) von Igor Cesko
(http://www.cesko.host.sk, cesko@internet.sk) für den ATMega 8
heruntergeladen, assembliert, alles läuft wunderbar (1,5MBit USB mit
EEProm und USB-RS232 Wandler + Portpins-Schalten per USB, coole
Sache!!). Das Programm ist im "Atmel - Assembler" (also nicht GNU-As)
geschrieben.

Nun möchte ich in dieses Programm eigene Funktionen mit einbinden. Da
ich zu faul bin, alles in Assembler zu schreiben, will ich die
Funktionen in C schreiben und dann in den Assembler-Code einbinden. Das
ganze soll mit dem AVR-GCC (im WinAVR) passieren.

Ist dies überhaupt möglich? Hab bisher das sorum noch nicht gesehen.
Der Assemblercode müsste halt noch für den GNU-AS angepasst werden, das
geht aber.
Problem ist auch, das der Assemblercode die Hauptschleife samt Main()
enthält. Wie bringe ich das dem AVR-GCC bei??

Vielen Dank schon mal!

MfG, Tobi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Ist dies überhaupt möglich? Hab bisher das sorum noch nicht gesehen.

Jein.  Du hast halt kein Stück der Initialisierungen des
C-Laufzeitsystems.  Da der Assemblercode seinen Stack ja zumindest
initialisieren wird, ist der Teil erstmal OK, es bliebe nur noch die
Initialisierung der statischen und globalen Variablen, die dann nicht
erfolgt.  Das hängt dann von dir ab, ob du damit leben kannst.

Ich würde versuchen, stattdessen die Hauptschleife in C zu schreiben
und den Rest von dort aufzurufen.

von Tobi (Gast)


Lesenswert?

Danke für die schnelle Antwort
Hab grad gemerkt, dass es so gehen könnte:

-Assemblerteil (Main.S) (unsinniger Code, nur Beispiel!!):

.global main
.func main

.extern Test

main:
  push  r1
  add   r1,r2
  RCALL Test ;Funktion aufrufen
  pop   r1
        rjmp  main


C-Teil (Test.c):

void Test(void)
  {
  }

Beide Teile dann im makefile angeben!

Mein Problem ist, das das Assemblerprogramm halt nicht von mir stammt
und ich mir die Mühe ersparen will, dieses zu zerpflücken. Die
Anfangs-Initialisierungen macht das Assemblerprogramm.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du musst natürlich die ABI-Konventionen beachten:

http://www.sax.de/~joerg/avr-libc-user-manual/FAQ.html#faq_reg_usage

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hrmpf.  Das war leider das falsche Manual...  Hier der Link zum
offiziellen:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.