Wieso wird hier Text ausgeben ?



  • Hallo,

    wieso wird hier der Text ausgeben welchen ich eingebe.

    Ich habe doch in Zeile 60 gar keinen Text ausgabe Befehl eingesetzt.

    Ich gebe z.b. ein: 12

    Dann sieht das ja auf der Konsole so aus:

    Eingabe: 12

    Wenn ich jetzt die Enter Taste drücke dann sieht es so aus:

    Eingabe: 12
    12

    Kann es sein das die 12 einfach nur eine Zeile heruntergeschoben wurde ohne das Wort Eingabe mit runter zu schieben ?

    .model small
    .stack 100h
    
    .data
    
    endl db 10,13, "$"
    eingabe db "Eingabe: $"
    
    puffer struc
    		max db 3 
    		anz db ? 
    
    		txt db 3 (?)
    
    puffer ends
    
    buffer puffer <>
    
    .code
    start:
    
    	mov ax,@data
    	mov ds,ax 
    
    	mov dx,offset eingabe
    	mov ah,9h
    	int 21h
    
    	mov dx,offset buffer
    	mov ah,0ah	
    	int 21h
    
    	mov bx,dx 
    
    	add bx,2            
    	add bl,buffer.anz  
    	adc bh,0   
    
    	mov word ptr [bx] , 0D0AH 
    	mov byte ptr [bx+2] , "$"
    
    	mov dx,offset endl
    	mov ah,9h
    	int 21h
    
    	mov dx,offset buffer.txt
            ; text wird ausgeben ohne mov ah,9h ??
    	int 21h
    
    	mov ah,4ch
    	int 21h
    
    end start
    


  • Solange der Interrupt ein Register nicht überschreibt bleibt der Inhalt erhalten. In Zeile 55 setzt du ah auf 9h und der Interrupt überschreibt (laut http://spike.scu.edu.au/~barry/interrupts.html) nur al. Also ist ah immer noch 9h und du brauchst es nicht nochmal zu setzen.



  • Was sollte denn deiner Meinung nach stattdessen bei dem vorletzten Aufruf von int 21h passieren? Das "mov ah, 09h" ist schliesslich nicht "der ausgabe Bebefehl", sondern das Aufrufen von int 21h mit ah=09h bewirkt eine Textausgabe. Zufaellig veraendert int 21h, ah=09h ah offenbar nicht, so dass nach dem Aufruf in Zeile 56 weiterhin 09h in ah steht. Schau dir das Ganze doch am besten mal in einem Debugger an.

    Uebrigens ist das letzte Zeichen in puffer.txt ein CR, wenn du die Eingabe mit ENTER abschliesst. Weiter solltest du es vermeiden, einfach so in unzugeordnete Speicherbereiche zu schreiben (Zeile 50-51). Das ist im Prinzip ein Buffer overflow, was du da fabrizierst - mit all den potentiellen negativen Auswirkungen. Da passiert es sehr schnell, dass entweder deine geschriebenen Daten, oder irgendwelche zuvor an der ueberschriebenen Stelle abgelegten Daten zerballert werden. Einfache Loesung waere, den Puffer entsprechend groesser als den im max-Feld eingetragenen Wert zu machen.



  • k ty jetzt hab ichs verstanden.

    Diese Zeilen hab ich aus meinem Buch.

    mov word ptr [bx] , 0D0AH 
    mov byte ptr [bx+2] , "$"
    

    Und der pufferm muss dann so aussehen z.b.?

    puffer struc 
            max db 3 
            anz db ? 
    
            txt db 20 (?) 
    
    puffer ends
    


  • Nochmal ein kleiner Test ob ich es verstanden habe^^

    Das hier funktioniert nicht weil:

    mov ax,@data überschreibt den wert von ah

    Stimmt das so ?

    .model small
    .stack 100h
    .data
    
    ausgabe db "hallo$"
    
    .code
    
    start:
    
    mov ah,9h
    
    		mov ax,@data
    		mov ds,ax
    
    		mov dx,offset ausgabe
    
    		int 21h
    
    		mov ah,4ch
    		int 21h
    
    end start
    

    So funktioniert es natürlich:

    .model small
    .stack 100h
    .data
    
    ausgabe db "hallo$"
    
    .code
    
    start:
    
    		mov ax,@data
    		mov ds,ax
    
    		mov ah,9h
    		mov dx,offset ausgabe
    		int 21h
    
    		mov ah,4ch
    		int 21h
    
    end start
    


  • Der Puffer muss natuerlich nur so viele Bytes groesser sein, wie du anhaengen willst. Also hier wohl 3 Byte.

    Und ja: Wenn du ax ueberschreibst, werden sowohl al, als auch ah ueberschrieben. Siehe auch EAX ... AX


Anmelden zum Antworten