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] BufferDiese 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 "" 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