Comment je peu avoir l'adresse de début mémoire de mon programme en cour d'execution ?
(pas avec un debuggeur car je doit l'utilisé dans ce même programme et donc la mettre dans une variable)
Comment je peu avoir l'adresse de début mémoire de mon programme en cour d'execution ?
(pas avec un debuggeur car je doit l'utilisé dans ce même programme et donc la mettre dans une variable)
La ou tu te trouve, c'est :
Et quand tu charge un .com (et peut-etre un .exe, j'en suis pas sur),c'est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2cs:ip
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cs:100h
POUR UN .com il utilise une seule segment
pour un exe il utilise plus d'une segent . avant son chargement il y a un plage de 256 octs "j'ai oblier son non" cette plage contient l'adresse de début du programme, pour avoir son adresse , il y a une fonction de int 21 qui vs la donne
J'utilise de assembleur dans du C++ et dans mes options du lieur j'ai "base de l'image" qui est a 0x00400000, ça correspond bien mais je me demande si ce serra toujours vrai.
j'ai lu que CS n'existe pas dans Win98, j'ai bien compris ?
Merci a tous.
Salut,
Pour CS (comme pour tous les registres de srgment (DS,ES...)
En Windows 16 bits il existe pas de pbm.
En 32 bits il existe mais il est "caché" par l'OS qui utilise le flat model des micropro a base de 386.
En flat model (4 go : 2 pour le systeme, 2 pour ton appli) il n'y a plus de segmentation (c'est l'equivalent d'un .com en mode reel)
Gib, je ne crois pas qu'ils soient en train de parler de prog Win, mais pour ce qui est de "base de l'image", ce n'est pas l'adresse de Base du Code. C'est l'adresse de Base de l'Application. Pour avoir l'Adresse de Base du Code, en Assembleur, c'est la chose la plus simple du monde, puisqu'il suffit de définir un Label en début de Code et de charger l'Adresse. En C, je ne sais pas. Je pense qu'il est plus simple de demander au malade mental qui a ecrit le C que tu utilises (Mais bon, demander quelque chose en C sur un Forum Asm, ce n'est pas très raisonable non plus )
Bye, Betov.
Mon application est une appli windows32 en C++, ecrire de l'assembleur dans le code est tres simple, je post dans ce forum car j'attend bien une solution en assembleur
Dans ce cas, il faut:
1) s'assurer que ton damned C sort bien tes routines dans l'ordre dans lequel tu les ecrits -les Routines Asm particuliérement-. C'est simple, tu fais une Routine Bidon avec deux ou trois NOP en debut de Source, et tu regarde avec un desassembleur si tes trois NOPs sont bien au début.
2) Si c'est bon... tu remplaces tes NOPs par n'importe quoi qui te retourne l'adresse de la Routine Asm. Pour être 100% sûr de la valeur tu fais un
pour bien aligner sur le début de la section (au cas où).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mov eax This_Routine_Label and eax 0_FFFF_F000
Tu peux ensuite verifier facilement que ta valeur est bonne en passant ton executable à la moulinette d'un truc comme PeView (qui te montre les Sections). Ta valeur devrait apparaître en tant que RVA de la section Code (simple RVA -sans la Linker default value (400000) dont tu parlait au debut).
Betov.
Bien, merci
Pour info j'utilise C++Builder3 et il poke l'assembleur sans le modifié a l'endroi où je le déclare
Si tu en es content, c'est le principal
Dans ce cas, il te suffit de faire quelque chose comme ça:
>StartOfCode:
> mov eax StartOfCode
> ret
Si il te fais des misères avec les évocations directes de labels, c'est un peu plus compliqué, il faut faire un CALL a l'interieur, vers un POP EAX // PUSH EAX // RET (qui te retourne l'adresse de retour du CALL dans EAX).
Betov.
PS. Faut vraiment avoir envie de s'****** (censored), plutôt que d'apprendre à programmer.
Partager