[QUIZ#1] Denfie (Assembler)

Denfie

Mitglied
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:

Teambeta

Erfahrenes Mitglied
Auch jemand der genauso verrückt ist wie ich ( abgesehen von dem der in Brainfuck geschrieben hat :D ). Leider noch nicht fertig. Machst du es noch zuende?

Werd's mir später nochmal genauer angucken, hab' gerade leider Zeitmangel :(.
 

Denfie

Mitglied
In einer freien Minute werde ich mir das noch mal zur Hand nehmen und zu ende schreiben. :D
Aber Brainfuck können wir einfach nicht übertrumpfen.
 

Neue Beiträge