N
gamefreak schrieb:
In C bzw. C++ habe ich leichte Grundkenntnisse, diese beschränken sich jedoch auf simple Operationen sowie Schleifen. Leider nicht im Umgang mit Dateien, Handles und schon gar nicht Pointer.
Das sind IMHO wirklich denkbar schlechte Voraussetzungen zum Einstieg in Assembler. Ich wuerde wie gesagt empfehlen, dass du dir erstmal einen Ueberblick in C verschaffst.
gamefreak schrieb:
so richtig ist mir leider im Moment nicht klar, wie ich mit Hilfe der INterrupt-Routine einen bestimmten Textteil auslesen kann.
Wenn das z.B. mein Textinhalt ist und ich hier die 4. Zeile auslesen soll, weiss ich gerade nicht wie ich das realisieren kann.
Von sich aus kann DOS sowas nicht. Wenn du also keine Lib mit entsprechenden Funktionen hast (anzunehmen, wuesste gerade auch keine), musst du dir fuer diese Aufgabe also etwas selbst basteln. Das ist schon wieder recht fortgeschritten, also von Anfang an... erstmal musst du die Grundlagen beherrschen.
Also mal der Versuch einer kleinen Uebersicht dazu:
Ein Zeilenende wird in Windows/DOS idR. durch die Bytefolge 0dh, 0ah angezeigt.
Zur Datei-E/A in DOS:
DOS Arbeitet mit Datei-Handles.
Ein Datei-handle ist eine Nummer (bei DOS 16Bit lang), die eine aktuell geoeffnete Datei identifiziert. Du bekommst diese Nummer beim Oeffnen (Rueckgabe von Funktion 3dh in ax) gegeben und musst sie Funktionen, die mit dieser geoeffneten Datei irgendwie arbeiten sollen, wiederum uebergeben (meistens im Register bx).
DOS (uvm) verwalten intern fuer geoeffnete Dateien (also pro Datei-handle) einen Datei-Pointer, der auf das aktuelle Offset (in Byte gezaehlt) innerhalb der Datei zeigt. Beim Lesen/Schreiben wird dieser Pointer automatisch um die Zahl gelesener Bytes erhoeht.
DOS bietet folgende Funktionen, die fuer dich erstmal wichtig sein koennten (bitte naeheres in Interruptliste nachschlagen - alle sind jeweils Indizes von int 21h) :
3dh: Datei oeffnen
3eh: Datei schliessen (uebergebener Handle wird ungueltig/wieder frei)
3fh: Von Datei lesen
42h: Datei-Pointer setzen (oder mit al=01 und offset =0 auslesen)
Folgendes solltest du dir zudem anlesen, falls noch nicht bekannt:
Ein Ueberblick ueber den Befehlssatz der 286-CPU (Referenzen sind in den FAQ verlinkt).
Was ein Pointer/Zeiger grundsaetzlich ist.
Wie die Speicheradressierung damit im RealMode funktioniert (FAQ ->
Wie grundlegende Strukturen wie bedingte Bloecke (If-Bloecke) und Schleifen zu bauen sind.
Wenn du damit durch bist, sollte die grundsaetzliche Funktion von Datei-E/A, Speicheradressierung in DOS, etc. also erstmal klar sein. Wenn nicht, frage nochmal nach, bevor du dich darauf aufbauenden abstrakteren Aufgaben wie zB. dem Einlesen bestimmter Zeilen widmest.
Du willst also die 4. Zeile als String?
Mein Vorschlag dazu waere, du liest vielleicht ca. 512 Bytes in einen Puffer ein und bastelst dir dann eine Schleife, die die darin auftauchenden 0dh, 0ah zaehlt (oder evtl. eben auch nur die 0ah), bzw. bei jedem 0dh, 0ah wird ein Zaehler, der die gewuenschte Zeilennummer enthaelt, dekrementiert, bis dieser 0 wird oder die Datei zuende ist.
Dazu waere vielleicht die Befehlskombination "repnz scasb" recht praktisch.
Hm, ich hoffe, die Grundlegende Idee dazu ist mit diesem groben Hint in etwa klar geworden.