Addierer, funktioniert nicht



  • Hi, könnte mir mal einer sagen warum dieser Code (TASM) nicht einfach das Ergebnis ausgibt, sondern wirre Zeichen?

    model small
    daten segment
    assume ds:daten
    Intro1 db 'a= ','Intro2dbb=,' Intro2 db ' b= ',''
    daten ends ;5

    code segment
    assume cs:code
    start:
    mov ax, seg daten
    mov ds, ax ;10

    mov ah, 09h
    mov dx, offset intro1
    int 21h
    ;15
    mov ah, 1h
    int 21h

    push ax
    ;20
    mov ah, 09h
    mov dx, offset intro2
    int 21h

    mov ah, 1h ;25
    int 21h

    mov bl, al
    pop ax
    add bx, ax ;30

    mov ah, 09h ;+++++++++++++++++++++++++++++
    mov dx, ax ;hier liegt, glaube ich, irgendwie der Fehler
    int 21h ;+++++++++++++++++++++++++++++
    ;35
    mov ah, 1h
    int 21h

    mov ax, 4c00h
    int 21h
    code ends
    end start

    Wäre net wenn mir einer schnell helfen könnte.

    CU 🙄



  • Hi.

    Die Funktion 09h erwartet in ds:dx die Addresse auf einen String. Du uebergibst der Funktion zum Schluss jedoch einfach den Wert 09xxh (Wobei xx der ASCII-code des Zeichens ist, dass du beim ersten Aufruf von int 21h, 01h eingelesen hast).
    Logisch, dass da nur Mist bei rauskommt, wenn du diesen Zeiger einfach irgendwo hin verbiegst...

    Um hier etwas vernuenftiges herauszubekommen, solltest du zunaechst erstmal deinen Code um eine Pruefung erweitern, die sicherstellt, dass tatsaechlich nur Ziffern von 0-9 (oder eben in den Grenzen des Zahlensystems, dass du verwenden willst) eingegeben wurden.

    Danach waere es sinnvoll, die eingegebenen ASCII-Werte in einfache Zahlen umzurechnen (merke: "0" hat den Code 30h, folglich musst du 30h von den eingelesenen Werten abziehen).

    Und zuletzt musst du nach der Addition die Zahl wieder in einen String umrechnen (Wie das geht wurde hier wirklich schon mehr als einmal gefragt; zB. hier). Den Zeiger auf diesen String uebergibst du dann int 21h,09h und schon hast du das gewuenschte Resultat auf dem Schirm. 🙂


Anmelden zum Antworten