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.


Anmelden zum Antworten