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 ""terminiertenString(praktischeinArrayvonbytes)entgegen.Dh.dieseFunktionwirdbeginnendbeimgegebenenOffsetsolangeinkrementellZeichenvomSpeicherlesenundausgeben,bisdasZeichen"" terminierten String (praktisch ein Array von bytes) entgegen. Dh. diese Funktion wird beginnend beim gegebenen Offset so lange inkrementell Zeichen vom Speicher lesen und ausgeben, bis das 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.


Anmelden zum Antworten