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


von Mathias D. (darkfirefighter)


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:
1
__asm void test(int i){
2
  LDR r1,[r0]
3
}
4
5
int main(void){
6
  test(5);
7
}

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:
1
__asm void test(unsigned long *ar){
2
  LDR r1,["Hier will ich jetzt das erste Element laden"]
3
  LDR r2,["Hier das zweite"]
4
}

Gruß
Mathias

von Floh (Gast)


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?

von Mathias D. (darkfirefighter)


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

von Karl H. (kbuchegg)


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.

von Mathias D. (darkfirefighter)


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 ;)

von Floh (Gast)


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.

von Mathias D. (darkfirefighter)


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!

von Peter D. (peda)


Lesenswert?

Schreib es einfach in C hin und dann laß es nach Assembler übersetzen.


Peter

von Mathias D. (darkfirefighter)


Lesenswert?

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

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

Gruß

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.