Flux rss
Rechercher : dans
Par :

[Asm x86] Tableau de chaines de caractère

kilian, le lundi 19 septembre 2005 à 00:29:44 
 Signaler ce message aux modérateurs

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 :-)
Configuration: Debian etch
Nasm

1

sebsauvage, le lundi 19 septembre 2005 à 09:14:26
  • +1

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.)

Répondre à sebsauvage

2

sebsauvage, le lundi 19 septembre 2005 à 09:15:50
  • +1

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).

Répondre à sebsauvage

7

beriocha, le vendredi 25 mai 2007 à 21:48:27

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

Répondre à beriocha

3

kilian, le lundi 19 septembre 2005 à 13:01:45
  • +1

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').

Répondre à kilian

4

sebsauvage, le lundi 19 septembre 2005 à 13:14:28
  • +2

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)

Répondre à sebsauvage

5

kilian, le lundi 19 septembre 2005 à 13:35:23
  • +1

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.

Répondre à kilian

6

kilian, le mardi 20 septembre 2005 à 01:46:18
  • +1

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....

Répondre à kilian

8

foufou.hadile@gmail.com, le jeudi 6 novembre 2008 à 10:38:21

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

Répondre à foufou.hadile@gmail.com

9

kilian, le jeudi 6 novembre 2008 à 11:01:14

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 http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-progra­mmer-en-c.html
Et la faq assembleur: http://www.commentcamarche.net/faq/69 assembleur Le gâteau est un mensonge!

Répondre à kilian

10

 foufou.hadile@gmail.com, le jeudi 6 novembre 2008 à 22:06:49

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

Répondre à foufou.hadile@gmail.com
Tableau des caracteres speciaux Bonjour, Avec windows dans l'outils systeme on a automatiquement le tableau des caracteres speciaux, mais la il n'y est plus et dans aucune sessions,... Si quelqu'un aurais une idée sur ou il pourrait être.. Ou comment le telecharger.. Merci. www.commentcamarche.net/forum/affich-7828378-tableau-des-caracteres-speciaux
[VBA Excel] pbm chaine caracteres (Résolu) bonjour, j'ai un petit souci avec mon application Excel. Je dois creer une chaine de caracteres s2 dont le nbe de caracteres depend du nbe de caracteres de la chaine s1. Comme je ne sais pas si c'est tres clair je prefere donner un exemple: le nbe de... www.commentcamarche.net/forum/affich-3106832-vba-excel-pbm-chaine-caracteres
Vb6 et acces : chaine caractère Voici mon code : rs.Open "select info_titre from T_infos where titre = '" & Form1.Text1.Caption & "'", db, adOpenStatic, adLockOptimistic Le problème c'est que lorsqu'il y a un " ' " (apostrophe dans la chaine de caractères, il me met une erreur et ce... www.commentcamarche.net/forum/affich-499079-vb6-et-acces-chaine-caractere
[CCM] Utiliser des caractères spéciauxVous pouvez utiliser des caractères spéciaux dans vos messages sur les forums de CCM. Vous pouvez: Soit utiliser la table de caractères Windows (charmap.exe) et copier-coller les caractères dans le message. Soit utiliser les entités... www.commentcamarche.net/faq/sujet-4552-ccm-utiliser-des-caracteres-speciaux
Parcourir une chaine caractére par caractéreBonjour, j'ai une question a posé : j'ai une chaine de caractére et je souhaite de voir une fonction (code php) qui permet de parcourir une chaine caractére par caractére et quand elle arrive a un blanc ou séparateur récupére le mot. svp de... www.commentcamarche.net/forum/affich-11895595-parcourir-une-chaine-caractere-par-caractere
Tableau de chaines de caracteres sur MATLAB (Résolu)Bonjour à tous, j'essaye en vain d'ouvrir un fichier de chaines de caractères sur MATLAB et de le stocker dans un tableau de chaines de caracteres... quelqu'un aurait une petite idée? Merci d'avance! Freedom is the freedom to say that 2+2 make 4. If... www.commentcamarche.net/forum/affich-7215465-tableau-de-chaines-de-caracteres-sur-matlab
[c] parser de chaîne de caractères (Résolu)Bonjour, Je débute en c et je rencontre ma première difficulté qui m'empêche pour le moment de terminer mon projet... J'ai une chaine de caractère "char maChaine[200]" qui contient une phrase... Je dois récupérer chaque mot dans un tableau, sans tenir... www.commentcamarche.net/forum/affich-2529477-c-parser-de-chaine-de-caracteres
VBScript - Les fonctions de chaînes de caractèresLes fonctions de chaînes de caractères Fonction Description Filter(InputStrings, Value[, Include[, Compare]]) Sélectionne des chaînes de caractères parmi un tableau de chaînes... www.commentcamarche.net/contents/vbscript/vbs-fonctions-chaines-caracteres.php3
Les chaînes de caractères en C++Qu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une... www.commentcamarche.net/contents/cpp/cppstring.php3
Langage C - Les chaînes de caractèresQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne... www.commentcamarche.net/contents/c/cstring.php3