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

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.