DOS - Zeichenfolge einlesen??



  • Hi,
    wie kann ich ne Zeichenfolge einlesen und in der var abspeicher??
    Bin etwas angefangen,nur das klappt nicht

    .DATA
    eingabe DB 10 DUP(?)
    
    .CODE
    
    START:
         mov ax,@DATA
         mov ds,ax
         mov ah,08h
         int 21h
         mov dx,OFFSET eingabe
         mov eingabe,al
         mov ah,02h
         int 21h
    
    END
    

    nur egal welches Zeichen ich eingebe, der gibt mir imemr so nen komischenpfeil nach oben aus 😞

    [ Dieser Beitrag wurde am 28.12.2002 um 19:58 Uhr von Nobuo T editiert. ]



  • Also wenn du nicht unbedingt BIOS Interrupt Funktionen zum einlesen benutzen musst, kannst du am besten Int 21h/AH=0Ah nehmen. Die liest einen String ein und speichert ihn samt dem terminierendem 0Dh / 13 (enter). Die Funktion selbst muss ich ja wohl nicht erklären (siehe Ralf Brown's Interrupt List, Link findest du sicherlich in der FAQ).
    Wenn du den String dann allerdings anders terminiert haben willst (z.b. nullterminiert oder ""terminiert),dannmusstdudasschonselbstmachen.HiereinwenigCode,derdas0Dhin"-terminiert), dann musst du das schon selbst machen. Hier ein wenig Code, der das 0Dh in '' ändern sollte (für Ausgabe via Int 21h/AH=09h):

    mov ax,segment eingabe
    mov es,ax
    mov di,offset eingabe
    mov cx,-1
    mov al,13
    repnz scasb
    mov byte ptr es:[di-1],'$'
    

    Ich hoffe mal der Code klappt so. Real Mode asm ist lang her bei mir und ich hab gerade keine Gelegenheit den Code zu testen.

    [edit]
    Der oben vorgestellte Code durchsucht einen String nach dem ersten Vorkommen von 0Dh und ersetzt es mit "$".

    Im Zusammenhang mit der Funktion 0Ah gibt es allerdings auch die Moeglichkeit, mit Hilfe der von DOS gelieferten Laenge des Strings, "$" direkt ans Ende des Strings zu setzen, ohne diesen vorher lange durchsuchen zu muessen.
    Hier ein Beispiel:

    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
    

    Korrektur: 13 wurde mit 13h verwechselt
    [/edit]



  • hmm ok ich rufe die 0Ah funktion auf, nur leider tut sich dann gar nichts,sondern die anwendung wird einfach beendet.
    ich hab es einfach nur so gemacht

    mov ah,0Ah 
       int 21h
    

    sollte ja richtig sein.



  • Hi,

    so einfach ist das leider nicht.
    Allein durch logisches Denken sollte dir auffallen, dass Du dieser DOS-Funktion so noch nicht mal eine Speicheraddresse uebergeben hast, bei der die eingelesene Zeichenfolge abgelegt werden soll. 🙄
    Lies dir am besten die Beschreibung zum int 21h Funktion 0Ah in Ralf Browns Interrupt Liste nochmal genauer durch.



  • hmm doch ich habe ihm ja gesgat wo er es ablegen soll, nur nicht mit gepostet.
    so entnehme ich es jedenfalls aus meiner interrupt tabelle die ich heir habe.

    .DATA
           eingabe db10 DUP(?)
    
        .CODE
        mov ax,@DATA
        mov ds,ax
        mov dx,OFFSET eingabe
        mov ah,0Ah
        int 21h
        jmp ENDE
    ;hier kommt noch des ENDE Label + code
    

    also die Funktion 0Ah brauhct doch die Speicheradresse in dx und die geb ich ihm ja mit offset eingabe ....



  • Jo, is soweit ok.

    Nur in der Array fuer "eingabe" fehlt noch was...
    Ich hab da z.B. in den letzten Zeilen der Beschreibung der Funktion 0Ah noch sowas gelesen:

    Format of DOS input buffer:

    Offset Size Description (Table 01344)
    00h BYTE maximum characters buffer can hold
    01h BYTE (call) number of chars from last input which may be recalled
    (ret) number of characters actually read, excluding CR
    02h N BYTEs actual characters read, including the final carriage return

    Praktisch muesste das in deinem Code dann so aussehen:

    .DATA
           eingabe db 10 ;so viele Zeichen koennen im Puffer maximal abgelegt werden...
                   db 00 ;wird vom Interrupt gesetzt (gelesene Zeichen)
            db 10 DUP(?)
    
        .CODE
        mov ax,@DATA
        mov ds,ax
        mov dx,OFFSET eingabe
        mov ah,0Ah
        int 21h
        jmp ENDE
    ;hier kommt noch des ENDE Label + code
    

Anmelden zum Antworten