Vous n'êtes pas identifié.
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?
Hors ligne
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
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)
Hors ligne
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
Hors ligne
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?
Hors ligne
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
Hors ligne
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 " ?
Hors ligne
oui c'est surement plus rapide... mais tout dépend de ce que tu veux faire
Hors ligne
mouarf une fonction rapide...
sinon autre question cela revient au meme de faire :
mov ax,ss:[sp+bp]
c pas plus pratique?
Hors ligne
euh qu'est-ce qui revient au meme que ca? je te suis plus là lol
Hors ligne
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 !
Hors ligne
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
Hors ligne
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:
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
Hors ligne
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
Hors ligne
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
Essaie de voir si tu ne sais pas t'en passer (ou la manipuler directement dans la pile)
Hors ligne