.data
.align 4
array: .byte 0x5, 0x12, 0x4, 0xa, 0x2, 0x1, 0x09, 0x00
.align 4
.text
.global _start
_start:
ldr r0, =array
bl bubblesort
end:
b end
Der Start des Programms lädt die Adresse des Arrays in Register r0 und ruft die Funktion bubblesort auf. Nach der Rückkehr aus dieser Funktion wird eine Dauerschleife ausgeführt.
bubblesort:
push {lr,r6}
mov r6, #0
Schleifenzähler wird mit 0
initialisiert.
loop_aussen:
cmp r6, #8
beq endbubble
add r6, r6, #1
bl sort
b loop_aussen
endbubble:
pop {pc, r6}
Der Zähler wird inkrementiert und der Tauschvorgang (wenn nötig) durchgeführt und die Schleife wiederholt, bis das Ende des Arrays erreicht wurde.
sort:
mov r1, #0
Eine Variable für den Zugriff auf den Array wird initialisiert.
loop_innen:
push {lr}
cmp r1, #8
bhi quit
ldrb r2, [r0, r1]
add r1, r1, #1
ldrb r3, [r0, r1]
sub r1, r1, #1
cmp r2, r3
bls sorted
bl unsorted
sorted:
add r1, r1, #1
bl loop_innen
quit:
pop {pc}
Wenn die Elemente bereits richtig angeordnet sind , wird der Zähler erhöht und die Schleife wiederholt, andernfalls wird zum Tausch gesprungen. Nach dem Vergleich aller Elemente wird die Schleife beendet.
unsorted:
push {r4, r5}
ldrb r4, [r0, r1]
add r1, r1, #1
ldrb r5, [r0, r1]
sub r1, r1, #1
strb r5, [r0, r1]
add r1, r1, #1
strb r4, [r0, r1]
sub r1, r1, #1
pop {r4, r5}
bx lr
Umsortieren der falsch angeordneten Elemente.
.data
.align 4
.word 0x0000
array: .byte 0x5, 0x12, 0x4, 0xa, 0x2, 0x1, 0x09, 0x00
length:
.byte 0x5
.align 4
.text
.global _start
_start:
ldr r1, =array
ldr r0, =length
bl insertsort
end:
b end
Aufruf der insertsort
-Funktion.
insertsort:
push {r4,r5}
mov r3, #1
ldr r1, =array
Es wird ein Zähler auf 1
gesetzt, der den Fortschritt durch das Array verfolgt. Der Algorithmus beginnt dadurch mit dem zweiten Element, da das erste Element bereits als sortiert betrachtet wird.
loop_o:
cmp r3, r0
beq end_loop_o
ldrb r2, [r1 , r3]
sub r4, r3, #1
Die äußere Schleife läuft so lange, bis das Ende des Arrays erreicht ist. Dabei wird für jedes Element die richtige Position im bereits sortierten Teil des Arrays gesucht.
loop_i:
cmp r4, #0
blt loop_i_end
ldrb r5, [r1, r4]
cmp r5, r2
ble loop_i_end
add r4, #1
strb r5, [r1,r4]
sub r4, r4, #2
loop_i_end:
add r4, #1
strb r2, [r1, r4]
add r3, #1
b loop_o
Das aktuelle Element wird mit den vorhergehenden verglichen. Wenn ein größeres Element gefunden wird, wird es nach rechts verschoben. Sobald ein kleineres oder gleiches Element gefunden wird, wird das aktuelle Element in die entstandene Lücke eingefügt. Diese innere Schleife wird so lange wiederholt, bis entweder kein Element mehr links vom aktuellen Element übrig ist (d. h. der Zähler kleiner als 0 wird) oder ein kleineres oder gleiches Element gefunden wird, das bereits korrekt einsortiert ist.
end_loop_o:
pop {r4, r5}
bx lr
Wenn die äußere Schleife alle Elemente des Arrays durchlaufen hat, ist das Array sortiert, und die Sortierfunktion wird beendet.
zurück | Hauptmenü | weiter |
4.3 Komplexe Datentypen |
---|
4.3.1 Intro |
4.3.2 Structs (Strukturen) |
4.3.3 Arrays in Assembler |
4.3.4 Zugriffsberechnung bei einem eindimensionalen Array |
4.3.5 Lookup-Tables |
4.3.6 Mehrdimensionalen Arrays |