Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Homme Profil pro Noah Perreau
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Nom : Homme Noah Perreau
    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
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 623
    Points
    623

    Par défaut

    affichage direct de la chaine avec mise à jour de chaque $var
    Code :
    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 Noah Perreau
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Nom : Homme Noah Perreau
    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 :
    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 Noah Perreau
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Nom : Homme Noah Perreau
    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
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 623
    Points
    623

    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 :
    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 :
    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 Noah Perreau
    Collègien Troisième
    Inscrit en
    mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Nom : Homme Noah Perreau
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •