mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler Routine ein Array übergeben


Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich spiele mich gerade mit ersten embedded ASM Routinen und frage mich 
jetzt, wie ich einer solchen ein Array übergeben kann.
Ich habe rausgefunden, dass wenn ich folgendes mache bereits "normale" 
Zahlen übergeben kann:
__asm void test(int i){
  LDR r1,[r0]
}

int main(void){
  test(5);
}

Nach dem aufruf von test steht in r1 die 5.

Nur weiß ich nicht, wie ich ein Array übergeben würde, und wie ich in 
Assembler mit Pointern arbeite.
Ich will z.b. folgendes erreichen:
__asm void test(unsigned long *ar){
  LDR r1,["Hier will ich jetzt das erste Element laden"]
  LDR r2,["Hier das zweite"]
}

Gruß
Mathias

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Dubdidu schrieb:
> ich spiele mich gerade mit ersten embedded ASM Routinen und frage mich
> jetzt, wie ich einer solchen ein Array übergeben kann.

Sinn? Für normale Projekte lohnt sichs meiner Meinung nach nicht, 
Assembler und Hochsprache zu mischen.
:-)

Mathias Dubdidu schrieb:
> Nur weiß ich nicht, wie ich ein Array übergeben würde, und wie ich in
> Assembler mit Pointern arbeite.

Dann wirds Zeit, dich mit Assembler zu beschäftigen,
ach um welchen uC gehts hier eigentlich?

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> Sinn? Für normale Projekte lohnt sichs meiner Meinung nach nicht,
> Assembler und Hochsprache zu mischen.
> :-)

Wollte mal schaun wie schnell ich es in ASM im vergleich zur C Routine 
hinbekomme :)

> Dann wirds Zeit, dich mit Assembler zu beschäftigen,
> ach um welchen uC gehts hier eigentlich?

Oh sorry vergessen es geht um einen STM32F103

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Dubdidu schrieb:
> Floh schrieb:
>> Sinn? Für normale Projekte lohnt sichs meiner Meinung nach nicht,
>> Assembler und Hochsprache zu mischen.
>> :-)
>
> Wollte mal schaun wie schnell ich es in ASM im vergleich zur C Routine
> hinbekomme :)

Wenn du wenig Erfahrung in Assembler hast:
Deine Chancen stehen nicht so gut
Ich setze einen virtuellen 10-er auf den Compiler.

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Wenn du wenig Erfahrung in Assembler hast:
> Deine Chancen stehen nicht so gut
> Ich setze einen virtuellen 10-er auf den Compiler.

Ich werds dennoch mal versuchen und wäre deshalb froh, wenn ihr mir 
evtl. auch mit einem Stückchen code weiterhelfen könnt.
Ich werde dann berichten wie es ausgegangen ist ;)

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Dubdidu schrieb:
> __asm void test(unsigned long *ar){
>   LDR r1,["Hier will ich jetzt das erste Element laden"]
>   LDR r2,["Hier das zweite"]
> }

So auf jeden Fall nicht.
Das Aray hatt eine Startadresse im RAM, die darauffolgenden 
Speicherstellen gehören dann auch dazu.
Vom Ablauf her dann so ungefähr:

Du kriegst die Startadresse übergeben,
r1 bekommt dann [Startdaresse] zugewiesen
r2 bekommt [Startadresse +1] zugewiesen
...
oder du zählst deinen Pointer einfach nach jedem Lesen hoch.
:-)
Näheres musst du mit der Beschreibung deines Compilers beratschlagen, da 
das sehr von ihm abhängt, wie das umgesetzt wird.

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> Du kriegst die Startadresse übergeben,
> r1 bekommt dann [Startdaresse] zugewiesen
> r2 bekommt [Startadresse +1] zugewiesen


Ok das müsste dann auf so etwas rauslaufen:

LDR r1,[r0]
LDR r2,[r0,#32] <- also die Startaddresse + die Länge eines unsigned 
long (wenn so ein Array übergeben wird)

Danke! Werd mich nochmal mit meinem Compilermanual unterhalten.

> ...
> oder du zählst deinen Pointer einfach nach jedem Lesen hoch.
> :-)

Ja sowas hatte ich geplant, nur bin ich mir mit der Syntax nicht sicher,
würde das jetzt aus dem Bauch raus so machen:

LDR r1,r0++

> Näheres musst du mit der Beschreibung deines Compilers beratschlagen, da
> das sehr von ihm abhängt, wie das umgesetzt wird.

Hmm ja werde mich mal mit ihr Unterhalten.

Danke!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib es einfach in C hin und dann laß es nach Assembler übersetzen.


Peter

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es jetzt gelöst.
Es geht mit
LDR r1,[r0,#0] ;ar[0]
LDR r2,[r0,#4] ;ar[1]

Der Vergleich mit dem Compiler steht noch aus kann ich leider erste 
morgen machen.
Danke an alle!

Gruß

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.