IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Lire dans un fichier .txt


Sujet :

x86 16-bits Assembleur

  1. #1
    Invité
    Invité(e)
    Par défaut Lire dans un fichier .txt
    Bonjour,

    comme samlk, je cherche à faire un dictionnaire de mots.

    J'ai pensé le faire dans un fichier .txt, chaque mot étant séparer par un ; puis grâce à un random, on sélectionne un mot dedans pour le stocker dans une variable db.

    Mais est-ce possible de lire dans un fichier .txt en 8086 ? Si oui, comment ?

    Où dois-je m'en remettre également à tableau ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    un dictionnaire de mots sans définitions (ou autre méta donnée) de mots s'appelle une simple liste.

    la représentation la plus simple, sous forme de fichier texte, c'est de séparer chaque mot par un crlf (db 13,10) afin d'avoir un vrai séparateur.

    il ne faut pas utiliser de caractères de ponctuation pour la simple raison qu'ils peuvent servir à autre chose, comme par exemple, séparer le mot de sa définition ou d'un pointeur vers je ne sais quoi.

    donc pour lire le fichier texte, il faut utiliser les services de l'os pour l'ouvrir, puis le lire.

    sous dos, je te conseille les fonctions INT 21h: 3Ch, 3Dh, 3Eh, 3Fh, 40h et 42h, et un petit tour sur les nombreuses docs relatives à ces fonctions.

    la lecture de fichier se fait par blocs.
    les blocs peuvent être de taille variable, et sont limités à 65536 octets sous dos.

    une fois le bloc chargé en mémoire, il peut être parcouru sans problème avec des index, des pointeurs et des adresses fixes comme si ça faisait partie d'une section de données quelconque.

    si on dit qu'un mot est toujours terminé par un crlf, ou un autre char, il faudra juste parcourir l'ensemble de la mémoire contenant le fragment de fichier, et compter le nombre de fois que l'on croise le séparateur afin de ne pas se perdre.

    puis il sera utile de penser autrement le problème, avec par exemple, une structure qui permette d'accélérer les traitements.

    cette structure peut être construite à partir du fichier texte, ou directement dans el code source.
    la complexité de la structure dépendra du nombre de mots en gros. plus il y en aura, plus il faudra developper l'arborescence, pour que les temps d'accès soient réduits au minimum.
    par exemple, au delà d'une centaine de mots, il sera bon de les classer dans des listes, une par lettre de l'alphabet.
    A:
    B:
    C:
    ...
    pour un milliers de mots, il sera bon de les classer par lettres successives.
    A:
    .AA:
    .AB:
    .AC:
    ...
    .AZ:
    .B:
    ...

    et plus il y aura de mots, et plus il faudra developper un arbre dont les temps d'acces seront vraiment plus rapides qu'une liste, au lieu de parcurir une liste de 50000 mots, il suffira de parcourir les divers niveaux de l'arbre.

    la méthode, comme toujours, c'est de prendre un papier, un crayon, et de chercher comment ça marche manuellement avec des petits dessins, des flèches, et autres signes, composer un organigramme, puis traduire chaque étape en code assembleur.

    la réflexion personnelle est la base.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour tes précieux conseils.

    Pourrais-tu me donner un exemple précis pour ouvrir puis lire le contenu d'un fichier test1.txt qui contiendrait le mot test, que je cherche à lire ?

    Car j'ai fais des essaie, mais je ne suis pas sur d'avoir bien compris le fonctionnement de ces interruptions

    En fait, je ne vois pas comment on peut faire pour indiquer sur quel fichier on veut travailler (ouvrir puis lire) si ce n'est utiliser DS: DX car "Cette paire de registres permet d'indiquer l'adresse du nom de fichier sous forme de chaine de caractères ASCIIZ"

    EDIT : J'ai fais d'autre test, mais je me trompe surement sur le mov dx, de la fonction 3Dh



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    fich1 db 'test1.txt',00              (bien dans C:\emu8086\MyBuild\)
     
    mov ah,05      
    mov al,01       ; On change pour la page 01
    int 10h           
     
    mov ah,4Eh         ; Recherche du fichier
    mov dx,offset fich1
    int 21h
     
    mov ah,3Dh ; ouverture du fichier
    mov al,0 
    mov dx,offset fich1
    int 21h 
     
    mov ah,3Fh         ;lecture du fichier qui contient "test"
    mov cx,200
    int 21h
    Mais quand je test :
    "file does not exist:
    C:\emu8086\MyBuild\test1.txt
    interrupt error: 21h/3Dh : cannot open file."

    Pourrez-tu m'aider stp à compléter ce code d'exemple ?

    Merci d'avance.
    Dernière modification par Invité ; 04/06/2011 à 17h22.

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    bonsoir

    recherche de fichier me semble completement inutile.
    ainsi que le changement de page video texte.

    il faut atomiser le code, c'est à dire en isoler les parties independantes et integres de chaque action qu'il faut faire.

    donc, creer la fonction read:

    pour ça, il faut ouvrir le fichier avec une chaine contenant le chemin (complet de preference par la suite) du fichier, sauver le "handle" (poignée) depuis ax dans bx, et lire dans le fichier en utilisant le "handle", ce qui à pour effet de remplir une zone de mémoire n'importe où dans l'espace d'adressage, comme par exemple, dans le buffer reservé à la fin du code à cet effet.


    et au final, ça ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
            org 100h
            push word 0b800h
            pop es
            xor di,di
            call read
            mov si,buffer
            mov ah,56h
            call puts
            ret
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    puts:
    ;si=string
    @@:
            lodsb
            cmp al,0
            je @f
            stosw
            jmp @b
    @@:
            ret
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    read:
            mov ax,3D00h ; ouverture du fichier
            mov dx,fichier
            int 21h
            mov bx,ax ;important, raison de la nom lecture car le hanle passe de ax vers bx
            mov dx,buffer ;il faut lire dans le buffer
            mov ah,3Fh         ;lecture du fichier qui contient "test"
            mov cx,200
            int 21h
            ret
     
    fichier db 'test.txt',0   ;il y aura lieu de donner le chemin complet c:/test.txt dans le cas d'un test depuis d'autres volumes ou dossiers.
    buffer  rb 200 ;ici, on lit les données du fichier
            db 0  ;important, fin de texte asciiZ

Discussions similaires

  1. Lire dans un fichier .txt avec separateur
    Par seiken02 dans le forum C++Builder
    Réponses: 6
    Dernier message: 04/05/2010, 15h05
  2. Lire dans un fichier .txt
    Par donutsk8r dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/09/2009, 08h46
  3. Réponses: 2
    Dernier message: 19/03/2007, 17h38
  4. [VBS]Lire des données dans un fichier .txt
    Par kacxial dans le forum VBScript
    Réponses: 4
    Dernier message: 28/02/2007, 13h44
  5. lire dans un fichier .txt
    Par Baptiste Wicht dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/12/2005, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo