[LMC1] TD4 - EX1

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

[LMC1] TD4 - EX1

Message  hepta_seven7 le Lun 28 Juil 2014, 01:14

Voici le bout de code avec le quel j'ai commencé qui me permettait de savoir comment comment ouvrir un fichier en écriture seul. (que je ne sais toujours pas  Wink )
D'après les note de cours quand on met "eax, 5" cela permet d'ouvrir ou créer un fichier.
Donc voici ma question: comment savoir si le fichier a été ouvert ou créé (est-ce avec ecx que je pourrais déterminer cela*?)
Et dans quel cas l'ouverture échoue?


Code:

global main
section .rodata
 nomFichier DD 'brol', 0
section .text
main:
 mov eax, 5
 mov ebx, nomFichier
 mov ecx, 1q | 2000q
 int 0x80



Voici l'énoncé:
Td4 - ex1 a écrit:Ex. 1
Soit un fichier dont le nom est stocké dans une variable. Ecrivez
un programme qui :
— tente d’ouvrir le fichier en écriture seule ;
— si l’ouverture échoue :
— affiche à l’écran le message :
échec lors de l’ouverture du fichier

— passe a la ligne ;
— retourne le code d’erreur 1 ;
— si l’ouverture réussit :
— affiche a l’écran le message :
fichier ouvert avec succès
— passe a la ligne ;
— ferme le fichier ;
— retourne la valeur 0 pour indiquer un dénouement correct.

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  nvs le Lun 28 Juil 2014, 12:54

hepta_seven7 a écrit:
[...] comment savoir si le fichier a été ouvert ou créé (est-ce avec ecx que je pourrais déterminer cela*?)

voici quelques pistes tirées du texte du td04 et du manuel.

lmi-td04 a écrit:
2.2 Mise en œuvre

Sous GNU/Linux, un appel système se fait en quatre étapes :
1. mettre le numéro du service désiré dans eax ;
2. mettre les paramètres, s’il y en a, dans ebx, ecx et edx, dans cet ordre-là ;
3. appeler le système par l’instruction int 0x80 ;
4. consulter la valeur de retour dans eax, s’il y en a une et si nécessaire.

lmi-td04 (milieu de page 9) a écrit:
La valeur retournée par open est un petit entier positif si l’ouverture ou la
création du fichier s’est bien passée. Cet entier porte le nom de descripteur de
fichier. C’est par son biais qu’on peut ensuite accéder, écrire, lire ou fermer un
fichier ouvert. Il s’agit donc de ne pas égarer cette information. Si l’ouverture
échoue, un entier négatif est retourné.

man 2 open a écrit:
[...]
VALEUR RENVOYÉE
      open(), openat() et creat() renvoient le nouveau descripteur de fichier
      s'ils  réussissent,  ou -1 s'ils échouent, auquel cas errno contient le
      code d'erreur.
[...]

hepta_seven7 a écrit:Et dans quel cas l'ouverture échoue?
s'il n'existe pas, si tu n'as pas le droit d'y accéder, etc.




 Exclamation 

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  hepta_seven7 le Lun 28 Juil 2014, 15:34

Merci beaucoup

c'est cette information que j'avais zappé.
nvs a écrit:4. consulter la valeur de retour dans eax, s’il y en a une et si nécessaire.
 Surprised 

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  hepta_seven7 le Mar 29 Juil 2014, 02:35

Comment je peux "retourne la valeur 0 pour indiquer un dénouement correct" et "retourne le code d’erreur 1" ?

Code:
global main
section .rodata
  nomFichier   DB   'test', 0
  msg1      DB   `fichier ouvert avec succès\n`
  lgrMsg1   DD   lgrMsg1 - msg1 
  msg2      DB   `échec lors de l’ouverture du fichier\n`
  lgrMsg2   DD   lgrMsg2 - msg2
section .text
main:
  mov eax, 5
  mov ebx, nomFichier
  mov ecx, 2000q | 1q
  int 0x80
 
  or eax, eax
  js _echec
 
  mov eax, 4
  mov ebx, 1
  mov ecx, msg1
  mov edx, [lgrMsg1]   ;affiche a l’ ́ecran msg1 & passe a la ligne
  int 0x80
  mov eax, 6      ;ferme le fichier
  int 0x80
  jmp _fin

_echec:
  mov eax, 4
  mov ebx, 1
  mov ecx, msg2
  mov edx, [lgrMsg2]
  int 0x80      ;affiche a l’ ́ecran msg2 & passe a la ligne

_fin:
  mov eax, 1
  mov ebx, 0
  int 0x80

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  nvs le Mar 29 Juil 2014, 13:01

hepta_seven7 a écrit:Comment je peux "retourne la valeur 0 pour indiquer un dénouement correct" et "retourne le code d’erreur 1" ?

lmi-td04 (p. 6 -- 8 ) a écrit:
2.4.1 exit

