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
__asmvoidtest(inti){
2
LDRr1,[r0]
3
}
4
5
intmain(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
__asmvoidtest(unsignedlong*ar){
2
LDRr1,["Hier will ich jetzt das erste Element laden"]
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?
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
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.
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 ;)
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.
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!