(Das Problem basiert auf Assemblersprache ARM.) Ich habe mit einem Problem zu tun, das mich auffordert, ein bestimmtes Array umzukehren. Genau wie folgt aus:Wie man ein Array in der Assemblersprache ARM umkehrt?
Given array: 1, 2, 3, 4, 5
Reversed array: 5, 4, 3, 2, 1
Und die Einschränkung dieses Problem ist, dass ich nur Register soll ich r0-r3 verwenden.
Ich habe einen grundlegenden Algorithmus, aber ich bin wirklich verwirrt, wenn ich versuche, die Idee zu implementieren. Mein Algorithmus:
Loop:
1. get value from head pointer, ptr++
2. get value from tail pointer, ptr--
3. swap them
4. check if head pointer and tail pointer cross,
if so, exit loop and return.
if not, go back to loop.
Aber ich weiß einfach nicht, wie nur 4 Register zu verwenden, um dieses Problem zu lösen ..
Im Folgenden wäre alles, was ich im Moment habe.
.text
.global reverse
reverse:
@ See if head and tail ptr cross
@ If so, end loop (b end)
head:
@ use r2 to represent head value
ldr r2,[r0] @ r2 <-*data get the first value
tail:
@ mov r1,r1 @ size
sub r1,r1,#1 @ size-1
lsl r1,r1,#2 @ (size-1)*4
add r0,r0,r1 @ &data[size-1] need to ldr r1,[r0] to get value
ldr r1,[r0] @ get value for r1 (from tail)
swap:
@ swap values
mov r3, r1 @store value to r3
str r2, [r0]
@ head ptr ++
@ tail ptr --
@ back to reverse
end:
@ loop ends
Sie Algorithmus ist unvollständig, es wird für immer Werte Kopf und Schwanz tauschen. – Ped7g
warum versuchst du nicht, dies in C zu kompilieren, dann disassemblieren und studieren ... das ist was ich mache wenn ich wissen will was unter der haube ist –
nach dem editieren wird dein algorithmus für immer kopf + 1 und schwanz-1 tauschen Werte (wenn sie überhaupt existieren .. und wenn das Wort 'ptr' diesen bestimmten Kopf/Tail-Zeiger bedeutet und nicht etwas völlig anderes) ... sollten Sie es richtig aufschreiben (erfordert etwas mehr als 4 Schritte) .. und Zögern Sie nicht, es in einfache und einfachere Schritte zu schreiben, es kann sich als sehr hilfreich für das Schreiben erweisen. – Ped7g