[Asm x86] Tableau de chaines de caractère
Fermé
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
19 sept. 2005 à 00:29
Profil bloqué - 6 nov. 2008 à 22:06
Profil bloqué - 6 nov. 2008 à 22:06
A voir également:
- [Asm x86] Tableau de chaines de caractère
- Tableau croisé dynamique - Guide
- Caractère ascii - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Caractère spéciaux mac clavier - Guide
7 réponses
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 653
19 sept. 2005 à 09:14
19 sept. 2005 à 09:14
Habituellement on fait comme ça:
1 chaîne de caractères = 1 zone mémoire réservée (malloc).
Donc un tableau de chaînes de caractères est donc un tableau de pointeurs, chaque pointeur poitant sur le début de chaque chaîne de caractères.
Donc:
Faire un malloc pour chaque chaîne de caractère, et stocker chaque pointeur retouré dans ton tableau (ta zone mémoire contenant la liste des pointeurs, que tu peux également allouer.)
1 chaîne de caractères = 1 zone mémoire réservée (malloc).
Donc un tableau de chaînes de caractères est donc un tableau de pointeurs, chaque pointeur poitant sur le début de chaque chaîne de caractères.
Donc:
Faire un malloc pour chaque chaîne de caractère, et stocker chaque pointeur retouré dans ton tableau (ta zone mémoire contenant la liste des pointeurs, que tu peux également allouer.)
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 653
19 sept. 2005 à 09:15
19 sept. 2005 à 09:15
Note qu'il existe plusieurs façons de gérer les chaînes de caractères:
- à la façon MS-Dos (chaînes terminées par le signe $)
- à la C (chaînes terminées par code ASCII 0)
- à la Pascal (chaîne préfixée par la taille de la chaîne)
Tout dépend de ce que tu va faire de tes chaînes.
Si c'est pour les afficher avec l'interruption 21, il faut les terminer avec le signe dollar (c'est ce qu'attend le MS-Dos).
- à la façon MS-Dos (chaînes terminées par le signe $)
- à la C (chaînes terminées par code ASCII 0)
- à la Pascal (chaîne préfixée par la taille de la chaîne)
Tout dépend de ce que tu va faire de tes chaînes.
Si c'est pour les afficher avec l'interruption 21, il faut les terminer avec le signe dollar (c'est ce qu'attend le MS-Dos).
soumpro@hotmail.com
bonjour
je suis débutante en assembleur et je dois programmer une application qui lit une chaine de caractères (ex: 'A la claire fontaine, ...$') puis l'affiche en pyramide comme suit:
A
l
a c
lair
e fon
taine,
...xxx
je connais la lecture et l'affichage mais comme ça?!!!
Si vous pouvez utiliser les piles ou autre choses en assembleur, s'il vous plait n'hésitez pas , SVP aidez moi
beriocha82@hotmail.com
bonjour
je suis débutante en assembleur et je dois programmer une application qui lit une chaine de caractères (ex: 'A la claire fontaine, ...$') puis l'affiche en pyramide comme suit:
A
l
a c
lair
e fon
taine,
...xxx
je connais la lecture et l'affichage mais comme ça?!!!
Si vous pouvez utiliser les piles ou autre choses en assembleur, s'il vous plait n'hésitez pas , SVP aidez moi
beriocha82@hotmail.com
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 526
19 sept. 2005 à 13:01
19 sept. 2005 à 13:01
Merci pour ta réponse.
Donc c'est bien comme ça que je pensais faire.
A savoir créer plusieurs pointeurs vers des chaines précises.
Puis créer un tableau qui contient ces pointeurs.
Le soucis c'est que je ne sais pas comment allouer de la mémoire en asm à partir d'un pointeur. Et je ne sais pas non plus comment créer un tableau.
Par contre avec l'exemple que j'ai mis dans mon premier message, on peut créer directement une chaine de caractère (donc je suppose que la memoire est allouée à la volée pour cette chaine, et que l'adresse de la chaine est transmise au nom de la chaine).
A priori, je doit utiliser des chaines se terminant par '\0' comme en c.
J'utilise nasm sous Linux, en fait je t'explique plus en détail:
Je fais un appel système vers le kernel (int 80h). Et précisément un appel qui produit l'equivalent de exerve() en c.
http://www.lxhp.in-berlin.de/lhpsysc1.html#execve
Par exemple j'essaie de lancer le lecteur mplayer:
Et j'ai aucun soucis, mplayer se lance.
Le soucis c'est de lui passer un argument.
Dans le registre ecx, je dois passer un pointeur vers une liste de pointeurs se référant aux arguments du programme. Et c'est donc là que ça coince. Apparement, le pointeur doit faire référence à un tableau de pointeurs (si j'ai bien compris, le dernier pointeur de la liste doit être 0), et ces chaines de caractères doivent être formattées comme en c (terminés par '\0').
Donc c'est bien comme ça que je pensais faire.
A savoir créer plusieurs pointeurs vers des chaines précises.
Puis créer un tableau qui contient ces pointeurs.
Le soucis c'est que je ne sais pas comment allouer de la mémoire en asm à partir d'un pointeur. Et je ne sais pas non plus comment créer un tableau.
Par contre avec l'exemple que j'ai mis dans mon premier message, on peut créer directement une chaine de caractère (donc je suppose que la memoire est allouée à la volée pour cette chaine, et que l'adresse de la chaine est transmise au nom de la chaine).
A priori, je doit utiliser des chaines se terminant par '\0' comme en c.
J'utilise nasm sous Linux, en fait je t'explique plus en détail:
Je fais un appel système vers le kernel (int 80h). Et précisément un appel qui produit l'equivalent de exerve() en c.
http://www.lxhp.in-berlin.de/lhpsysc1.html#execve
Par exemple j'essaie de lancer le lecteur mplayer:
segment .data commande db "/usr/local/bin/mplayer",0 segment .text global _start _start: mov ebx, dword commande ; ebx pointe vers commande mov eax, 11 ; execve() mov ecx, 0 ; Pointeur vers les arguments (ne pointe sur rien) mov edx, 0 ; Ne sais pas quoi mettre... int 80h ; appel du kernel mov eax,1 ; exit() mov ebx,0 ; exit(0) int 80h ; appel du kernel
Et j'ai aucun soucis, mplayer se lance.
Le soucis c'est de lui passer un argument.
Dans le registre ecx, je dois passer un pointeur vers une liste de pointeurs se référant aux arguments du programme. Et c'est donc là que ça coince. Apparement, le pointeur doit faire référence à un tableau de pointeurs (si j'ai bien compris, le dernier pointeur de la liste doit être 0), et ces chaines de caractères doivent être formattées comme en c (terminés par '\0').
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 653
19 sept. 2005 à 13:14
19 sept. 2005 à 13:14
Le soucis c'est que je ne sais pas comment allouer de la mémoire en asm à partir d'un pointeur.
Sous MC-Dos, c'est une interruption à appeller, mais je ne me rappelle plus laquelle.
Sous Windows ou Linux, je ne connais pas les API.
Un tableau, techniquement, c'est juste une zone mémoire.
C'est à toi de piocher à la bonne adresse dedans en fonction de la taille de tes éléments stockés dans ce tableau.
(Adresse d'un élément du tableau = Adresse de début de la zone mémoire + Numéro de l'élément * Taille d'un élément.)
Dans le registre ecx, je dois passer un pointeur vers une liste de pointeurs se référant aux arguments du programme.
Je n'ai jamais fait d'assembleur sous Linux, mais je suppose que l'API attend un tableau de pointeurs.
Donc: allouer une zone mémoire (voir malloc) et placer dans cette zone mémoire un tableau de pointeurs vers des chaînes.
(Mais c'est une supposition)
Sous MC-Dos, c'est une interruption à appeller, mais je ne me rappelle plus laquelle.
Sous Windows ou Linux, je ne connais pas les API.
Un tableau, techniquement, c'est juste une zone mémoire.
C'est à toi de piocher à la bonne adresse dedans en fonction de la taille de tes éléments stockés dans ce tableau.
(Adresse d'un élément du tableau = Adresse de début de la zone mémoire + Numéro de l'élément * Taille d'un élément.)
Dans le registre ecx, je dois passer un pointeur vers une liste de pointeurs se référant aux arguments du programme.
Je n'ai jamais fait d'assembleur sous Linux, mais je suppose que l'API attend un tableau de pointeurs.
Donc: allouer une zone mémoire (voir malloc) et placer dans cette zone mémoire un tableau de pointeurs vers des chaînes.
(Mais c'est une supposition)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 526
19 sept. 2005 à 13:35
19 sept. 2005 à 13:35
Ok.
Ca tombe bien je vais pouvoir essayer, j'ai trouvé comment déclarer une sorte de malloc avec nasm:
http://nasm.sourceforge.net/doc/html/nasmdoc3.html#section-3.2.2
J'essaie ça bientôt. Merci.
Ca tombe bien je vais pouvoir essayer, j'ai trouvé comment déclarer une sorte de malloc avec nasm:
http://nasm.sourceforge.net/doc/html/nasmdoc3.html#section-3.2.2
J'essaie ça bientôt. Merci.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 526
20 sept. 2005 à 01:46
20 sept. 2005 à 01:46
Bon, les problèmes virevoltent dans tous les sens.
Je flanche devant une armée de "segmentation fault". Même le C devient reposant à côté...
Bon je m'y remettrai dans quelques temps, avec un bouquin plutôt....
Merci quand même....
Je flanche devant une armée de "segmentation fault". Même le C devient reposant à côté...
Bon je m'y remettrai dans quelques temps, avec un bouquin plutôt....
Merci quand même....
JE SUIS DEBTANTE DS LE MONDE INFOS JE VEUX SAVOIR TS CMT PROGRAMMER EN C OU ASSEMBLEUR G VEUX DES PROB ALGORITMIQUE SUR LES CARACTERE /CHAINE DE CAR CONDITION D'ARRET AIDEZ MOI SVP JE SAIS PLUS QOI FAIRE
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 526
6 nov. 2008 à 11:01
6 nov. 2008 à 11:01
Roh tu viens de me rappeller plein de souvenirs en faisant remonter cette discussion, mes premiers pas en assembleur :-)
Allez hop, un cours sur le C https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c
Et la faq assembleur: http://www.commentcamarche.net/faq/69 assembleur
Allez hop, un cours sur le C https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c
Et la faq assembleur: http://www.commentcamarche.net/faq/69 assembleur
Profil bloqué
>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
6 nov. 2008 à 22:06
6 nov. 2008 à 22:06
MERCI BCP AU MOIN JAI TROUVE QQ1 KI M'AIDE DES LE MATIN JE CHERCHE DE L'AIDE MAIS EN VAIN J'ESPERE QUE SES DEUX SITE SOIENT TRES RICHE SURTT L'ASSEMBLEUR