Dateizugriff
-
Hi, ich wuerde gerne auf eine Datei zugreifen und aus ihr byteweise lesen.
Hier mal kurz der Code:
.model tiny data segment filename db 'message.txt',0h data ends code segment assume cs:code,ds:data START: OEFFNEN: mov ah, 3dh ;oeffnen xor al, al ;read mov dx, ds:[offset filename] int 21h mov bx, ax ;Dateihandle von ax in bx mov ah, 42h ;Set Filepointer xor cx, cx ;auf den Anfang der Datei int 21h LESEN: mov ah, 3fh ;Zeichen einlesen mov cx, 1h ;1 Zeichen einlesen lea dx, offset buffer ;Hier habe ich jetzt keine Ahnung int 21h cmp ax, cx jne SCHLIESSEN SCHLIESSEN: mov ah, 3eh ;schliessen int 21h ENDE: mov ah, 4ch ;Ende int 21h code ends END START
Der Code ist noch nicht fertig, also nicht wundern, es geht mir erstmal nur um das Einlesen.
Die Funktion 3fh (INT 21h) schreibt ja die eingelesenen Daten in einen Puffer.
Soweit ich dass verstanden habe ins Datensegment. Genauer gesagt nach ds:dx.
Hier nun eine Frage, heisst das soviel wie "Anfang des Stacksegments + Addresse die in dx steht" und warum sind keine eckigen Klammer um dx also ds:[dx] ?Dann wuerde ich gern wissen, wenn meine Annahmen zu ds:dx richtig sind, wo ich das denn in das Datensegment schreiben soll? Ganz am Anfang vom Datensegment ist ja schon ein String, der Filename, den will ich ja nicht ueberschreiben, also welche Adresse soll in dx ?
So, und nun noch ein paar schnelle generelle Fragen:
1.: Muessen Labels immer beendet werden?
.code Start: Label1: ... END Label1 ... Label2: ... END Label2 END Start
2.: Ich habe mal soetwas gesehen:
code segment ;dies ist CS assume cs:code,ds:data,ss:stackSeg ;Definiert die einzelnen Segmente start: push data ;wir initialisieren die einzelnen pop ds ;Segmente... push stackSeg pop ss ends code data segment ... data ends
Muss man tatsaechlich noch die Adresse von data und StackSeg in die jeweiligen Register pushen? Warum reicht das "assume" nicht aus?
Vielen dank fuer die Anworten schonmal im Voraus, ich weiss, es ist ganz schoen viel
.
-
Warum reicht das "assume" nicht aus?
Weil es dem Assembler nur sagt, was er voraussetzen kann. Die Anweisung tut nichts, aber der Assembler weiß dann, dass zur Laufzeit die Segmentregister auf das angegebene Segment zeigen und kann dadurch entscheiden, über welches Segmentregister er Speicherzugriffe macht.
Ganz am Anfang vom Datensegment ist ja schon ein String, der Filename, den will ich ja nicht ueberschreiben, also welche Adresse soll in dx ?
Das musst schon du dir überlegen. Wenn du eine C-Library zur Verfügung hat, könntest du mit malloc einen Speicherblock allozieren. Oder du machst das auf den Stack. Oder du verwendest die DOS-Funktion 48h (glaub ich). Oder du reservierst statisch den Puffer im Datensegment (mit db ?). Oder du machst überhaupt ein eigenes Speichermanagement. Du hast unendlich viele Möglichkeiten.
-
XFame schrieb:
1.: Muessen Labels immer beendet werden?
Das waer mir neu.
"End Start" kennzeichnet das Ende des Codes - "Start" bezeichnet dabei den Einrtittspunkt des Programms (das Label "Start").XFame schrieb:
2.: [...]
Muss man tatsaechlich noch die Adresse von data und StackSeg in die jeweiligen Register pushen?Ein mov ist hier IMHO sinnvoller, da schneller.
Den Stack zu benutzen, bevor er richtig eingerichtet ist (ss gesetzt), ist zudem gefaehrlich. Gluecklicherweise wird ss AFAIR schon von MS-OS initialisiert, wenn du ein Stacksegment definierst. Damit kannst du dir das Ganze sparen.zB.
mov ax, data ;wir initialisieren die einzelnen mov ds, ax ;Segmente... mov ax, stackSeg ;<=muss nicht unbedingt sein. mov ss, ax
-
Ah, vielen Dank
.
Muss ein Start-Label vorhanden sein?
Wenn ja, muss es dann immer "Start" heissen?
-
1. Ja (oder je nach Assembler ein entsprechendes Schluesselwort).
2. Nein (siehe deinen Code im anderen Thread :D), was Aehnliches zu nehmen macht aber Sinn.