[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
Bonsoir,

J'ai un petit soucis avec nasm (ou plutôt avec l'asm tout court vu que je débute).
Avec nasm je vois comment déclarer une variable, exemple avec une chaine de caractère nommée hello:
segment .data
      hello  db  "Hello world !" , 0

Et pour qu'un registre y fasse référence plus tard, ça va aussi:
mov eax, dword hello

Donc là eax pointe vers hello.

Mon soucis c'est que j'aimerais déclarer un tableau de chaines de caractères comme en c:
char *tableau[100]

Et là je ne vois pas du tout comment faire ça avec nasm.... J'aurais besoin de vos lumières, merci d'avance :-)

7 réponses

sebsauvage
Messages postés
32844
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 649
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
sebsauvage
Messages postés
32844
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 649
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).
0
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
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
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:
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').
0
sebsauvage
Messages postés
32844
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 649
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)
0

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 523
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.
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
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....
0
Profil bloqué
6 nov. 2008 à 10:38
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
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
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
0
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
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
0