Question

J'ai une fonction de montage simple appelé à partir d'un programme de c et je dois utiliser une instruction (FIDIV) qui a besoin d'un opérande mémoire.

Est-il sûr de déplacer la valeur à [esp - 2] et l'utiliser dans l'instruction suivante ou est-il jamais sûr d'utiliser la pile de cette façon?

Je sais qu'il ya beaucoup de solutions de contournement, et j'ai vraiment pas besoin de ça plus, alors maintenant il est juste la curiosité.

Était-ce utile?

La solution

En utilisant un décalage comme qui certainement exposer les données à la corruption tout moment toute action sur le fil doit toucher à nouveau la pile. Cela peut se produire pendant les interruptions, APC, changements de contexte, exceptions, etc. Qu'est-ce que vous voulez faire est plutôt fait de réserver un espace sur la pile et enregistrer un pointeur vers elle.

sub esp, 4        ; Allways move it 4 byte increments. x64 may need 8 bytes
mov eax, esp      ; EAX points to your 4 byte buffer
add esp, 4        ; Restore allocation.

Bien sûr, si vous avez seulement besoin de quelques octets, l'instruction push est beaucoup plus rapide

push eax
mov  eax, esp     ; EAX points to a buffer properly alligned to system 

Autres conseils

Il est pas sûr - cette partie de la pile peut être utilisée pour les changements de contexte, les interruptions et éventuellement d'autres choses que votre fil a peu ou pas knowlege ou contrôle sur

.

Trier de. Il est sûr aussi longtemps que vous ne l'appelez pas une autre fonction, ou (sous Unix) ont un signal s'appelle. Pourtant, il serait extrêmement facile à briser, donc je ne le ferais pas. Il est normal que soustraire seulement de esp d'abord, puis utilisez cet espace.

ne pas à vous soucier des interruptions ou les changements de contexte; ceux qui se produisent sur la pile du noyau. Si vous pourrait gâcher les par changer la pile, il serait trivial de planter le noyau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top