fichier

Voir le sujet précédent Voir le sujet suivant Aller en bas

fichier

Message  G30578 le Mer 30 Avr 2008, 18:27

Code:

global main

extern printw

section .data
fichA      db      'A',0
fichB      db      'B',0

section .bss
buf      resb      100
buflen      resd      1
fdA      resw      1
fdB      resw      1

section .text

main:
   ;ouvrir le fichier B en le créant
   
   mov eax, 5
   mov ebx, fichB
   mov ecx, 001000000b
   or ecx, 001b
   mov edx, 110110110b
   int 0x80
   mov [fdB], eax

   push eax
   call printw ; La, fdB ne vaut pas encore zero
   

   ;ouvrir le fichier A

   mov eax, 5
   mov ebx, fichA
   mov ecx, 0000b
   int 0x80
   mov [fdA], eax
   
   push word[fdB] ;C'est juste à ce momment précis que fdB vaut 0
   call printw

   ;lire le fichier A

   mov eax, 3
   mov ebx, [fdA]
   mov ecx, buf
   mov edx, 100
   int 0x80
   mov [buflen], eax

   ;ecrire dans B

   mov eax, 4
   mov ebx, [fdB]
   mov ecx, buf
   mov edx, [buflen]
   int 0x80

   ;fermer les deux fichiers

   mov eax, 6
   mov ebx, [fdA]
   int 0x80

   mov eax, 6
   mov ebx, [fdB]
   int 0x80

   ; fin

   mov eax, 1
   mov ebx, 0
   int 0x80

Etant donné un fichier A existant, cette procédure est censée copier tout simplement les caracètes du fichier A dans un fichier B que je crée.
Mais au lieu de ca, elle affiche les caractères lus à l'écran.
Grace à la procédure printw fournie par les professeurs, je remarque que le fdB (file descriptor de B) se met à zero au momment de l'initialisation du fdA (file descriptor de A).
En se mettant à zero, le programme devrait essayer d'écrire dans stdin, ce qui est impossible et apparemment il écrit dans stdout.
J'aimenrais comprnedre pourquoi mon fdB se modifie alors que je n'y ai pas touché.
Merci de m'aider car je ne m'en sort pas.

G30578

Nombre de messages : 5
Prénom : Alain
Date d'inscription : 15/10/2007

Revenir en haut Aller en bas

Re: fichier

Message  Wilbur le Mer 30 Avr 2008, 18:48

Code:
push eax
call printw ; La, fdB ne vaut pas encore zero
c'est peut-être lié, mais tu mets un doubleword sur la pile, alors que printw ne nettoie qu'un word...il reste donc des "crasses" sur la pile...

Wilbur

Nombre de messages : 46
Age : 27
Prénom : Romain
Statut : Etudiant 2ème Réseaux
Date d'inscription : 20/02/2008

Revenir en haut Aller en bas

merci

Message  G30578 le Mer 30 Avr 2008, 19:03

Eh bien merci beaucoup pour ta réponse wilbur diskdur !
C'est effectivement lié car en modifiant la variable fdA (qui était un word) avec eax (qui est un dword), j'ai modifié fdB qui se trouvait juste à coté de fdA dans la mémoire.
Merci infiniment

G30578

Nombre de messages : 5
Prénom : Alain
Date d'inscription : 15/10/2007

Revenir en haut Aller en bas

Re: fichier

Message  Wark le Mer 30 Avr 2008, 19:37

On en découvre des choses ... Je viens de comprendre comment fonctionnait l'appel Read et celui Write (précisément).

Sauf à un détail près ... A quoi sert edx dans le cas d'un Read vu que cette variable n'est jamais réutilisée (du moins dans un programme du genre monCat dans le td3).

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: fichier

Message  Wilbur le Mer 30 Avr 2008, 20:55

Le registre edx, dans le cas de l'appel système 'read', indique le nombre d'octets que tu vas lire...

Code:
  mov eax, 3
  mov ebx, [fdA]
  mov ecx, buf
  mov edx, 100
  int 0x80

Dans ce cas-ci, la lecture s'effectue dans le fichier de fdA, lit 100 octets ou moins s'il n'y pas les 100 octets, et les stocke dans buf...
Remarque la ligne de code qui suit:

Code:
  mov [buflen], eax

Read renvoie le nombre d'octets lus après l'appel système dans EAX. Si ce nombre est inférieur à celui que tu as mis dans EDX, tu peux donc en conclure que tu es arrivé à la fin du fichier.


G30578 a écrit:Eh bien merci beaucoup pour ta réponse wilbur diskdur !
C'est effectivement lié car en modifiant la variable fdA (qui était un word) avec eax (qui est un dword), j'ai modifié fdB qui se trouvait juste à coté de fdA dans la mémoire.
Merci infiniment

Mais de rien Wink

Au plaisir.

Wilbur

Nombre de messages : 46
Age : 27
Prénom : Romain
Statut : Etudiant 2ème Réseaux
Date d'inscription : 20/02/2008

Revenir en haut Aller en bas

Re: fichier

Message  Wark le Mer 30 Avr 2008, 20:58

Merci pour cette conclusion. Very Happy

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: fichier

Message  Wilbur le Jeu 01 Mai 2008, 10:58

Pour une fois que je peux aider quelqu'un en assembler...

Razz

Wilbur

Nombre de messages : 46
Age : 27
Prénom : Romain
Statut : Etudiant 2ème Réseaux
Date d'inscription : 20/02/2008

Revenir en haut Aller en bas

Re: fichier

Message  Contenu sponsorisé Aujourd'hui à 18:55


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum