Programm leider noch nicht fertig.
Code:
#************************************************
/* Start des Programms */
.globl main
#************************************************
#* Beginn der globalen Daten *
#************************************************
.section .data
.equ Laenge, 2048
#* Standard Anfangsnachricht damit der User versteht was er mit dem Programm machen soll
#* ausserdem neue Zeile und Ausgaben masken
message: .asciz "Bitte geben Sie einen Suchstring ein: "
#* Gibt an wie das Zeichen für eine neue Zeile ist
newline: .asciz "\n"
#* Gibt an wie groß der Buffer ist
buffer: .long Laenge
#***********************************************
#* Beginn globaler Datenbereiche *
#************************************************
.section .bss
.comm Merker, Laenge # Speicher für ein Feld mit <Laenge> Bytes freigeben
#***********************************************
#* Beginn des Programms *
#************************************************
.section .text
# ----- St a r t des Hauptprogramms -----
main:
call console_init #* Console für die eingabe wird geöffnet
new:
call ClearMerker #* Aufruf um den Merker einmal auf 0 zu setzen
push $message #* Die Adresse wo die Anfangsnachricht wird gepusht um
call print #* die Nachricht drucken zu können
pop %edx #* Adresse wird wieder zurück geholt
mov $0, %ebx #* ebx dient als Zeiger für den Merker (zaehler) wird auf 0 gesetzt
loop_input:
mov $0, %edx
call console_getchar #* zeichern der Console (Tastendruck) wird eingelesen
cmp $0x1b,%eax #* Prüft ob ESC gedrückt wurde
jz ende #* wenn ja springt das prog zum punkt ende
cmp $0x0a,%eax #* Prüft ob ENTER gedrückt wurde
jz verarbeitung #* wenn ja springt das prog zum punkt verarbeitung
mov %al,Merker(%ebx)#* Das Zeichen was getippt wurde wird in den Merker geschrieben
#* Ausgabe der gedückten Taste
push %eax #* Ausgabe des Zeichens eax dient als übergabe
call console_putchar #*
pop %eax #*
inc %ebx #* erhöht um eins (dec verringert um einen)
jmp loop_input #* das prog springt zum punkte loop_input
verarbeitung:
movb $0,Merker(%ebx) #* Setzt ans Ende des Feldes 0 um so das Ende zu signalisieren
mov $0, %ebx #* da ebx gespeichert wurde kann es auf 0 zurückgesetzt werden
cmp $Lng_hex,%ecx #* der zaehler ecx wird auf die erlaubte länge überprüft
call PrintNewLine
call CheckString
jmp verarbeitung
ende:
call console_close #* hier wird die Console wieder geschlossen
nop
ret
#* ClearMerker setzt jedes byte im Feld Merker auf 0
ClearMerker:
push %ebx
mov $0, %ebx
MerkerSchleife:
cmp $Laenge, %ebx
jz MerkerEnde
movb $0, Merker(%ebx)
inc %ebx
jmp MerkerSchleife
MerkerEnde:
pop %ebx
ret
CheckString:
Start:
mov $0, %ebx #* da ebx gespeichert wurde kann es auf 0 zurückgesetzt werden
Forward:
cmpb $0x20,Merker(%ebx)
je add_ebx_set
#* hier wird nur ebx um eins erhöht
add_ebx_set:
inc %ebx
jmp Forward
ret
#* Neue Zeile wird hier im Unterprogramm gedruckt
PrintNewLine:
push %ebx
push %edx
push $newline
call print
pop %ecx
pop %edx
pop %ebx
ret
print:
mov 4(%esp), %ebx # Speicheradresse des Strings
print_loop:
mov $0, %eax # eax auf 0 setzen
mov (%ebx), %al # Ein Byte von Speicheradresse in eax schreiben
or %eax, %eax # Setzt zero flag, wenn eax 0 ist
jz print_end # Springe ans Ende
push %eax # eax auf den Stack packen
call console_putchar # console_putchar aufrufen
pop %eax # Stack wieder bereinigen
inc %ebx # Zeiger auf die Speicheradresse erhöhen
jmp print_loop # Schleife
print_end:
ret
Zuletzt bearbeitet: