سؤال

لدي وظيفة تجميع بسيطة تم استدعاؤها من برنامج AC ولدي استخدام التعليمات (FIDIV) يحتاج إلى معامل الذاكرة.

هل هي آمنة لتحريك القيمة [esp - 2] واستخدامه في التعليمات التالية أو هو غير آمن أبدا استخدام المكدس بهذه الطريقة؟

أعلم أن هناك العديد من الحلول، وأنا حقا لا أحتاج إلى أن هذا بعد الآن، لذلك الآن مجرد فضول.

هل كانت مفيدة؟

المحلول

باستخدام إزاحة من هذا القبيل سيفضى بالتأكيد البيانات إلى الفساد في أي وقت يحتاج أي إجراء على الموضوع إلى لمس المكدس مرة أخرى. يمكن أن يحدث هذا أثناء المقاطعات، APCs، مفاتيح السياق، استثناءات، إلخ. ما ستحتاج إليه بدلا من ذلك هو حجز مساحة في المكدس وحفظ مؤشر عليه.

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.

بالطبع إذا كنت بحاجة فقط إلى بعض البايتات، فإن تعليمات الدفع أسرع بكثير

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

نصائح أخرى

إنه غير آمن - قد يتم استخدام جزء من المكدس لمفاتيح السياق والمقاطعات وربما أشياء أخرى أن مؤشر ترابطك لديه القليل من أو عدم التحكم في أو السيطرة عليها.

نوعا ما. إنه آمن طالما أنك لا تستدعي وظيفة أخرى، أو (على UNIX) لديك إشارة تسمى. لا يزال، سيكون من السهل للغاية كسر، لذلك لن أفعل ذلك. لا بأس على الرغم من طرحها فقط من ESP أولا، ثم استخدم هذه المساحة.

أنت لا يجب أن تقلق بشأن المقاطعات أو مفاتيح السياق؛ الحادثة في كومة النواة. إذا تمكنت من فوضى تلك الموجودة عن طريق تغيير المكدس، فستكون تافهة لتحطم النواة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top