p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité de passage
    Homme Profil pro
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Collègien Troisième

    Informations forums :
    Inscription : mars 2011
    Messages : 34
    Points : 4
    Points
    4

    Par défaut Récupérer un nom de variable

    Bonjour tout le monde !

    J'ai écris une fonction qui permet d'écrire du texte en utilisant le même format que les chaines de caractères en C, et j'ai un petit problème .
    Voilà, je voudrais récupérer le nom d'une variable dans une chaine, comme par exemple : "Coucou $nom", où "nom" est le nom d'une variable. Le but de la fonction serait de prendre de remplacer "$nom" par la variable correspondante, et je ne vois vraiment pas comment faire .

    Est-ce que quelqu'un pourrait m'aider ?

  2. #2
    Membre chevronné
    Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    476
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 476
    Points : 627
    Points
    627
    Billets dans le blog
    1

    Par défaut

    affichage direct de la chaine avec mise à jour de chaque $var
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    scanner la chaine
    si $ alors call fonction_identifier_variable
    sinon afficher caractère
    et on recommence tant que la chaine n'est pas finie.
     
    fonction_identifier_variable:
    pointer vers la liste de variable
    identifier la variable en comparant chaque entrée de la liste avec notre $variable
    si pas de variable associée, alors on quitte cette sous fonction en retournant le caractère $ (comme ça, on peu afficher le $)
    si variable associée, on appele la fonction de conversion voulue
    puis on affiche les caractères issus de la conversion
    puis on quitte en retournant le caractère espace (' '), comme ça, on insere un espace à la fin de la variable
    et voilà, maintenant, il y a plus qu'a decomposer en instructions elementaires, puis traduire en assembleur, compiler, et tester.
    au boulot

  3. #3
    Invité de passage
    Homme Profil pro
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Collègien Troisième

    Informations forums :
    Inscription : mars 2011
    Messages : 34
    Points : 4
    Points
    4

    Par défaut

    Merci, mais je ne comprends pas tout à fait ...

    Pour l'instant, j'ai fait ça :

    Code asm : 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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    	mov si, Chaine
    	xor bh, bh
    	mov ah, 0x03
    	int 0x10
    	mov cx, 1
     
    	Write01:
    		mov al, [si]
     
    		cmp al, 5Ch
    		je Write.sslash
     
    		cmp al, 24h
    		je Write.variable
     
    		cmp al, 0
    		je Write.end
     
    		mov ah, 0x02
    		int 0x10
    		mov ah, 0x0A
    		int 0x10
    		inc si
    		inc dl
    		jmp Write01
    	Write.sslash:
    		inc si
    		mov al, si
     
    		cmp al, 30h
    		je Write.null
     
    		cmp al, 6Eh
    		je Write.return
     
    		cmp al, 74h
    		je Write.tab
     
    		cmp al, 5Ch
    		je Write.slash
     
    		cmp al, 24h
    		je Write.dollard
    	Write.null:
    		mov ah, 0x02
    		int 0x10
    		mov ah, 0x0A
    		int 0x10
    		inc si
    		inc dl
    		jmp Write01
    	Write.return:
    		mov al, 13
    		mov ah, 0x02
    		int 0x10
    		mov ah, 0x0A
    		int 0x10
    		inc dl
     
    		mov al, 10
    		mov ah, 0x02
    		int 0x10
    		mov ah, 0x0A
    		int 0x10
    		inc si
    		inc dl
    		jmp Write01
    	Write.tab:
    		mov al, 09h
    		mov ah, 0x02
    		int 0x10
    		mov ah, 0x0A
    		int 0x10
    		inc si
    		inc dl
    		jmp Write01
    	Write.slash:
    		mov ah, 0x02
    		int 0x10
    		mov ah, 0x0A
    		int 0x10
    		inc si
    		inc dl
    		jmp Write01
    	Write.dollard:
    		mov ah, 0x02
    		int 0x10
    		mov ah, 0x0A
    		int 0x10
    		inc si
    		inc dl
    		jmp Write01
    	Write.variable:
    	Write.end:
    		ret

    Je n'ai pas encore optimisé le code ! Il s'agit bien sûr de la syntaxe de Nasm, et mon problème se situe à l'avant-dernière étiquette ("Write.variable"). C'est là que devrait se trouver une procédure pour identifier une variable et afficher son contenu, mais je ne sais pas comment...
    Le programme saute à cette fonction si le caractère lu est "$".
    Sinon, la chaîne de caractères est structurée comme en C. Les caractères spéciaux affichables sont "\0", pour 0, \n, \t, et \$ pour indiquer qu'il ne s'agit pas d'une variable .

    Sinon, pour en revenir à la variable, il n'y aurait pas un moyen de créer un pointeur dans la chaîne et de placer la variable dans le segment .data ?

  4. #4
    Invité de passage
    Homme Profil pro
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Collègien Troisième

    Informations forums :
    Inscription : mars 2011
    Messages : 34
    Points : 4
    Points
    4

    Par défaut

    Ça sera surement plus simple comme ça et avec quelques explications :

    Cette fonction affiche une chaine que l'on place dans SI. Le format des chaines est ressemblant au C, on peut afficher des caractères spéciaux (voir plus haut).

    Le code est destiné à un fonctionnement en mode réel et sous aucune plateforme !
    Fichiers attachés Fichiers attachés

  5. #5
    Membre chevronné
    Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    476
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 476
    Points : 627
    Points
    627
    Billets dans le blog
    1

    Par défaut

    pour commencer, les compilateurs acceptent un caractère ascii en opérande. donc, au lieu d'avoir cmp al,41h, on a cmp al,'A', ce qui est beaucoup plus lisible.

    idem pour $, /, etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cmp al,'/'
    cmp al,'$'
    etc...
    ensuite, pour ce qui est de la détection de variable, il faut passer par une liste de variables associées à des étiquettes, donc, un tableau de variables.

    chaque ligne est une variable
    le premier mot de chaque ligne pouvant être la valeur de notre variable
    le second mot pouvant être un pointeur vers la chaine du nom de la variable.
    la liste ressemblerait donc à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    varlist:
    .size dw @f-$-2 ;taille en octets
    .0 dw 0,.zero
    .1 dw 2011,.year
    .2 dw 7,.mounth
    .3 dw 16,.day
    @@:
    .zero db 'zero',0
    .year db 'year',0
    .mounth db 'mounth',0
    .day db 'day',0
    il suffit juste de parcourir le tableau à la recherche du nom de variable supposé être après $, et le tour est joué, la fonction associée à la variable est lancée, la valeur retournée est affichée en place du nom de variable,
    par exemple, si on à la chaine suivante:
    chaine db 'nous sommes le $day $mounth $year',0le resultat pourra donner
    Nous sommes le 16 juillet 2011
    et comme c'est en assembleur, il faut décomposer en opération élémentaires. je ne peut pas développer ici car il faut quand même pas mal de code pour faire ça de manière universelle et modulable.

    au pire, si j'ai le temps, je ferais un truc basique si tu as pas réussi de toi même. mais c'est assez simple, donc, je me fais pas de soucis pour toi.

  6. #6
    Invité de passage
    Homme Profil pro
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Collègien Troisième

    Informations forums :
    Inscription : mars 2011
    Messages : 34
    Points : 4
    Points
    4

    Par défaut

    Aaaaah, Ok...

    Merci beaucoup !

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

Discussions similaires

  1. récupérer les noms des variables
    Par socrate88 dans le forum C
    Réponses: 4
    Dernier message: 03/06/2011, 10h16
  2. récupérer un nom de variable en chaîne de caractères
    Par Tchef dans le forum Général Python
    Réponses: 5
    Dernier message: 15/02/2011, 08h42
  3. Récupérer un nom de variable passé en argument
    Par supertino7 dans le forum Fonctions
    Réponses: 6
    Dernier message: 14/10/2008, 18h12
  4. variable dynamique:récupérer le nom, pas le contenu
    Par php_de_travers dans le forum PHP & MySQL
    Réponses: 4
    Dernier message: 18/02/2006, 09h13
  5. [try except keyerror] récupérer le nom de la variable
    Par jean-jacques varvenne dans le forum Général Python
    Réponses: 2
    Dernier message: 03/03/2005, 16h59

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