Assembler Routine ein Array übergeben

OP #1832694
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
Gast #1832700
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?
#1832709
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.
Gast #1832760
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.
OP #1832769
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!

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