Pour le service exit, il faut lancer la commande :
Code:
man 2 exit
[...]
Pour connaître la signification de l’argument, il faut lire la DESCRIPTION.
Dans le cas présent, il s’agit d’une valeur retournée au processus parent. Il est
convenu de retourner 0 quand un processus se termine sans problème. Pour
récupérer dans le shell la valeur retournée par un processus, il faut consulter la
variable ? après la mort du processus :
Code:
echo $?
[...]




 Idea 

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  hepta_seven7 le Mar 29 Juil 2014, 16:01

Voici mon code final:

Pourriez-vous me dire si j'ai bien respecté l'énoncé et les éventuelles erreurs, svp?

Code:
Code:
global main
section .rodata
  nomFichier  DB  'test', 0
  msg1      DB  `fichier ouvert avec succès\n`
  lgrMsg1  DD  lgrMsg1 - msg1 
  msg2      DB  `échec lors de l’ouverture du fichier\n`
  lgrMsg2  DD  lgrMsg2 - msg2
section .text

main:
  mov eax, 5  ; ouvrir fichier
  mov ebx, nomFichier  ; chemin du fichier en question
  mov ecx, 2000q | 1q  ; indicateur WRONLY | APPEND
  int 0x80  ; intteruption et voir consulter valeur eax: si nbr négatif alor echec, si positif alors succé
 
  or eax, eax  ; operation afin d'obtenir information du eflags sur eax
  js _echec  ; si eax negatif alors SF=1 alors jump au label _echec, si eax positif alors SF=0
 
  mov eax, 4  ; ecriture
  mov ebx, 1  ; stdout pour afficher à l'écran
  mov ecx, msg1  ; chemin du texte à afficher
  mov edx, [lgrMsg1]  ; information sur le nbr de caractere du texte
  int 0x80  ; interruption et consulter valeur eax: si eax= -1 en cas d'erreur
  mov eax, 6      ; fermeture du fichier:
  int 0x80  ; interruption et consulter valeur eax: si eax=0 alors c'est ok, si eax=1 alors il y a une erreur
  mov eax, 1  ; exit
  mov ebx, 0  ; retourne la valeur 0 pour indiquer un d ́enouement correct
  jmp _fin  ; jump au label _fin

_echec:
  mov eax, 4  ; ecriture
  mov ebx, 1  ; stdout pour afficher à l'écran
  mov ecx, msg2  ; chemin du texte à afficher
  mov edx, [lgrMsg2]  ; information sur le nbr de caractere du texte
  int 0x80  ; interruption et consulter valeur eax: si eax=0 alors c'est ok, si eax=1 alors il y a une erreur
  mov eax, 1  ; exit
  mov ebx, 1  ; retourne le code d’erreur 1
 
_fin:
  int 0x80  ; interruption utilisation de echo $? afin d'afficher la valeur retourner qui est celle de ebx

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  nvs le Mer 30 Juil 2014, 20:05

ce que je vois en lisant le début de ton code :

  • pas besoin d'append à l'ouverture du fichier ;
  • si l'ouverture réussit, tu écrases le file descriptor avec la valeur 4 (appel système write) ;
  • le fichier que tu fermes n'est pas le bon (stdout)




 monkey 


Dernière édition par nvs le Jeu 31 Juil 2014, 03:04, édité 1 fois (Raison : conjugaison...)

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  hepta_seven7 le Mer 30 Juil 2014, 23:45


  • je retirerais 2000q donc le append


  • je pense qu'il est n'est pas utile de garder le file descriptor vu que avant l’écriture j'utilise un si-sinon avec un "js" à partir de ce moment je commence un nouveau code afin de faire afficher les msg1 et msg2. A moins qu'il y est une autre façon de faire que je n'ai pas connaissance;) 


  • je n'ai pas compris Question

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  nvs le Jeu 31 Juil 2014, 03:05

si tu ne gardes pas le file descriptor, comment indiquer quel fichier fermer ?



 pig 

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  hepta_seven7 le Jeu 31 Juil 2014, 12:35

C'est vrai, donc le 2éme point et le troisième sont liés. Il se peut qu'une grande parti du code soit faux, pourtant il s’exécute comme demandé. Comment puis-je régler ce problème? Pourriez-vous me donner un corrigé de la zone à risque de mon code Rolling Eyes

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  nvs le Dim 03 Aoû 2014, 15:47

après avoir tenté d'ouvrir le fichier, tu sauvegardes eax (le file descriptor ou un négatif si problème) dans une variable ou, mieux, dans un registre non utilisé :
Code:
mov esi, eax    ; attention : ne pas modifier esi ensuite sans sauvegarde préalable
puis tu vérifies que eax n'est pas négatif (ça tu fait déjà) et tout le traitement qui s'en suit (ça tu fais déjà).
enfin, si et quand vient le moment de fermer le fichier (qui a bien été ouvert), tu mets le file descriptor dans ebx :
Code:
mov ebx, esi    ; esi contient la sauvegarde du file descriptor





 cherry 

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  mvh le Dim 03 Aoû 2014, 22:10

