skotmarud
Messages postés116Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention26 janvier 2008
-
9 juin 2006 à 00:26
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 2014
-
9 juin 2006 à 13:26
bonsoir,
j'ai un probleme pour créer un buffer à taille variable pourtant je suis tombé sur ce post :
http://www.asmfr.com/infomsg_MASM32-COMENT-DECLARER-BUFFET-VARIABLE_706529.aspx mais j'ai rien compris, ça fait que deux semaines que je suis dans l'asm..
j'essai de faire comme ça pour pouvoir par la suite incrémenter ou décrémenter la taille du buffer :
----------------
.data
num dd 5
.data?
buf db num dup(?)
----------------
et a la compile il me dit "constant expected" constante prévue ??
si je fais
buf db addr num dup(?)
là où je l'utilise il me dit "undefined symbol"
symbole non défini !
pouvez vous m'aider s'il vous plait car dans ce cas je ne sais pas comment faire sans aide :-/
merci
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 9 juin 2006 à 09:31
Bonjour,
Je ne pense pas que ce type de déclarations puisse fonctionner pour les raisons suivantes:
La section .data est la section des données initialisées - Qui ont donc des valeurs fixées au lancement du programme.
Pour les données non initialisées, c'est une réservation d'espace qui est faite. Cette réservation est de taille donnée. De toute façon ton type de déclaration reviendrait à la même chose que:
data
num dd 5
.data?
buf db 5 dup(?)
Le seul intérêt de ce que tu veux faire serait d'éviter de modifier dans les deux types de données à chaque fois que tu doives recompiler.
Si la valeur de num est susceptible de varier au cours de l'exécution du programme, celà ne fonctionnera pas. Nota le programme exécutable remplace les adresses (offsets) par des valeurs en "dur". Si tu modifie la taille d'un buffer, tu décalerais les adresses de ce qui suit - il faudrait dans ce cas modifier les adresses en dur de la partie programme - et donc que la section programme soit writable. C'est pas impossible mais dangereux.
Je te conseille plutôt de réserver l'espace pour ton buffer dans la pile. Par exemple
data
num dd 5
code
...
sub esp,num ;réserve 5 dword
...
mov [esp],eax ;met le contenu de eax (par exemple) dans le buffer dont l'adresse est dans esp (vérifier que la valeur de esp pointe toujours bien sur l'emplacement du buffer).
Après utilisation, libérer le buffer
add esp,num
skotmarud
Messages postés116Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention26 janvier 2008 9 juin 2006 à 10:44
Bonjour Nasman
En fait l'intérêt de ce que je veux faire (une sorte de editbox au final) c'est pouvoir faire varier la taille du buffer qui receptionne les entrées clavier en une chaine de caractères affichée avec la fonction TextOut de l'api windows et donc effacer un caractère en decrémentant de 1 le buffer par la touche vk_back ou vk_delete qui serait bien mieux que de remplir le vide avec un espace, parceque même le caractère zero ça affiche un caratère apparemment inconnu !...
je vais creuser ton conseil et merci pour ces explications, je comprends maintenant pourquoi ma méthode ne peut fonctionner!
++
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 9 juin 2006 à 13:06
Rebonjour,
Si tu remplis le buffer avec les caractères saisis et augmente sa taille en conséquence (ou l'inverse) tu sera confronté au problème suivant si tu utilise la pile:
Supposons que les caractères saisis soient "azerty". Ta pile va se remplir à l'envers soit en finale:
y en [esp]
t en [esp+1]
r en [esp+2]
e en [esp+3]
z en [esp+4]
a en [esp+5]
La chaine sera donc enregistrée comme "ytreza" à partir de l'adresse pointée par[esp]. Ce ne sera pas très pratique pour la sortir avec TextOut.
Dans ce cas il te faut décaler tous les octets du buffer (vers les adresses négatives) pour laisser une place vide pour mettre le caractère saisi suivant. - Et tu devras bien gérer tout octet placé sur la pile (avant le buffer - du point de vue des adresses).
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 9 juin 2006 à 13:26
salut,
l'utilisation des fonctions GlobalAlloc et GlobalFree est le seul moyen de generer des buffers variables a conserver en memoire à la sortie de la fonction.