Eingelesenen String ausgeben (int 21h)
-
Hallo,
wie kann ich eine Zeichenkette, die ich über AH,0AH/INT 21h eingelesen habe, ausgeben? Also ich versuche sie ganz normal über AH,09H/INT 21h auszugeben. Aber da bekomme ich nur eine leere Zeile. Hier habe ich gelesen, dass ich den String anders terminieren muss. Aber der dort gepostete Code funkioniert bei mir nicht.
-
Hi.
Funktion 0Ah terminiert den eingelesenen String nicht wirklich. Wenn mit ENTER bestaetigt wird, ist das letzte Zeichen CR.
Um den eingelesenen String mit Funktion 09h auszugeben, musst du hinter das letzte eingelesene Zeichen "" zu platzieren.BTW:
Der Thread enthaelt an sich keine Fertigloesung... Welchen Code hast du verwendet? Der von malfunction funktioniert so in der Tat nicht. Es muss AFAIK 13 oder 0Dh und nicht 13h heissen, davon mal abgesehen ist der Code ansonsten aber auch nicht gerade effizient.
-
Okay, danke.
Ich habe jetzt den Code von malfunction genommen und mit 13 statt 13h funktioniert's. Aber wie muesste der Code den lauten, damit er deiner Meinung nach effizient ist? Ist doch eigentlich schon ganz in Ordnung (zumindest aus der Sicht eines Anfaengers). Ob man in CX nun die Laenge des Strings oder -1 hat, ist doch eigentlich egal, oder?
-
Jo, was bei diesem Code in cx steht ist wirklich egal, solange es unsigned >127 oder =0 ist. Aber wenn du dir die Funktionsweise des Codes mal genau anschaust, wird dir auffallen, dass dort etwas komplett anderes passiert, als ich vorgeschlagen habe:
Dort wird der String nach dem ersten Vorkommen von CR durchsucht und dieses Zeichen durch "$" ersetzt.Ich habe vorgeschlagen, den String gar nicht erst lange zu durchsuchen, sondern direkt die von DOS gelieferte Laenge des Strings zu benutzen, um "$" ans Ende des Strings zu packen.
Solltest du mal ein bissel drueber sinnieren. Ist mit wenigen Zeilen (weniger als der Code hat, den du gerade benutzt) zu realisieren und IMHO eine gute Uebung.
-
Also meintest du das etwa so?
xor bx,bx ;BX auf NULL setzen mov si,Offset StrLen ;SI zeigt auf StrLen mov bl,[si] ;BX enthält die Laenge des Strings (StrLen) mov si,offset InputStr ;SI zeigt auf den String (InputStr) MOV BYTE PTR DS:[si+bx],"$" ;Letztes Byte (Offset+Laenge) auf "$" setzen
Kuerzer schaff ich das erstmal nicht. Aber ist ja immerhin zwei Zeilen kuerzer als malfunction's Code. Wenn du noch Optimierungs-Vorschlaege hast wuerde ich mich freuen. Die Benennung mit StrLen und InputStr habe ich aus dem anderen Thread von dir übernommen.
Ach ja:Der Thread enthaelt an sich keine Fertigloesung
Du koenntest ja malfunction's Code editieren. Also '13' statt '13h'. Dann gaebe es eine Fertigloesung, die auch funktioniert.
-
Jo, so etwa meinte ich das.
Mein Vorschlag waere gewesen:
xor bx,bx ;BX auf NULL setzen mov bl,byte ptr ds:[StrLen] ;BX enthält die Laenge des Strings (StrLen) MOV BYTE PTR DS:[InputStr + bx],"$" ;Letztes Byte (Offset+Laenge) auf "$" setzen
Overflow schrieb:
Du koenntest ja malfunction's Code editieren. Also '13' statt '13h'. Dann gaebe es eine Fertigloesung, die auch funktioniert.
Jo, nachdem ich des jetzt gesehen habe, koennte ich das wohl machen - wiederstrebt mir aber so ein wenig, da dieser Code eh nicht so ganz das Wahre ist. Mal sehen, sollte mein Vorschlag auch funkionieren, schreibe ich vielleicht ganz fies malfunctions Beitrag um.
-
Nobuo T schrieb:
Jo, so etwa meinte ich das.
Mein Vorschlag waere gewesen:
xor bx,bx ;BX auf NULL setzen mov bl,byte ptr ds:[StrLen] ;BX enthält die Laenge des Strings (StrLen) MOV BYTE PTR DS:[InputStr + bx],"$" ;Letztes Byte (Offset+Laenge) auf "$" setzen
Hm, drei Zeilen aus urspruenglich sieben. Nicht schlecht. Funktioniert auf alle Faelle auch und ist IMHO wirklich FAQ-tauglich. Also vielen Dank fuer die Hilfe.