Anfänger Braucht hilfe



  • Ich versuche hier Krampfhaft mit TASM eine Eingabe und danach das Eingegeben wieder auszugeben, es will mir einfach nicht gelingen, kann mir da jemand helfen?

    TITLE Das erste Programm			
    IDEAL						
    MODEL SMALL					
    STACK 100					
    DATASEG						
    	eingabepuffer DB ?
    
    CODESEG						
    start:						
    	STARTUPCODE
    
    	  MOV AH,0Ah
    	  LEA DX,[eingabepuffer]
    	  MOV AH,09h
              LEA DX,[eingabepuffer]
    	  INT 21h
    	EXITCODE
    
    END start
    

    muss dazu sagen das ich teilweise den code aus einer tutorial seite habe, zumindest die eingabe, zurzeit funktioniert es gar nicht mehr...
    Wenn ich den Code via Console mit tasm compilere und tlink linke und danach ausführen will kriege ich haufen Fehler und die Console Piept ein wenig, was mache ich falsch, bitte um erklärung.

    Danke und schönen abend noch



  • Vielleicht zu Anfang:
    Die DOS-API funktioniert ueber Aufrufe von int 21h.
    Dabei wird eine Funktionsnummer ueber das ah-Register eingestellt, weitere Parameter werden je nach Funktion in anderen Registern ausgetauscht.

    Eine gute Uebersicht ueber Interruptfunktionen allgemein und auch der DOS-API gibt zB. Ralf Browns Interrupt Liste (suchen).

    Firefighter schrieb:

    Ich versuche hier Krampfhaft mit TASM eine Eingabe und danach das Eingegeben wieder auszugeben, es will mir einfach nicht gelingen, kann mir da jemand helfen?

    Dazu waere folgendes noetig:
    Ein Eingabepuffer folgender Form (Werte muessen also vorher gesetzt werden!) :

    Pseudocode:
    byte MaxBufferSize
    byte CharsRead
    byte[MaxBufferSize+2] Buffer

    Diese Struktur kannst du dynamisch zur Laufzeit erzeugen (zB. Stack) oder du packst sie statisch ins Programm.

    Fuer uninitialisierte Daten hat TASM das "udataseg".
    Mehrere Bytes (zB. fuer einen String oder so einen Puffer) reserviert man in TASM zB. mit "eingabepuffer db [size] dup (?)" ([size] durch die konstante Zahl der zu reservierenden Bytes ersetzen).

    Die Adresse zu diesem Puffer uebergibst du der DOS-Funktion 0x0a (buffered keyboard input) in (ds:)dx.

    Um den String wieder auszugeben nimmst du die DOS-Funktion 0x09. Diese gibt mit ""terminierteStringsaus.DereingeleseneStringistabermiteinemCRterminiert.AlsomusstduvorderAusgabenochdas"" terminierte Strings aus. Der eingelesene String ist aber mit einem CR terminiert. Also musst du vor der Ausgabe noch das "" an das Ende des eingelesenen Strings setzen.

    Firefighter schrieb:

    Wenn ich den Code via Console mit tasm compilere und tlink linke und danach ausführen will kriege ich haufen Fehler und die Console Piept ein wenig, was mache ich falsch, bitte um erklärung.

    Was fuer Fehler?
    Dass die Konsole Piept, liegt daran, dass du mit deinem Programm einen Haufen Datenschrott in die Konsole trichterst, worunter auch einige \a's sein duerften.
    Dazu kommentiere ich mal deinen Code:

    TITLE Das erste Programm			; nette Spielerei - praktisch aber etwas ueberfluessig, diese Zeile
    IDEAL		; Schaltet in den eigentlichen TASM-Modus	
    MODEL SMALL	; Speichermodell - hier also Code in einem, Daten in einem anderen Segment
    STACK 100	; Groesse des Stacks
    DATASEG		; leitet eigentlich Segment fuer initialisierte Daten ein...
    	eingabepuffer DB ? ; reserviert 1(!) uninitialisiertes Byte, das ueber das Label "eingabepuffer" adressiert werden kann.
    ; fuer den Zweck, einen String mit DOS-Funktion 0x0a einzulesen also voellig
    ; ungeeignet.
    
    CODESEG		; Code Segment
    start:		
    	STARTUPCODE
    
    	  MOV AH,0Ah      ; ah = 0ah
    	  LEA DX,[eingabepuffer]   ; lea laedt das resultierende Offset der im 2. Operanden gebildeten Speicheradresse.
    ; Fuer so ein einfaches, konstantes Offset macht das allerdings wenig Sinn.
    ; TASM optimiert sowas folgerichtigerweise automatisch zu
              mov dx, offset eingabepuffer ;<- waere sinnvoller so.
    ; beide Zeilen bewirken dx = offset eingabepuffer
    ; So allerdings reichlich witzlos, wenn du nun nicht auch die DOS-API ueber
    ; int 21h aufrufst.
    ; wird wie weiter oben gesagt aber so nicht funktionieren.
    
    	  MOV AH,09h     ; ah = 9
              LEA DX,[eingabepuffer] ; dx = offset eingabepuffer
    	  INT 21h        ; DOS-API, Funktion 9 aufrufen
    ; => gibt $-terminierten String bei ds:dx aus. Hier nur uninitialisierter
    ; Datenmuell.
    	EXITCODE  ; beenden
    
    END start
    

    Firefighter schrieb:

    muss dazu sagen das ich teilweise den code aus einer tutorial seite habe, zumindest die eingabe, zurzeit funktioniert es gar nicht mehr...

    Keine Ahnung, wie dein Code zustande gekommen ist, aber ich wuerde vorschlagen, du arbeitest erstmal ein ordentlichen Tutorial durch, um eher ein Gefuehl fuer den TASM zu kriegen...



  • kannst du eventuell einen kleinen beispielcode mit erklärung wie gerade um eine eingabe/ausgabe zu realisieren? wäre echt nett von dir


Anmelden zum Antworten