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 :

Lecture de fichier


Sujet :

x86 16-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Lecture de fichier
    Hello, maintenant une autre petite question, quel est le moyen de lire le contenu d'un fichier ?? Car je n'y arrive pas avec les fonctions 3fh et 42h de l'int 21h... Can you help me ??

    [Modération, Alacazam : Merci de penser à mettre [RESOLU] quand c'est le cas ...]

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Pour lire un fichier, il faut tout d'abord que tu l'ouvres avec l'int 21h fct 3Dh. Il est très important que tu sauvegarde "l'handle du fichier". Puis après tu peux lire avec 21h(3Fh) et enfin tu le fermes avec 21h(3Eh). En gros, ça donne ça (vite fait).
    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
     
    mov ax,3D00h
    mov dx,offset namefile
    int 21h   ; le fichier est ouvert
    mov si,offset handle_file
    mov ds:[si],ax  ; on sauvegarde l'handle du fichier
     
    mov ah,3Fh
    mov si,offset handle_file
    mov bx,ds:[si]  ; on va rechercher l'handle du fichier
    mov dx,offset buffer_file
    mov cx,0001h ; on va lire un octet dans le fichier
    int 21h  ; on lit dans le fichier l'octet et il est placé dans buffer_file
     
    mov ah,3Eh
    mov si,offset handle_file
    mov bx,ds:[si]
    int 21h  ; on ferme le fichier
     
    ; au niveau des datas à définir
    namefile db 'file.txt',0 ; le 0 indique que le nom du fichier est fini
    handle_file dw ?  ; permet de stocker le No handle du fichier
    buffer_file db ?  ; buffer à ajuster selon le nombre d'octets
                            ; qu'on veut lire avec une interruption
    Evidemment, ce n'est que des bouts de programme. A toi de voir ce que tu veux en faire. De plus, si ça ne marche pas, vérifie tout d'abord que ton "ds" pointe bien vers le segment de donnée (en gros, s'il est initialisé correctement)
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci 'mage tophinus' , je n'ai pas encore essayer par manque de temps, mais est ce que cela me permet de lire a n'importe quel endroit du fichier ?? Si oui (de toute façon c'est oui ), comment ?? Merci.

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Il faut tout d'abord savoir qu'avec le 21h(3Fh), en gros la lecture, le programme se place automatiquement à l'octet suivant, c'est à dire que si tu lis le premier octet, il se placera sur le deuxième automatiquement, si tu aurais lu les deux premiers, il se serait placé sur le 3ème .... et ainsi de suite, je pense que tu as compris.

    Maintenant, si tu veux placer ton pointeur de fichier à un endroit précis, il existe le 21h(42h). Il te permet de déplacer le curseur à partir du début (dans ce cas AL=0), à partir de la position courante du pointeur (AL=1) où à partir de la fin (AL=2). Il faut que BX contienne le handle et que le déplacement soit égal à CXX (en gros un déplacement de 1 donne CX=0 et DX=1). L'avantage de cette fonction c'est qu'elle peux te donner la longueur du fichier. En effet, elle retourne en DX:AX la position actuelle du pointeur. Si tu fais donc un déplacement nul(CX=0,DX=0) à partir de la fin (AL=2), tu auras la taille du fichier. Si ton fichier fait 32 octets, tu auras DX=0 et AX=20h

    Pour avoir une liste complète des interruptions, va sur cette adresse (fichier d'aide windows) et tu répondras certainement à d'autres questions que tu te posais.
    http://www.chez.com/pageasm/docs/dos/int.htm

    Bon courage et n'hésite pas si tu as encore des problèmes
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci, en fait, j'avais déjà utilisé cette fonction, mais je ne vois pas où je peux récuperer le code de mon fichier ouvert. Le top du top serait que je stock les 6 octets suivants dans mon buffer_file, que je l'utilise pour ce que je veux faire, et ensuite que je récupere a nouveau les 6 octets suivants et ainsi de suite... Y a t-il une autre fonction qui récupere dans un buffer directement les octets pointer par le pointeur de fichier ?? Si oui, je ne l'ai pas trouvé... Bon si tu as compris mon charabiat, çe serait cool que tu m'aide une dernière fois. Merci bcp !!

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    euh, effectivement j'ai pas trop compris ton charabiat. Plusieurs questions :
    1)qu'est ce que tu entends par code du fichier ouvert ? le handle ?
    2)Pour lire 6 octets tu fait un 21h(3Fh) avec cx=06h et en déclarant ton buffer_file de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer_file db 6 dup (?)
    Puis tu traites tes données contenu dans le buffer_file puis tu boucles sur 21h(3Fh) et ainsi de suite (tu n'as pas besoin de replacer ton pointeur de fichier)
    3) Pkoi une autre fonction qui permette de récupérer les octets dans un buffer ? c'est la fonction 21h(3Fh), je comprends pas la nuance que tu veux.
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bon, je vais m'expliquer depuis le début:

    Je dois faire un debuggeur (c'est mon projet d'année à la fac), et je dois donc lancer mon debugger de cette manière:

    >c:\xxx\yyy\debug fichieradebugger

    J'ai déjà codé l'ouverture du fichier et maintenant il faut que j'arrive à lire l'integralité du code de mon fichier ouvert pour pouvoir transformer son contenu en commande assembleur ((j'ai vraiment du mal a faire des phrases, je suis un peux crevé, excuse moi )).

    Le simple fait de rappeller 21h(3fh) fait quoi exactement ??
    Sa remplit le buffer avec les octets qui suivent ceux que j'ai déjà mis dans le buffer ??
    Mon code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           mov si, offset HandlFile
    	mov bx, ds:[si]
    	mov ah, 3fh
    	mov cx, 6
    	mov dx, offset BufferOPC
    	int 21h
    Donc, si je fais a nouveau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           mov si, offset HandlFile
    	mov bx, ds:[si]
    	mov ah, 3fh
    	mov cx, 6
    	mov dx, offset BufferOPC
    	int 21h
    J'aurais les 6 octets suivant dans BufferOPC ou non ??
    Si non, comment je fais pour avoir les 6 octets suivant dans BufferOPC ??

    Merci bcp de ton aide, car c'est assez space l'assembleur

    ((tu n'as pas icq ou msn ??))

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    ok donc on suppose que tu travailles 6 octets à la fois. Quand tu lis dans ton fichier les 6 octets avec 21h(3Fh), il incrémente automatiquement le pointeur de fichier de 6. Donc si tu refais une deuxième fois 21h(3Fh), tu lis les 6 octets suivant et ainsi de suite. La seule chose à noter c'est qu'il réécrit toujours au début de ton "BufferOPC", donc si tu as oublié de sauvegarder les données inutilisées qui sont localisées dans "BufferOPC", elles seront perdues(j'espère que je me fais bien comprendre)

    Sinon j'adore programmer en assembleur vu que j'adore ce qui est compliqué . Sinon, je n'ai pas ICQ ou de MSN (je sais même pas ce que c'est). Mais si tu veux mon mail c'est christophe.bonnel@lille.ensam.fr, juste au cas où.

    Bon courage
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Pourquoi ça ne marche pas ??
    Je veux seulement ouvrir un fichier et je n'obtient jamais mon message good, quelqu'un peux m'aider...??
    Ce dode devrait permettre d'ouvrir un fichier en tappant son nom dans la ligne de commande de cette manière:

    >c:\Debug nomfichier

    et le fichier existe, devrait renvoyer good!

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    .model small
    .stack 100h
    .code 
     
    	xor cx, cx                    
    	mov cl, es:[80h]              
    	cmp cl, 0                     
    	jne @ParametreOk              
    	mov ax, @data                 
    	mov ds, ax                    
    	mov dx, offset AucunPara        
    	mov ah, 09h                   
    	int 21h                       
    	jmp @Fin                      
    @ParametreOk:                         
    	mov si, 81h                   
    	mov di, offset Parametre      
    	cld                            
    @RecupPara:                            
    	lodsb                         
    	cmp al, ' '                    
    	jne @AucunEspace             
    	mov al, 0                     
    @AucunEspace:                         
    	stosb                          
    	loop @RecupPara               
    	inc al                        
    	mov al, '$'  ;; ou '0' ???                  
    	stosb                         
     
    ;;;;;;;;
    	mov dx, offset Parametre
    	mov ah, 09h
    	int 21h
    ;;;;;;;;
     
    	mov ax, @data                 
    	mov ds, ax                    
    	mov dx, offset Parametre      
    	mov ah, 3dh                   
    	mov al, 0                     
    	int 21h                       
    	jnc @HandleValide             
    	mov dx, offset ErreurFil      
    	mov ah, 09h                   
    	int 21h                       
    	jmp @Fin                      
    @HandleValide:                        
     
    ;;;;;;;;
    	mov dx, offset good 
    	mov ah, 09h
    	int 21h
    ;;;;;;;;
     
    @Fin:                                 
    	mov ah, 4ch                   
    	int 21h                       
     
    .data
     
    ;;;;;;;;
    	Good DB 'Fichier trouve et ouvert$'
    ;;;;;;;;
     
    	AucunPara DB 'Debug un fichier executable',10,13,10
                                    DB 'Debug [NomFichier]',10,'$'
    	ErreurFil DB 'Fichier ou non de chemin invalide','$'
    	Parametre DB 128 dup (0)
     
    end
    Merci si quelqu'un peux m'aider :o

  10. #10
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    J'ai pas beaucoup de temps pour regarder à ton problème mais en l'essayant j'ai remarqué ceci : Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @RecupPara:                            
       lodsb                          
       cmp al, ' '                    
       jne @AucunEspace              
       mov al, 0
    Il t'affiche comme quoi il n'a pas réussi à ouvrir ton fichier
    maintenant en changeant la dernière ligne, càd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov al,'0'  ; à la place de mov al,0
    Tu vois que cette fois-ci, il n'arrive toujours pas à ouvrir ton fichier qui s'appelle maintenant '0toto.txt'
    Ton problème d'ouverture de fichier vient donc de ce 'mov al,0'. Rappelle-toi que le nom du fichier avec 21h(3dh) doit se finir par 0 : Il cherche donc à ouvrir un fichier vide !!! ça c'est une erreur à corriger

    Deuxième point, un peu en relation avec le premier, n'oublie pas de remplacer le '$' à la fin de ton nom de fichier par un 0, sinon il t'ouvrira un fichier 'tote.txt$' !!! (petite astuce : Au lieu de mettre un '$' à la fin de ton mot, tu mets d'abord 0 puis '$', le 0 sera traduit comme un espace)

    J'espère que ça t'aidera. Bon courage
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci bien, mais en fait, j'ai beau chercher, je n'arrive pas a trouver un code qui marche... De plus, si jamais je tapper un parametre d'une longueur de plus de 9 lettres (c:\Debug azergtyuuuiiiooooooo), la fenetre MSDOS se ferme directement sans le moindre message d'erreur.

    Ce serait trop sympa si tu pouvais m'aider Merci

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    (essaie de decocher la casse "fermer en quittant" des propriété de ton programme)

  13. #13
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Bon, voilà un petit code rapide, pas du tout optimisé et que j'ai dû "légèrement" modifié à cause de mon compilo (TASM) qui n'acceptait pas la formulation de ton code. Maintenant, tu peux le retraduire pour ton compilo sachant que tu risques d'avoir à remettre à jour les DS et ES par ci par là. En tout cas, le code que je te file marche très bien chez moi (il reconnait tous les cas sans exception).
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    code segment
    assume cs:code
    assume ds:data
    assume ss:pile
    debut:
     
       xor cx, cx
       mov cl, es:[80h]
       cmp cl, 0
       jne @ParametreOk
       mov ax, data
       mov ds, ax
       mov dx, offset AucunPara
       mov ah, 09h
       int 21h
       jmp @Fin
    @ParametreOk:
       mov ax,data
       mov es,ax
       mov si, 81h
       mov di, offset Parametre
       cld
    @RecupPara:
       lodsb
       cmp al, ' '
       jnbe @AucunEspace
       cmp al,0Dh    ;  la touche [Enter] vaut en ASCII 0Dh puis 0Ah
       je @fini_de_lire_param
       jmp @RecupPara
    @AucunEspace:
       stosb
       loop @RecupPara
    @fini_de_lire_param:
       xor al,al   ; al = 0
       stosb
       mov al,'$'
       stosb
     
    ;;;;;;;;
       mov ax,data
       mov ds,ax
       mov dx, offset Parametre
       mov ah, 09h
       int 21h
    ;;;;;;;;
     
       mov dx, offset Parametre
       mov ah, 3dh
       mov al, 0
       int 21h
       jnc @HandleValide
       mov dx, offset ErreurFil
       mov ah, 09h
       int 21h
       jmp @Fin
    @HandleValide:
     
    ;;;;;;;;
       mov dx, offset good
       mov ah, 09h
       int 21h
    ;;;;;;;;
     
    @Fin:
       mov ah, 4ch
       int 21h
    code ends
     
    data segment
    ;;;;;;;;
       Good DB 'Fichier trouve et ouvert$'
    ;;;;;;;;
     
       AucunPara DB 'Debug un fichier executable',10,13,10
                                    DB 'Debug [NomFichier]',10,'$'
       ErreurFil DB 'Fichier ou non de chemin invalide','$'
       Parametre DB 128 dup (0)
    data ends
     
    pile segment stack
    remplissage db 256 DUP (?)
    pile ends
     
    end debut
    Bon courage pour la suite ... 8)
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, ça marche nickel

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. Réponses: 2
    Dernier message: 15/04/2004, 15h44
  3. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  4. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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