Forum Graph100

Forum Graph100

Vous n'êtes pas identifié.

Annonce

Bonjour et bienvenue sur le nouveau Forum Graph100 !
L'intégralité des données a été transférée sur un forum PunBB et tout les comptes sont fonctionnels avec le même nom d'utilisateur et mot de passe.
Un wiki est aussi disponible avec le même compte ! N'oubliez pas de remettre votre avatar, bon surf !
Pour plus d'informations, consultez ce post.

#1 26 Dec 2004 18:27:57

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Pointeur de pile en assembleur...

voila je me demandais s'il était possible de modifier de pointeur de pile "sp" sans que ca plante...
car voila pour une fonction, je sauvegarde plusieurs valeurs dans la pile avec "push" ...
pour les récupérer j'utilise "pop"...
mais j'ai besoin de rerécupérer ces valeurs, pour cela je repositionne de pointeur "sp" au debut des valeurs sauvés (asm add sp,valeur) puis je réutilise "pop"...

mais voila parfois ca marche, puis parfois, je ne récupère pas les valeurs sauvées...
qq'un a til une explication?
ce pourrait til que le programme déplace mes valeurs sauvegardées pendant sa propre exécution?


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#2 26 Dec 2004 20:05:09

tonton1664
Membre
Lieu: Somme (80)
Date d'inscription: 22 Jul 2002
Messages: 217
Site web

Re: Pointeur de pile en assembleur...

Tu peux utiliser sp comme tu veux si tu n'utilise ni push ni pop entre la sauvegarde et la restauration. Sinon il faut faire attention a ce que la valeur a la fin de la fonction soit identique a celle au début.
Une erreur que tu a pu faire aussi : la pile est stockée a l'envers: les dernieres valeurs sauvegardées ont des adresses plus petites. Donc si tu veux accéder a l'avant derniere valeur sauvegardée (sur 16bits), c'est add sp, 2, sans oublier le sub sp, 2 juste après.
Une autre solution a ton problème c'est d'utiliser le registre bp, qui est prévu pour faire ce genre de choses. Ca s'utilise comme si, di, ou sp

Hors ligne

 

#3 27 Dec 2004 05:21:25

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Pointeur de pile en assembleur...

Oui le plus simple c'est de travailler avec bp: tu lui donnes la valeur de sp au début de ta fonction, et puis tu peux faire des push et pop sans que cela modifie sa valeur (c'est d'ailleurs ce qui se fait automatiquement par le compilo pour gérer les paramètres d'une fonction en C)


Pensez à surveiller mes releases wink

Hors ligne

 

#4 27 Dec 2004 05:24:43

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Re: Pointeur de pile en assembleur...

ahh ok
je vais tester ca...
mais c bizarre qd meme car j'avais fais gaffe a la pile a l'envers, au sauvegarde de 16 bits, et a revenir au meme endroit pour sp qu'au debut


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#5 27 Dec 2004 06:20:37

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Re: Pointeur de pile en assembleur...

oui mais je pensais...
si j'utilise bp, je peux pas me servir de pop et push a l'adresse que j'ai placé dans bp...
la fonction push c bien un truc comme ca :

asm mov ss:[sp],registre
asm sub sp,0x2

et pop le contraire, non?


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#6 27 Dec 2004 08:52:05

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Pointeur de pile en assembleur...

Oui mais si tu utilises bp tu ne dois pas utiliser pop pour acceder au contenu de la pile, tu peux faire mov ax,ss:[bp+2] par exemple... L'avantage c'est que bp est constant donc que les indices que tu rajoutes à bp (2 dans mon exemple) désigneront chacun un élément particulier dans la pile, ce qui n'est pas le cas pour [sp+2] si tu rajoutes des elements dans la pile etc


Pensez à surveiller mes releases wink

Hors ligne

 

#7 27 Dec 2004 09:31:17

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Re: Pointeur de pile en assembleur...

ah d'accord...
je me pose une petite question...
au niveau vitesse, ca ne change rien?

car par exemple, un "lodsw" est plus rapide qu'un
"mov ax,ds:[si]
add si,0x2"

alors un "pop ax" n'est t'il pas plus rapide qu'un
"mov ax,ss:[bp+bx]
add bx,0x2 " ?


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#8 27 Dec 2004 10:27:28

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Pointeur de pile en assembleur...

oui c'est surement plus rapide... mais tout dépend de ce que tu veux faire wink


Pensez à surveiller mes releases wink

Hors ligne

 

#9 27 Dec 2004 11:24:29

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Re: Pointeur de pile en assembleur...

mouarf une fonction rapide...

sinon autre question cela revient au meme de faire :
mov ax,ss:[sp+bp]

c pas plus pratique?


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#10 27 Dec 2004 12:15:10

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Pointeur de pile en assembleur...

euh qu'est-ce qui revient au meme que ca? je te suis plus là lol


Pensez à surveiller mes releases wink

Hors ligne

 

#11 27 Dec 2004 14:55:22

nykosledieu
Team G100
Lieu: Strasbourg
Date d'inscription: 29 Jan 2002
Messages: 3028
Site web

Re: Pointeur de pile en assembleur...

le principe d'une pile c'est pas push rajoute et pop enlève?
dans ce cas la tu peux pas faire pop sur des valeurs ou t'as dja fait pop vu que ya aucune garantie vu qu'elles sont considérées comme enlevés !


Nykosledieu
nykosJEMMERDELESPAM@graph100.com - http://team.graph100.com
Venez sur le chat !!

Hors ligne

 

#12 28 Dec 2004 04:44:06

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Re: Pointeur de pile en assembleur...

oui mais c pas assez rapide...
car pour sauvez une valeur, j'ai besoin de faire pas mal de calculs, donc s'il faut que je les refasse a chaque fois, ca prendrait un max de temps


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#13 28 Dec 2004 08:14:07

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Pointeur de pile en assembleur...

Je comprends pas trop ce que tu veux faire... Si c'est juste pour calculer quelques valeurs que tu réutilises plusieurs fois par la suite, tu peux simplement faire:

Code:

push bp
mov bp,sp
... // calcul de la premiere valeur dans ax
push ax
... // calcul de la seconde valeur dans ax
push ax
... // etc
push ax

// recuperation a tout moment de la 3eme valeur stockee:
mov ax, ss:[bp-6]
// recuperation de la 1ere valeur:
mov ax, ss:[bp-2]

...
// nettoyage de la pile
mov sp,bp
pop bp


Pensez à surveiller mes releases wink

Hors ligne

 

#14 03 Jan 2005 11:57:26

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Re: Pointeur de pile en assembleur...

oué alors j'ai un truc bizarre :
quand je fais "mov bp,sp" une des variables de ma fonction est brusquement modifiée...
je ne comprend pas pourquoi


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#15 03 Jan 2005 13:07:31

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Pointeur de pile en assembleur...

C'est simplement parce que le compilo utilise bp pour accéder aux variables sur la pile... Donc si tu modifies bp les index sont incorrects pour tes variables hmm
Essaie de voir si tu ne sais pas t'en passer (ou la manipuler directement dans la pile) neutral


Pensez à surveiller mes releases wink

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr