Adresse memoire d'une constante??

Adresse memoire d'une constante?? - C++ - Programmation

Marsh Posté le 20-03-2006 à 19:22:21    

salut tout le monde bon voila je voudrai savoir l'adresse d'une constante pendant l'exécution du programme.
par exemple on prend un programme en pascal, après sa compilation et pendant son exécution si on veux avoir l'adresse d'une variable du programme je crois que c'est faisable avec un pointeur mais si je vous dis l'adresse d'une constante ??
sinon pour les constantes comment ça ce passe ? (je m'explique)
si on prend l'exemple suivant:
 
program essai;
const S=12;
var X:integer;
 
begin
S:=S+1; {je sais que pour les variables on va chercher son adresse mémoire et faire le calcule}
{mais si j'ai ça}
S:=X;{d'où la valeur de X est elle chercher?}
.....
 
merci pour vos réponses ;)

Reply

Marsh Posté le 20-03-2006 à 19:22:21   

Reply

Marsh Posté le 20-03-2006 à 22:20:18    

pareil que pour toute autre variable.

Reply

Marsh Posté le 20-03-2006 à 22:46:44    

non si tu met un pointeur sur une constante ça te déclenche une erreur

Reply

Marsh Posté le 20-03-2006 à 22:58:01    

montre le code

Reply

Marsh Posté le 20-03-2006 à 23:02:26    

non si tu fait par exemple en pascal  
 
program essai;  
type ptr:^integer;
const S=12;  
var X:integer;  
pointeur: ptr;
 
begin  
pointeur:=addr(S); {ça te met erreur a la compilation}  
end.
 
donc comme ça me fait erreur je voudrais savoir la représentation de la mémoire pendant l'exécution du programme, comme ça je pourrai peut être passé à l'action ;)

Reply

Marsh Posté le 20-03-2006 à 23:30:47    

ouai mais ici c'est la catégorie C++, pas pascal

Reply

Marsh Posté le 20-03-2006 à 23:55:53    

je sais mais je cherche une représentation de la mémoire pendant l'exécution même si c'est en C ça pourrai m'aider

Reply

Marsh Posté le 21-03-2006 à 00:05:42    


c'est quoi l'erreur, et comment tu fais en pascal pour déclarer un pointeur sur un truc constant ?


Message édité par skelter le 21-03-2006 à 00:06:06
Reply

Marsh Posté le 21-03-2006 à 00:44:49    

justement j'arrive pas lors de la compilation il me met erreur comme quoi impossible de pointé une constante mais moi je cherche a connaître comment les constantes sont gérer pendant l'exécution pour essayer de les atteindre tu voit .
merci encore.

Reply

Marsh Posté le 21-03-2006 à 00:57:31    

ça fait trop longtemps que j ai pas fait de pascal, alors au pif:
 
type ptr:^integer;
const S=12;  
var X:integer;  
pointeur: ptr;
 
begin  
X:=S;
pointeur:=addr(X);
end.

Reply

Marsh Posté le 21-03-2006 à 00:57:31   

Reply

Marsh Posté le 21-03-2006 à 02:40:11    

Ha ouais, j ai vu un sujet dans la rubrique pascal, dans lequel tu explique que tu cherches à modifier une constante. On t a répondu que c était impossible, ils avaient tord, c est tout à fait possible:
 
Quand tu déclare une constante, elle n est pas stockée avec les autres données, elle est stockée dans le segment de code, à chaque fois que tu l utilise. Pour la repérer, tu y mets une valeur bidon, tu compile et tu scan le fichier executable en binaire pour repérer tous les endroits où se trouve la constante.
 
Comme la plupart des OS interdisent l écriture dans un segment de code, c est plus facile de changer toutes les copies de la constante avant d executer le programme.
 
Si tu as besoin de changer la constante au cours de l execution, tu doit d abord hacker ton système d exploitation (c est plus facile avec linux, il y a les sources) pour lui faire accepter d écrire dans le segment de code. Ensuite tu construit un fichier texte avec les adresses relative des constante, en vue de charger le fichier au cours de l execution du programme pour changer la constante.
 
Quand ton programme est terminé et compilé, tu remplis le fichier texte avec les adresse relatives que tu trouve dans le fichier binaire. Ça aide d avoir le code assembleur de la compilation, un désassembleur et un debogueur, surtout que quand par exemple tu additionne deux constantes, le compilo stoque en fait le résultat de l addition.
 
Voilà, tu est prêt pour changer toutes les constantes de ton programme d un seul coup, quand tu en as besoin.
 
Si tu cherche une solution plus simple, comme avoir un pointeur sur la constante, c est possible dans certains langages mais le compilateur refusera que tu change la valeur puisque tu l a déclaré constante.
 
Tu peut à la rigueur hacker le compilateur, mais bien que l adresse retournée soit dans le segment de données, le compilateur a tout de même recopié cette valeur partout où tu l a utilisé puisque tu lui avait dit que c était une constante. Il faudrait dans ce cas que tu hacke le compilo pour qu il  traite les constantes comme les autres variables.
 
Le plus simple finalement reste à dire au compilteur que c est pas une constante comme ça il ne la recopie pas partout, il la stocke dans le segment de donnée uniquement et tu peut la changer.
 
Bon, c est vrai que les compilos ils sont pas très futés de recopier les constantes partout, mais si tu regarde la définition du mot <<constant>>, ça peut se comprendre.
 
Les hackers font tout ça souvent, le cas le plus répandu étant les cheat codes dans les jeux, que tu peut repérer en examinant le fichier executable avec un éditeur binaire ou un desassembleur.
 
Pour augmenter le nombre de vies dans un jeu, tu le désassemble et tu recherche tous les nombres <<3>> (s il y a 3 vies au départ) et tu le change à 255, tu recommence jusqu à ce que tu tombe sur les bonnes constantes.
 
Ça prends beaucoup de temps le hacking, alors j ai arrêté, mais c est très marrant, et puis ça permet d aller à la fin des jeux quand tu rames, de débloquer des logiciels, ou de tester des trucs auquels les développeurs n avaient pas pensé.
 
:D

Reply

Marsh Posté le 21-03-2006 à 14:19:20    

comme ça, ça va l'occuper il fera pas de bêtises pendant ce temps là.
 
(par contre recopier les contantes partout, ça peut être futé)

Reply

Marsh Posté le 21-03-2006 à 14:50:57    

> (par contre recopier les contantes partout, ça peut être futé)
c était ironique, bien sûr.

Reply

Marsh Posté le 21-03-2006 à 21:37:09    

oula oula oula salut nargy merci pour ces explications bien détaillées je te serai reconnaissant même si ça m'a l'air un peu dure à réaliser :) en faite c'est l'idée que j'avais derrière la tête mais j'arrivais pas à trouver.
merci encore pour tout (surtout nargy ;))

