ARM STM32 Calling Convention

Gast #3334182
Lesenswert?
• ▲
▼
Ich möchte unter GNU GCC eine Assemlerprozedur con C aus aufrufen.

Ich hab nun "herausgefunden", dass beim Aufruf zunächst die 
Rücksprungadresse in das link register r14 geschrieben wird.

Die Parameter werden mit r0...r3 übergeben. Wenn ich nun den 
Funktionsprototypen als
1
void foo(uint8 par1, uint8 par2)
 definiere, so übergebe ich ja nur 2x8 Bit. Kommen diese nun nach r0 und 
r1, oder wird zunächst r0 aufgefüllt?

Und was passiert, wenn ich ein long long int (=64Bit) übergebe?

Wo ist das ordentlich beschrieben? Ich habe bisher nur ein paar 
Beispiele gefunden, wo man sich das zusammenreimen kann...
(Firma: fritzler-avr.de) #3334191
Lesenswert?
• ▲
▼
Ne Beschreibung als pdf kann ich dir nicht geben, aber deine Fragen 
beantworten.

Michael W. schrieb:
> Ich hab nun "herausgefunden", dass beim Aufruf zunächst die
> Rücksprungadresse in das link register r14 geschrieben wird.
Richtig, also zum Zurückspringen ein MOV PC, LR (LR = R14).

Michael W. schrieb:
> Die Parameter werden mit r0...r3 übergeben. Wenn ich nun den
> Funktionsprototypen als
> void foo(uint8 par1, uint8 par2) definiere, so übergebe ich ja nur 2x8
> Bit. Kommen diese nun nach r0 und
> r1, oder wird zunächst r0 aufgefüllt?
par1 kommt nach R0 und par2 nach R1.
Aufgefüllt wird nur wenns ein 8 bit signed ist, aber da werden nur die 
ersten 24bit des Registers Vorzeichenrichtig aufgefüllt.
Es gilt: 1 Register = 1 Variable (solange die reinpasst).

Michael W. schrieb:
> Und was passiert, wenn ich ein long long int (=64Bit) übergebe?
Das landet dann in R0 und R1.

Weiterhin landen auch alle Variablen auf dem Stack und zur 
ERgebnisübergabe wird R0 genutzt.

Die Befehle STMFD/LDMFD zum registerretten kennste?
Gast #3334305
Lesenswert?
• ▲
▼
Du kannst die Funktion auch als C-Funktion definieren und 
inline-Assembly verwenden, dann ists sogar unabhängig von der 
Calling-Convention... Musst nur die richtigen Constraints angeben um die 
Parameter vom Assemblercode aus ansprechen zu können.
Gast #3334521
Lesenswert?
• ▲
▼
Michael W. schrieb:
> d.h. wenn ich 6 Parameter mit jeweils 32Bit übergebe, landen die ersten
> vier in r0...r3 und NUR(!) die restlichen beiden am Stack?

Ja genau so.
Für die floats schaut es beim STM32F4.. anders aus, da landen die float 
parameter in den float registern. Genaueres kann man ergugeln. Da gibt 
es eine Beschreibung der C-calling convention (oder so ähnlich).

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.