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= ',''
daten ends ;5code segment
assume cs:code
start:
mov ax, seg daten
mov ds, ax ;10mov ah, 09h
mov dx, offset intro1
int 21h
;15
mov ah, 1h
int 21hpush ax
;20
mov ah, 09h
mov dx, offset intro2
int 21hmov ah, 1h ;25
int 21hmov bl, al
pop ax
add bx, ax ;30mov ah, 09h ;+++++++++++++++++++++++++++++
mov dx, ax ;hier liegt, glaube ich, irgendwie der Fehler
int 21h ;+++++++++++++++++++++++++++++
;35
mov ah, 1h
int 21hmov ax, 4c00h
int 21h
code ends
end startWä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.