Reply

Marsh Posté le 21-03-2006 à 22:14:22    

quand on spécifie une variable const, ca veut dire qu'on ne peut pas la modifier, apres comme on l'a dit depuis le début c'est comme une autre variable
 
nargy > tu es sur de ce que tu dis (source ?)
l'endroit ou est stocké une variable dépend de sa classe de stockage, une variable automatique constante sera sur la pile

Reply

Marsh Posté le 21-03-2006 à 22:27:42    

bin je pense qu'il fait allusion au fait la constante se retrouvera surtout en opérande immédiate dans les instructions l'utilisant...

Reply

Marsh Posté le 21-03-2006 à 22:29:47    

oui je pense que c'est ça

Reply

Marsh Posté le 21-03-2006 à 22:31:27    

peut etre dans le cas d'une constante litterale n'apparaissant que dans une instruction, elle sera sans doute inserée dans le code, mais la il me semblais qu'on parlais de variables spécifiées const (code du premier post)

Reply

Marsh Posté le 21-03-2006 à 22:36:33    

ça dépends du compilo, souvent il y a les deux, en opérande à des intstructions ASM, et dans la pile.
Quand tu fait:
const int a=10;
print(a+5);
 
le compilo/assembleur, il traduit par:
print(15);
et ta constante à disparue (les codes hexa des instructions sont bidons):
asm:
 push 15   : 45 0F
 call print  : 88 EF 65

Reply

Marsh Posté le 21-03-2006 à 22:45:14    

je ne pige pas le but de ce topic [:el g]

Reply

Marsh Posté le 21-03-2006 à 23:29:43    

chrisbk a écrit :

je ne pige pas le but de ce topic [:el g]

C'est un topic blague [:dawa]

Reply

Marsh Posté le 22-03-2006 à 00:32:45    

chrisbk a écrit :

je ne pige pas le but de ce topic [:el g]


angeljack21 cherche a consommer autant de cachet d'aspirine que devant le SDK de 3DSMax :D

Reply

Marsh Posté le 22-03-2006 à 00:54:43    

Concours de celui qui lance le topic le plus hilarant, résultat le 1er avril :D
 
angeljack21 est en tête, avec une bonne longueur d avance.

Reply

Marsh Posté le 22-03-2006 à 09:27:11    

mdr nargy :D bin oui ça à l'air hilarant mais bon merci pour tout a vous tous ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed