C-Funktionen in Assembler aufrufen

Gast #283951
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
Moderator Persönliche Seite #283952
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.
Gast #283953
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren