Problem mit Array
-
Hallo wenn ich hier z.b.die Werte 1 und 2 eingebe.
Dann sollte doch eigentlich die 1 in var[0] stehen oder?
Aber wenn ich mir var[0] am ende ausgeben lasse dann bekomme ich als Ausgabe 12
Was mache ich da falsch?
.model small .stack 900h .data var db 10,13, 10 dup (?) , "$" .CODE start: mov ax,@data mov ds,ax mov cx,2 eingabe: inc bx xor ah,ah mov ah,01h int 21h mov var [bx] , al loop eingabe mov dx,offset var[0] mov ah,9h int 21h mov ah,4ch int 21h END start
-
"offset var[0]" liefert dir das offset (ein Adressteil), des ersten Elements des Speicherbereichs bei "var". Das entspricht also praktisch "offset var". Wenn du dir das mal ansiehst, steht bei diesem Offset ein Byte mit Wert 10.
int 21h, Funktion 9 nimmt in dx das Offset zu einem mit dem Zeichen "" vom Speicher geladen wird.
Was du sonst noch beachten solltest:
in der Schleife "Eingabe" (Zeile 17-27) benutzt du bx als Zeiger in dein Array, ohne bx zu initialisieren. Wenn du die beiden Bytes 10 und 13 am Anfang des Arrays "var" nicht ueberschreiben willst, solltest du bx also vor der Schleife auf 1 setzen.In Zeile 19 und 21 setzt du zuerst ah auf 0, um es direkt danach auf 1 zu setzen. Wenig sinnvoll.
-
Hallo ich habe das jetzt so gelöst:
Ist das so sinnvoll oder kann man das noch besser lösen ?
.model small .stack 900h .data var db 10 dup (?) , "$" nr db ? , "$" endl db 10,13 , "$" .CODE start: mov ax,@data mov ds,ax mov cx,2 xor bx,bx ; bx = 0 eingabe: mov ah,01h int 21h mov var[bx], al ; bx = 0 der erste werte steht also in var[0] inc bx ; bx = 1 also steht der zweite wert in var[1] loop eingabe mov dx,offset endl mov ah,9h int 21h mov dl,var[0] ; erster wert des arrays mov nr ,dl mov dx,offset nr mov ah,09h int 21h mov dx,offset endl mov ah,9h int 21h mov dl,var[1] ; zweiter wert des arrays mov nr ,dl mov dx,offset nr mov ah,09h int 21h mov ah,4ch int 21h END start
-
Hallo weiss den keiner ob man das noch besser lösen kann ?
-
Einige kleine Vorschlaege:
Das "mov ah, 01" in Zeile 24 kannst du auch vor der Schleife "eingabe" platzieren.
Alternativ kannst du auch einen buffered input (int 21h, Funktion 0ah) benutzen.Um einzelne Zeichen auszugeben bietet DOS eigene Funktionen an. Eine davon ist AFAIR int 21h, Funktion 06h.
Unabhaengig davon, dass es ungeschickt ist, eine String-Ausgabe zum Ausgeben einzelner Zeichen zu benutzen, solltest du es wenn moeglich vermeiden, direkt aufeinander folgende Operationen auf dem selben Register auszufuehren.