eingabe und ausgabe von zahlen!



  • Hi Leute 🙂

    Ich habe zwei Funktion (nasm) geschrieben.
    Eine konvertiert ascii-zahlen in Zahlen um (dezi_konv)
    und die andere zahlen in ascii,
    so das man die Zahl dann auf BS augeben kann (ascii_konv).

    Ein kleines Programm (hier nicht dargestellt)
    1.)nimmt die Zahl von stdin ein konvertiert sie (dezi_konv)
    2.)konvertiert sie wider zurück in ascii (ascii_konv)
    4.)gibt diese wider auf stdout aus

    Leider stimmt die Ausgabe mit der Eingabe nicht überein 😞

    Hier die Functionen:

    dezi_konv:
            push ebp
            mov ebp,esp
            mov esi,[ebp+8]   ; Wir holen die addr des buffers
    
            xor eax,eax       ; hier kommt unser ergebnis rein
            mov ebx,10        ; unsere Basis
            xor ecx,ecx       ; hiermit rechnen wir
    
    nachste:
            mov cx,[esi]      ; wir holen ns das erste ASCII Zeichen
            sub cx,0x30       ; wir wandeln es in Dezimalziffer um
            cmp cl,9          ; ist die Ziffer groesser als 9 ?
            ja keine_zeichen  ; wenn ja, dann beende function
            mul ebx           ; multipliziere mit der Basis 10
            add eax,ecx       ; rechne Ziffer mit der zahl zusamen
            inc esi           ; wir behandeln nun das naechste Zeichen
            jmp nachste
    
    keine_zeichen:
            pop ebp
            ret
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    ascii_konv:
            push ebp
            mov ebp,esp
            mov esi,[ebp+12]   ; wir holen die addresse des ausgabebuffers
            mov eax,[ebp+8]    ; wir holen die zu umkonvertierende Dezimalzahl
    
            mov ebx,10         ; Unsere Basis
            xor ecx,ecx        ; Wir zaehlen die Ziffern
    ziffer:
            xor edx,edx        ; diese wird nach der division die Ziffer sein
            div ebx            ; wir dividieren durch die Basis
            push edx           ; den divisionsrest merken wir auf dem stack
            inc ecx            ; wir haben eine Ziffer mehr
            cmp edx,0          ; ist der divisionsrest groesser als 0 ?
            ja ziffer          ; wenn ja, dann war es noch nicht das ende
    
    in_buffer:
            pop eax
            add al,0x30
            mov [esi],al
            inc esi
            loop in_buffer
    
            pop ebp
            ret
    

    Kann mir jemand Helfen? wo steckt der Fehler?

    Für eure Hilfe wäre ich sehr dankbar 🙂

    Gruss 🙂



  • THX hab den Fehle selbst gefunden 🙂

    mov cx,[esi]      ; wir holen ns das erste ASCII Zeichen
            sub cx,0x30       ; wir wandeln es in Dezimalziffer um
    

    muss heissen

    mov cl,[esi]      ; wir holen ns das erste ASCII Zeichen
            sub cl,0x30       ; wir wandeln es in Dezimalziffer um
    

    gruss 🙂


Anmelden zum Antworten