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
12Kann 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