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 :

[TASM] Fonction de recherche de fichiers : problème de lecture en DTA


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut [TASM] Fonction de recherche de fichiers : problème de lecture en DTA
    Bonsoir,
    je débute en Assembleur, j'essaye de coder en 16 bits un petit programme qui fait appel à l'interruption 21h : 4Eh du DOS qui cherche un fichier sur le disque dur. La recherche s'effectue mais, quand j'essaye de récuperer le nom du premier fichier, j'ai un tas de chaînes bizarres. Voici mon code :
    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
    37
    38
    39
    40
    41
    42
     
    .386
    code segment use16
    assume cs:code,ds:data,ss:pile
    debut : 
    mov ax,data
    mov ds,ax
     
     
    MOV AH,4Eh
    MOV DX,offset ext
    XOR CX,CX
    int 21h
    JC erreurs
    MOV AH,09h
    MOV Dx,ds:80H+1Eh
    int 21h
    MOV ah,09h
    MOV DX,offset reu
    INT 21h
    MOV AH,4Ch
    int 21h
     
    erreurs :
    MOV AH,09h
    MOV DX,offset erreur
    int 21h
    mov ah,4ch
    int 21h
     
     
    code ends
    data segment use16
    reu db 10,13,"reussie",'$'
    ext db "*.TXT",00h
    erreur db 10,13,"erreur d'ouverture",'$'
     
    data ends
    pile segment stack
     
    pile ends
    end debut
    Je suis sous WIN XP , j'utilise TASM
    Merci d'avance

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut :(
    toujours pas de réponse
    Je vais me réexprimer : la DTA contient les informations relatives à la recherche effectuée par l'interruption 4e dos , elle contient notemment le nom du premier fichier trouvé qui est enregistré à l'adresse 1E de la DTA , cette DTA se trouve dans le PSP du programme EXE , et mon probléme c'est que je ne peux pas accéder l'adresse exacte de la DTA pour récupérer le nom du premier fichier trouvé et l'afficher à l'ecran .
    Voilà
    qui peut m'aider ???

  3. #3
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Hello,

    Je me jette à l'eau...

    As tu pensé à initialiser l'adresse de la DTA ? (fonction 1Ah)

    a+ François

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    bonsoir Forthman
    et si j'initialise la DTA , elle sera dans quelle adresse ??
    merci

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    J'ai cherché un peu sur le net, l'interruption 1Ah permet de déplacer la DTA , mais je ne sais pas la nouvelle adresse à laquelle elle sera déplacée :
    Usage de 1Ah (net) :

    AH = 1A
    DS:DX = pointer to disk transfer address

    De l'aide ?

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    En fait, tu définis toi-même à quelle adresse tu veux que la fonction DOS
    renvoie les infos

    les infos sont contenus dans 128 octets (normalement)
    donc dans ton segment de données, du définis une zone de 128 octets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    adrdma db 128 dup(0)
    puis dans ton code, tu initialises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    setdma:
    mov dx,offset adrdma
    mov ah,1Ah
    int 21h
    c'est pas plus compliqué

    a+ François

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    merci pour ton aide , mais je suis un peu planté , voila j'ai deplacé la DTA , mais pour lire le nom du fichier (se trouvant à l'adresse 1Eh de la dta) je fait comment ?

    j'utilise ça mais sans résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MOV AH,09h ; interruption dos pour afficher 
    MOV Dx,offset adrdma + 1eh ;adrdma est la zone qui contient la dta
    int 21h
    Merci encore une fois

  8. #8
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    T'as de la chance, je suis de bonne humeur ce matin

    Si un fichier spécifié a pu être trouvé, MS-DOS charge dans la DMA 43 octets
    qui fournissent des informations sur ce fichier: (et non pas 128 comme je l'avais signalé plus tot )

    octets 0-20 : réservés à MS-DOS pour la recherche
    octet 21 : attribut du fichier
    octets 22-23 : heure de la dernière écriture
    octets 24-25 : date de la dernière écriture
    octets 26-29 : taille du fichier (26-27:partie basse,28-29:partie haute)
    octets 30-42 : nom complet du fichier sous forme de chaîne ascii0

    Alors le piège, c'est que la chaine dans la DTA est sous forme ASCII0
    (une chaine dont le caractère de fin est un octet = 00)
    alors que la fonction 09h de l'int 21h affiche une chaine de type ASCII$
    (chaine se terminant pas le code ASCII $ soit octet = 24h )

    pour afficher ton fichier, tu dois utiliser la fonction 02h (affiche un seul caractère),
    dans une boucle qui teste si le caractère à afficher est différent de 00h.
    Un truc comme un peu comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    affichefichier:
      mov bx,offset adrdma+1Eh
      boucle_affichefichier:
        mov dl,[bx]
        or dl,dl
        jz fin_affichefichier
        mov ah,02h
        int 21h
        inc bx
       jmp boucle_affichefichier
      fin_affichefichier:
    Ne pas oublier que la fonction 4Eh ne fait que la première recherche, pour
    les fichiers suivants, il faut utiliser la fonction 4Fh.

    a+ François

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Ce ne serait pas plus simple d'utiliser l'int 10h, fonction 13h, pour afficher une chaîne AZT ?

    Cf ce lien

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Oh , ça marche maintenant , merci Forth , ca marche à merveille

    Merci encore une fois et bonne journée

  11. #11
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Citation Envoyé par CP / M Voir le message
    Ce ne serait pas plus simple d'utiliser l'int 10h, fonction 13h, pour afficher une chaîne AZT ?

    Cf ce lien
    Hello,

    Dans ce cas il faut connaitre la longueur de la chaine, et donc faire
    une recherche du code ASCII0

    De plus, même si ce n'est pas un "vrai" DOS que l'on trouve sous XP, je préfère utiliser l'int 21h.

    a+ François

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Bonjour forthman,

    Dans ce cas il faut connaitre la longueur de la chaine, et donc faire
    une recherche du code ASCII0
    D'accord, mais si on affiche les 13 octets de 30 à 42 ?
    octets 30-42 : nom complet du fichier sous forme de chaîne ascii0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    affichefichier:
      pusha
      mov dl, colonne
      mov dh, ligne
      mov ah,13h
      mov al,1
      xor bh,bh
      mov cx,13
      mov bp,offset adrdma+1Eh
      int 10h
      popa

  13. #13
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Hello,

    Je ne sais pas si la fonction DOS écrase tous les octets ou s'il peut y avoir des "restes"

    sinon, ce que j'aime bien dans les fonctions DOS, c'est que l'on peut rediriger les sorties grâce à ">" vers un fichier, un port ...etc...

    Si ça peut te rassurer, moi aussi j'aime bien afficher les chaînes en connaissant à l'avance la longueur

    a+ François

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    J'ai du mal m'exprimer, car je ne comprends pas ta réponse .

    Je voulais dire (d'accord, je chipote) que je pense qu'il doit être possible d''utiliser la fonction 13h de l'int 10h en la forçant à afficher 13 octets à partir de DMA+1Eh en lieu et en place de l'int 21h, ce qui permettrait de sauter le recherche du code ASCII 0.
    Je sais, c'est pratiquement inutile, mais c'est juste pour savoir.

  15. #15
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Bien en fait, en utilisant la méthode de mouadestla, il n'y a pas véritablement
    de "recherche" de l'octet = à 00h
    On se contente juste d'afficher le caractère tant qu'il est différent de 00h

    Je viens de faire l'essai, les fonctions 4Eh et 4Fh, et les octets à la suite
    du nom de fichier sont bien remis à 00hh (et pas seulement 1 seul)

    Du coup ta méthode d'afficher systématiquement les 12 octets fonctionne

    a+ François

    edit : j'ai écrit d'afficher 12 octets car le 13ème est forcément un code 00h
    donc pas la peine de l'afficher

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Je ne sais pas si la fonction DOS écrase tous les octets ou s'il peut y avoir des "restes"
    OK, je comprends maintenant ce que tu voulais dire.

    edit : j'ai écrit d'afficher 12 octets car le 13ème est forcément un code 00h
    donc pas la peine de l'afficher
    Oui, évidemment, j'aurais pu y penser !

    Merci forthman !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/07/2010, 21h58
  2. Fonction de recherche de fichier en multi thread
    Par Takumi dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 22/11/2009, 23h10
  3. [VBA]Problème avec les critères d'une recherche de fichier
    Par lucho013 dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/04/2007, 23h40
  4. Réponses: 2
    Dernier message: 16/12/2006, 12h34
  5. Réponses: 3
    Dernier message: 10/08/2006, 20h04

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