www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SH7201 Renesas, Aufruf von ASM code in C, Rückgabe


Autor: Christoph Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich versuche unter Zuhilfenahme der Referenz meines Compiler Packages 
eine ASM Routine von einer C Funktion aus aufzurufen. Die Übergabe der 
Parameter funktioniert, allerdings habe ich es bisher nicht geschafft 
einen Wert zurückzugeben.

Ich verstehe nicht an welchen Ort ich in den Stack schreiben muss, da 
Fehler auftreten wenn ich den Speicher dort beschriebe (siehe Diagramm 
in der Referenz, Figure 9.8 )
Muss ich den Stack speicher für den Rückgabewert selbst allocieren?

Aktueller ASM test Code:
        .EXPORT  _routine

        .SECTION    P,CODE,ALIGN=4
_routine:
        ;die ersten 4 parameter stehen in den Registern R4 bis R7,
        ;weitere würden im stack stehen

        ADD  R4,R5  ;Parameter 1 und 2 addieren, ergenis in R5
        ADD R5,R6  ;R5 und Parameter 3 addieren, ergenis in R6
        ADD  R6,R7  ;R6 und Parameter 4 addieren, ergenis in R7
        ADD #4,R15 ;setze den stack Pointer (= R15) in die nächste 
speicherzelle

        MOV.L  R7,@R15 ;beschreibe die zelle mit dem ergebnis der 
addition

        RTS  ;springe zurück
        .END

Von C aus betrachtet:
extern int routine(int, int, int, int); //Prototyp

Das obige funktioniert (Register haben die korrkten Werte) bis auf das 
schreiben des rückgabewertes. (ich habe auch schon begonnen zu 
experimentieren und andere Adressen zu beschreiben, ohne Erfolg)

Was muss ich tun um einen Wert zurückzugeben?
(Ein versuch einen zeiger als parameter an die routine zu übergeben und 
den zu beschreiben war auch erfolglos)



Verwendete Referenz: 
http://documentation.renesas.com/eng/products/tool...
ab Seite: 256, beginnt das Kapitel Linking C/C++ Programs and Assembly 
Programs

Hardware: Renesas SH7201 Starter Kit, mit E8 JTAGemulator Programmer
Entwicklungsumgebung: High-performance Embedded Workshop, Version 
4.05.01.001
Compiler: SuperH RISC engine C/C++ Compiler, Assembler, Optimizing 
Linkage Editor Compiler Package V.9.01

Autor: Christoph Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die Lösung mittlerweile erfahren.
Der Rückgabewert steht bei Integern nicht im Stack sondern in einem 
Register (R0)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.