Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/07/2011, 21h49   #1
nono17pero
Candidat au titre de Membre du Club
 
Homme Noah Perreau
Collègien Troisième
Inscription : 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 : 11
Points : 11
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 ?
nono17pero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 00h24   #2
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
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
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 23h07   #3
nono17pero
Candidat au titre de Membre du Club
 
Homme Noah Perreau
Collègien Troisième
Inscription : 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 : 11
Points : 11
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 ?
nono17pero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 23h31   #4
nono17pero
Candidat au titre de Membre du Club
 
Homme Noah Perreau
Collègien Troisième
Inscription : 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 : 11
Points : 11
Ç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
Type de fichier : asm Write.asm (1 010 octets, 1 affichages)
nono17pero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2011, 04h26   #5
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
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
Citation:
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.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2011, 23h22   #6
nono17pero
Candidat au titre de Membre du Club
 
Homme Noah Perreau
Collègien Troisième
Inscription : 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 : 11
Points : 11
Aaaaah, Ok...

Merci beaucoup !
nono17pero est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h52.


 
 
 
 
Partenaires

Hébergement Web