ما هي سجلات وحدة المعالجة المركزية التي سيتم استعادتها في نهاية إجراء ASM في دلفي

StackOverflow https://stackoverflow.com/questions/3557500

سؤال

عند كتابة إجراء أو وظيفة Delphi في رمز التجميع ، ما هي السجلات التي يجب حفظها واستعادتها إلى القيمة الأصلية في نهاية الإجراء؟

عند استدعاء إجراءات أو وظيفة أخرى من Delphi من رمز التجميع (المضمّن) ، ما الذي يمكنني توقعه أن تفعل الوظيفة الأخرى مع السجلات؟ ما هي السجلات التي سيتم استعادتها إلى قيمها الأصلية وأيها قد لا؟

(من الواضح أن الإجابة نفسها ستنطبق على كلا السؤالين)

أنا أفترض اتفاقية الاتصال الافتراضية من دلفي. وأنا أعلم ذلك EAX يستخدم لقيم الإرجاع 32 بت. والنظر في رمز ASM في sysutils.pas ، يبدو ذلك EBX, ESI و EDI يتم دفعها واستعادتها ، لكن الآخرين ليسوا كذلك. لا يمكنني العثور على أي وثائق حول هذا الأمر.

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

المحلول

وترد الحجج الثلاثة الأولى للوظيفة في EAX, EDX, ، و ECX, ، على التوالى. يتم دفع الحجج الإضافية على المكدس. لطريقة كائن ، Self المؤشر هو دائما المعلمة (غير مرئية) الأولى. يجب أن تكون النتيجة في EAX. للوظائف التي تعود السلاسل الطويلة ، (غير مرئي) الاخير معلمة الوظيفة هي المؤشر إلى السلسلة الناتجة (والتي هي في حد ذاتها مؤشر إلى الحرف الأول من السلسلة).

EBX يجب ألا يتم تغييرها (ما لم تستعيده قبل نهاية الإجراء/الوظيفة) ، وبالتالي يجب ألا ESP, EBP, ESI, ، أو EDI أيضاً.(1) مقدمة ممتازة لـ Delphi Inline ASM كانت موجودة هنا: http://www.delphi3000.com/articles/article_3766.asp

نصائح أخرى

لا أعرف ما إذا كانت المستندات محدثة ، ولكن يجب أن تلقي نظرة على باستخدام رمز التجميع المضمن (Win32 فقط) في Embarcardero Wiki:

يقتبس:

بشكل عام ، تكون قواعد التسجيل في بيان ASM هي نفسها قوت إجراء أو وظيفة خارجي. يجب أن يحافظ بيان ASM على سجلات EDI و ESI و ESP و EBP و EBX ، ولكن يمكنه تعديل سجلات EAX و ECX و EDX بحرية. عند الدخول إلى عبارة ASM ، يشير EBP إلى إطار المكدس الحالي ويشير ESP إلى الجزء العلوي من المكدس. باستثناء ESP و EBP ، لا يمكن أن يفترض بيان ASM شيئًا عن محتويات التسجيل عند الدخول إلى البيان.

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