2017-07-22 1 views
0

j'ai un tampon de base alloué à mon programme:assemblage masm x86 ne déréférencement * uniquement * retourner la valeur étant stockée à une adresse donnée

.DATA? 
buffer DWORD 01FFFh DUP(?) 
.CODE 
MOV ESI, OFFSET buffer 

Je veux obtenir l'adresse de deux valeurs dans le tampon , et les pousser sur la pile pour une référence future:

LEA EAX, [ESI + 04h * 00h] 
LEA EBX, [ESI + 04h * 0Ah] 
PUSH EAX 
PUSH EBX 

et je veux plus tard appeler une procédure qui prend une adresse de départ et une adresse de fin en tant que paramètres, avec ESP et ESP + 04h comme les paramètres.

PUSH [ESP] ;ESP contains the end address 
PUSH [ESP + 08h] ;ESP + 08h contains the start address 
CALL myProc 

Cependant, je ne suis pas sûr si elle finirait par pousser la valeur trouvée à l'adresse trouvée à l'adresse ESP et la valeur trouvée à l'adresse trouvée à l'adresse ESP + 04h, ou si elle se contentait de pousser l'adresse trouvée à ESP, et l'adresse trouvée à ESP + 04h à cause du déréférencement.

Pour ma situation, je dois être en mesure de «pousser à nouveau» l'adresse trouvée sur ESP, et l'adresse trouvée à ESP + 04h sur la pile.

Pour résumer, est-ce qu'un déréférencement seulement renvoie la valeur stockée à l'adresse donnée, même si la 'valeur' ​​est une autre adresse?

Merci

+3

BTW, après premier 'push [esp]' esp est ajusté pour accueillir la nouvelle valeur poussée, de sorte que '[esp + 4]' dans l'instruction suivante pointe vers l'original '[esp]' du premier ' pousser ». C'est la raison pour laquelle souvent le 'ebp' est initialisé dans le prologue de la procédure pour être un pointeur" stackframe ":' mov ebp, esp' et ensuite le '[ebp + 4]' dans un autre code ciblera toujours la même mémoire de pile , même si vous faites d'autres 'push/pop' (aussi longtemps que vous ne modifiez pas' ebp'). Si vous insistez sur l'utilisation de 'esp', vous devez ajuster dynamiquement les décalages après chaque changement' esp', c'est-à-dire: 'push [esp]' 'push [esp + 8]' – Ped7g

+0

Oui, je me suis rendu compte qu'en regardant mon code il y a quelque temps, puisque pousser quelque chose de nouveau changerait aussi ce que l'ESP pointe vers! On dirait que je devrais probablement changer la même chose dans mon exemple de code ci-dessus aussi. Merci pour le rappel –

Répondre

3

LEA charge la "adresse effective". Donc vous poussez deux adresses.

Pour obtenir des données de ces adresses et les pousser, vous pouvez faire quelque chose comme:

 MOV  EAX,[ESP] 
     MOV  EDX,[ESP + 4] 
     MOV  EAX,[EAX] 
     MOV  EDX,[EDX] 
     PUSH EDX 
     PUSH EAX 
     CALL SomeProc 

Ce que vous faites ne faites pas ce que vous voulez:

 PUSH [ESP] 

va simplement pousser la valeur (l'adresse) en haut de la pile, en d'autres termes, il duplique simplement l'adresse. Il ne fait pas double indirection, c'est-à-dire qu'il n'obtiendra pas le contenu de l'adresse, ce qui est apparemment ce que vous voulez.