Wert in Variable Speichern



  • Hallo ich hab ein Programm gemacht wo der Benutzer eine Eingabe machen muss am ende soll die Benutzer Eingabe auf dem Bildschirm angezeigt werden.

    Bis hier hin bin ich gekommen:

    .model small 
    .stack 100h 
    .data 
    
    MSG DB "Benutzer: $" 
    buffer db 256 dup (?) ,"$"
    
    .CODE 
    ENTRYPOINT: 
    
            mov AX,@DATA 
            mov DS,AX 
    
            mov DX,OFFSET MSG 
    
            mov AH,09H 
            int 21h 
    
        MOV AH,0aH  ;string eingeben 
        MOV buffer,AH 
        int 21h 
    
        mov DX,offset buffer ;string ausgeben 
        mov ah,13h 
        int 10h 
    
        ;Programm beenden 
    Ende: 
    
        mov AH,4CH 
        int 21h 
    
    END ENTRYPOINT 
    END
    

    Ich hab irgendwo gelesen das dass irgendwie so gehen soll aber dann bekomme ich immer die Meldung: Operand types does not match

    Ich Programmier mit TASM

    .model small 
    .stack 100h 
    .data 
    
    MSG DB "Benutzer: $" 
    buffer db 256 dup (?)
    
    .CODE 
    ENTRYPOINT: 
    
            mov AX,@DATA 
            mov DS,AX 
    
            mov DX,OFFSET MSG 
    
            mov AH,09H 
            int 21h 
    
        MOV AH,0aH  ;string eingeben 
        MOV buffer,AH 
        int 21h 
    
    	mov bl, byte ptr [buffer+1] 
    
    	add bx, buffer+2 
    	mov byte ptr [bx], "$" ; Text mit $ abschliessen 
    
    	mov dx, buffer+2 
    	mov ah, 09H 
    	int 021H
    
        mov ah,13h 
        int 10h 
    
        ;Programm beenden 
    Ende: 
    
        mov AH,4CH 
        int 21h 
    
    END ENTRYPOINT 
    END
    

    Aber jetzt komm ich einfach nich mehr weiter ich sitz da schon den ganzen Tag dran.

    Kann mir wer vielleicht einfach den Korrigierten Quelltext posten ?



  • Ich habe mir das ganze mal angesehen du hast diverse kleine Fehler die
    vllt aus Unwissendheit enstanden sind was ja nciht schlimm ist.

    Wenn du einen Buffer für die Eingabe mit dem INT 21(Speziell der Vector 0AH) verwendest solltest du auf den folgenden Aufbau des Buffers achten:

    ----------------------------------------------------------------------
      |  Max  |  Anzahl|                                          |   CR   |
      |Zeichen| Einhabe|           Bytes des Strings              | Zeichen|
      |  Byte |  Bytes |                                          |  Byte  |
      ----------------------------------------------------------------------
       | ___________|     |                                                  
       | |                |
       | | _______________|             
       | |  |
       | |  |--> Die Einzelnen Bytes die Über das Interuot eingeben werden
       | |
       | |-----> Das Interrupt 21(Vector 0AH) Nutzt dieses Byte
       |         um die Anzahl der Eingebenen Zeichen zu Speichern.
       |         Es sollte daher vorher auf 0 gesetzt werden da es immer nur
       |         Um eins erhöht wird.
       |
       |-------> Weiterhin verfügt dieser Interrupt Vektor noch die Möglichkeit
                 Zu Sagen das man nur eine bestimme Anzahl von Zeichen Aktzeptiert.
                 Ist die Ereicht werden keine Zeichen mehr entgegen genommen.
    
       -------> Das CR Zeichen steht hinter dem Letzten Eingebenen Zeichen
                Es wird nach betätigen der Enter Taste gesetzt.
    

    So das erst mal als Vorabinformation das sollte man wissen wenn man Strings über das Interupt 21 einlesen möchte.

    Und dein zweiter Fehler ist das du das Interupt 10 Falsch verwendest
    Das Interupt erwartet nicht das du in DX den Offset des String movest.
    Er sollte nach ES:BP gemovet werden.

    Ich habe das jetzt alles mal mit int 21 Programmiert vllt hilt es dir ja:)
    Wenn du Fragen hast einfach Fragen:)
    Aber ich denke die Kommentare sollten reichen:)

    :xmas1:

    .model small
    .stack 256
    
    .data
    
    MSG       DB "Benutzer: $"
    buffer    DB 10,0,12 dup(".")       ;Länge des Buffers ergibt sich aus den Max Zeichen
                                        ; + 3 Byte für das CR Zeichen sowie 2 Byte 
                                        ;für Maximale Eingabe und Anzahl der Eingebenen Zeichen.
    ENDL      DB 10,13,"$"
    
    .CODE
    
    ENTRYPOINT:
    
              mov AX,@data              ;AX < - DATA Segment Addresse 
              mov DS,AX                 ;Data Segment Pointer <- AX
    
              mov DX,OFFSET MSG         ;DX <-Offset Addresse von MSG   
              mov AH,09H                ;Wahl des String Ausgabe Vectors des INT 21
              int 21h                     
    
              mov AH,0AH                ;Wahl des String Eingabe Vectors des INT 21
              mov buffer,10             ;Setzen des 1 Bytes des Buffers auf die Maximalgröße der Eingabe
              mov DX,OFFSET buffer      ;DX <-Offset Addresse vom Buffer          
              int 21h
    
              mov DX,OFFSET ENDL        ;DX <-Offset Addresse von ENDL(Zeilenumbruch)  
              mov AH,09H                ;Wahl des String Ausgabe Vectors des INT 21
              int 21h
    
              mov CL,buffer+1           ;CL <- Anzahl der Eingebenen Zeichen
              mov SI,OFFSET buffer+2    ;Setzen des SI Pointers auf das erste Zeichen im Buffer  
    DISP: 
              mov DL,[SI]               ;DL < - Des An Si befindlichen Bytes nach DL         
              mov ah,02H                ;Wahl des Zeichen Ausgabe Vectors des INT 21  
              int 21H
              inc SI                    ;Incrementieren des SI Pointers   
              loop DISP                 ;For Schleife Wiederhole Solange CL > 0 
    
    Ende:
              mov AH,01H                ;Wahl des Zeichen Eingabe Vectors des INT 21  
              int 21H                   ;Wartet auf eine Eingabe eines Users  
    
              mov AH,4CH                ;Wahl des Ende Vectors des INT 21 
              int 21h                   ;Programm beenden
    
    END ENTRYPOINT
    END
    

Anmelden zum Antworten