Ziele:
Algorithmen in Assemblerprogramme mit möglichst geringer Codegröße umzusetzen, sowie der Umgang Debugger und Simulator.
Arbeitsverzeichnis:
Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur Verfügung gestellt wird, in Ihr persönliches Verzeichnis. Dort stehen Ihnen dann alle benötigten Dateien zur Verfügung.
Vorbereitung
Überlegen Sie sich ein Unterprogramm (Funktion), welches eine Zeichenkette in einem Text suchen soll. Die Funktion bekommt die Anfangsadresse des zu durchsuchenden Textes und die Anfangsadresse der zu suchenden Zeichenkette in den Registern R0 und R1 übergeben. Im Register R0 soll zurückgegeben werden , wie oft die zu suchende Zeichenkette im Text gefunden wurde. Bei einer leeren zu suchenden Zeichenkette liefert die Funktion den Wert 0 zurück. Handelt es sich bei dem zu durchsuchenden Text um eine leere Zeichenkette, so liefert die Funktion den Wert 0 zurück.
Mögliche Aufrufe:
int searchStringInString(char*, char*);
int main (void)
{
int Anzahl;
char* Text="hallo Alles klar?";
char* Suchstring="ll";
char* Leerstring=““;
Anzahl = searchStringInString(Text, Suchstring);
Anzahl = searchStringInString(Text, Leersrtring);
Anzahl = searchStringInString(Leerstring, Suchstring);
Anzahl = searchStringInString(Leerstring, Leerstring);
return 0;
}
Überlegen Sie sich noch weitere Testfälle
Aufgabe 1:
Schreiben Sie Ihr Programm und testen es bevor Sie es im Praktikum vorführen.
.file "searchStringInString.s"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function
searchStringInString:
..
..
..
Lösung 1
@ in R0 wird die Adresse des zu durchsuchenden Text erwartet.
@ in R1 wird die Adresse des zu suchendenn Text erwartet.
@ sollte R0 auf einen leeren String zeigen,
@ oder der gesuchte Text nicht gefunden werden,
@ so wird in R0 der Wert 0 zurueck geliefert.
@ zeigt R1 auf einen leeren String so wird in R0 der Wert 0 zurueck gegeben
.file "searchStringInString.S"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function
searchStringInString:
stmfd sp!, {r4,r5,lr}
mov r4, r0 // Neues Register für den zu durchsuchenden Text
ldr r5,[r0]
cmp r5,#0x0
mov r0,#0x0 // Zähler auf 0 setzen
ldmeqfd sp!, {r4,r5,pc}
mov r3, r1 // Neues Register für den zu suchenden Text
mov r5, r3 // Sicherung der Adresse des zu suchenden Textes
//ldrb r1,[r3]
loop: // Schleife
LDRB r2, [r4],#1 // Erstes bzw. nächstes Zeichen des zu durchsuchenden Strings laden
CMP r1,r2 // Vergleich zu suchendes Zeichen = Zeichen in Zeichenkette
LDREQB r1, [r3],#1 // Wenn r1=r2 dann nächstes zu suchendes Zeichen laden
CMP r1,#0x0 // Vergleich ob r1 das letzte Zeichen war
ADDEQ r0,#0x1 // Zähler um 1 erhöhen
MOVEQ r3, r5 // r1 zurücksetzen
CMP r3, r5
LDREQB r1, [r3],#1
CMP r2, #0x0 // Prüfen ob r2 das letzte Zeichen war
BNE loop // Schleifenaufruf, wenn r2 nicht fertig ist
ldmfd sp!, {r4,r5,pc}
.size searchStringInString, .-searchStringInString
Zusatzaufgabe:
Überlegen Sie sich ein Unterprogramm (Funktion), welches eine Zeichenkette in einem Text suchen soll. Die Funktion bekommt die Anfangsadresse des zu durchsuchenden Textes und die Anfangsadresse der zu suchenden Zeichenkette in den Registern R0 und R1 übergeben. Im Register R0 soll zurückgegeben werden , wie oft die zu suchende Zeichenkette im Text gefunden wurde. Bei einer leeren zu suchenden Zeichenkette liefert die Funktion die Länge des zu durchsuchenden Text zurück. Handelt es sich bei dem zu durchsuchenden Text um eine leere Zeichenkette, so liefert die Funktion den Wert 0 zurück.
Lösung Zusatzaufgabe
@ in R0 wird die Adresse des zu durchsuchenden Text erwartet.
@ in R1 wird die Adresse des zu suchendenn Text erwartet.
@ sollte R0 auf einen leeren String zeigen,
@ oder der gesuchte Text nicht gefunden werden,
@ so wird in R0 der Wert 0 zurueck geliefert.
@ zeigt R1 auf einen leeren String so wird in R0 der Wert 0 zurueck gegeben
.file "searchStringInString.S"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function
searchStringInString:
stmfd sp!, {r4,r5,lr}
mov r4, r0 // Neues Register für den zu durchsuchenden Text
ldr r5,[r0]
cmp r5,#0x0
mov r0,#0x0 // Zähler auf 0 setzen
ldmeqfd sp!, {r4,r5,pc}
mov r3, r1 // Neues Register für den zu suchenden Text
mov r5, r3 // Sicherung der Adresse des zu suchenden Textes
loop: // Schleife
LDRB r2, [r4],#1 // Erstes bzw. nächstes Zeichen des zu durchsuchenden Strings laden
CMP r1,r2 // Vergleich zu suchendes Zeichen = Zeichen in Zeichenkette
LDREQB r1, [r3],#1 // Wenn r1=r2 dann nächstes zu suchendes Zeichen laden
CMP r1,#0x0 // Vergleich ob r1 das letzte Zeichen war
ADDEQ r0,#0x1 // Zähler um 1 erhöhen
MOVEQ r3, r5 // r1 zurücksetzen
CMP r3, r5
LDREQB r1, [r3],#1
CMP r2, #0x0 // Prüfen ob r2 das letzte Zeichen war
BNE loop // Schleifenaufruf, wenn r2 nicht fertig ist
ldmfd sp!, {r4,r5,pc}
.size searchStringInString, .-searchStringInString