mov r1, #0 @ reihenindex
mov r2, #16 @ reihengroesse
mov r3, #0 @ spaltenindex
mov r4, #1 @ offset
mov r5, #0 @ Zähler
mov r6, #0 @ Maximaler Zählwert
Mehrere Register werden initialisiert, um die Schleife zu steuern und Indizes sowie Zähler zu verwalten.
matrix_inc:
@ R1 = (R1 * R2) + R3
mla r4, r1, r2, r3
ldr r0, =matrix @ Basisadresse der Matrix
Im Abschnitt matrix_inc
wird der Offset berechnet. Anschließend wird die Matrixbasisadresse in r0
geladen.
cmp r3, r2
bhs row_end
ldrb r7, [r0, r4]
cmp r7, #0xaa
bne not_aa
add r5, r5, #1
Nun wird geprüft, ob der Spaltenindex die maximale Spaltenanzahl einer Zeile erreicht hat. Wenn ja, erfolgt ein Sprung zu row_end
. Andernfalls wird das Byte an der Adresse (matrix + r4
) in r7
geladen und mit 0xaa
verglichen. Bei Ungleichheit springt das Programm zu not_aa
, andernfalls wird der Zähler um eins erhöht.
col_end:
add r3, r3, #1
b matrix_inc
Nach der Überprüfung des Bytes wird der Spaltenindex (r3
) inkrementiert, und die Schleife beginnt erneut mit matrix_inc
, um das nächste Byte in der aktuellen Reihe zu verarbeiten.
row_end:
mov r3, #0
add r1, r1, #1
cmp r5, r6
movlo r5, #0
movhi r6, r5
cmp r1, #3
blo matrix_inc
Wenn das Ende einer Reihe erreicht ist, wird der Spaltenindex auf 0 gesetzt und der Reihenindex um 1 erhöht. Danach wird r5
(aktueller Zähler) mit r6
(maximaler Zähler) verglichen: Ist r5
kleiner, wird r5
zurückgesetzt, sonst wird r6
aktualisiert. Abschließend wird geprüft, ob alle drei Reihen verarbeitet wurden; wenn nicht, springt die Schleife zu matrix_inc
.
done:
mov r0, r6
b .
Der Abschnitt done
übernimmt die geforderte Speicherung der maximal gefundenen Sequenzlänge (r6
) in das Register r0
und führt anschließend eine Endlosschleife aus, um das Programm zu beenden.
not_aa:
cmp r5, r6
movlo r5, #0
blo col_end
mov r6, r5
mov r5, #0
b col_end
Im Abschnitt not_aa
wird der aktuelle Zähler r5
mit dem maximalen Zähler r6
verglichen. Ist r5
kleiner, wird er auf 0 zurückgesetzt und zu col_end
gesprungen. Andernfalls wird r6
auf den Wert von r5
gesetzt, bevor auch r5
zurückgesetzt und die Verarbeitung der nächsten Spalte fortgesetzt wird.
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 |