nvs a écrit:après avoir tenté d'ouvrir le fichier, tu sauvegardes eax (le file descriptor ou un négatif si problème) dans une variable ou, mieux, dans un registre non utilisé :
Code:
mov esi, eax    ; attention : ne pas modifier esi ensuite sans sauvegarde préalable
puis tu vérifies que eax n'est pas négatif (ça tu fait déjà) et tout le traitement qui s'en suit (ça tu fais déjà).
enfin, si et quand vient le moment de fermer le fichier (qui a bien été ouvert), tu mets le file descriptor dans ebx :
Code:
mov ebx, esi    ; esi contient la sauvegarde du file descriptor

 cherry 
[petite question naïve en passant]
n'est-ce pas un peu cavalier que de (conseiller de) stocker une information qui peut avoir une durée vie assez longue dans un registre de pointage ... ici un index ... d'usage fort pratique et répandu dans les habitudes assèmiques de bon aloi ...  ?

Je n'ose point imaginer le foutoir que ce genre d'habitudes pourrait occasionner ... pour celui qui se propose de coder des projets quelque peu ambitieux comme on peut l'espérer de tout informaticien bien burné formé à l'assembleur de l'extrême  cheers 
ou me trompe je ... ?

[/petite question naïve en passant]

_________________

La fête c'est nul sans Kidibul !
... (vieux proverbe local)



mvh

Nombre de messages : 5973
Age : 104
Prénom : Marcel VANHAELEN
Statut : (fin de bail)
Win 3.1 à reprendre
Localisation : Koekeliek de Baselberg
Date d'inscription : 06/12/2006

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  nvs le Lun 04 Aoû 2014, 02:05

dans le contexte du td04, mon conseil tient la route. rome ne s'est pas faite en un jour.








 What a Face 

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  mvh le Lun 04 Aoû 2014, 10:10

nvs a écrit:dans le contexte du td04, mon conseil tient la route. rome ne s'est pas faite en un jour.

 What a Face 
... je m'en doutait bien un peu ... c'est un peu comme qui dirait ... le td04 synd'rome ... Cool

_________________

La fête c'est nul sans Kidibul !
... (vieux proverbe local)



mvh

Nombre de messages : 5973
Age : 104
Prénom : Marcel VANHAELEN
Statut : (fin de bail)
Win 3.1 à reprendre
Localisation : Koekeliek de Baselberg
Date d'inscription : 06/12/2006

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  hepta_seven7 le Lun 04 Aoû 2014, 19:34

Pourriez-vous me dire si j'ai bien suivi vos instructions concernant la fermeture du fichier?


global main
section .rodata
nomFichier DB 'test', 0
msg1 DB `fichier ouvert avec succès\n`
lgrMsg1 DD lgrMsg1 - msg1
msg2 DB `échec lors de l’ouverture du fichier\n`
lgrMsg2 DD lgrMsg2 - msg2
section .text

main:
mov eax, 5 ; ouvrir fichier
mov ebx, nomFichier ; chemin du fichier en question
mov ecx, 1q ; indicateur WRONLY | APPEND
int 0x80 ; intteruption et voir consulter valeur eax: si nbr négatif alor echec, si positif alors succé
mov esi, eax
or eax, eax ; operation afin d'obtenir information du eflags sur eax
js _echec ; si eax negatif alors SF=1 alors jump au label _echec, si eax positif alors SF=0

mov eax, 4 ; ecriture
mov ebx, 1 ; stdout pour afficher à l'écran
mov ecx, msg1 ; chemin du texte à afficher
mov edx, [lgrMsg1] ; information sur le nbr de caractere du texte
int 0x80 ; interruption et consulter valeur eax: si eax= -1 en cas d'erreur
mov eax, 6 ; fermeture du fichier:
mov ebx, esi
int 0x80 ; interruption et consulter valeur eax: si eax=0 alors c'est ok, si eax=1 alors il y a une erreur
mov eax, 1 ; exit
mov ebx, 0 ; retourne la valeur 0 pour indiquer un d ́enouement correct
jmp _fin ; jump au label _fin

_echec:
mov eax, 4 ; ecriture
mov ebx, 1 ; stdout pour afficher à l'écran
mov ecx, msg2 ; chemin du texte à afficher
mov edx, [lgrMsg2] ; information sur le nbr de caractere du texte
int 0x80 ; interruption et consulter valeur eax: si eax=0 alors c'est ok, si eax=1 alors il y a une erreur
mov eax, 1 ; exit
mov ebx, 1 ; retourne le code d’erreur 1

_fin:
int 0x80 ; interruption utilisation de echo $? afin d'afficher la valeur retourner qui est celle de ebx

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  hepta_seven7 le Mer 06 Aoû 2014, 23:57

Donc c'est bien ça  Question 

hepta_seven7

Nombre de messages : 12
Prénom : azddin
Date d'inscription : 15/05/2014

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  nvs le Jeu 07 Aoû 2014, 14:30

oui.





 affraid 

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LMC1] TD4 - EX1

Message  Contenu sponsorisé Aujourd'hui à 14:33


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