سؤال

في لغة التجميع إذا كان لنا أن استخدام

mov eax, dword ptr[ebx]

فإن ذلك يعني نسخ قيمة وأشار من قبل ebx (ebx يحتوي على عنوان قيمة غير القيمة الفعلية ، هذه التعليمات نسخ القيمة الفعلية في العنوان)?

إذا كان لنا أن استخدام

mov eax, dword ptr[some_variable]

فإن ذلك يعني نسخ قيمة المتغير "some_variable" نفسها eax, لا نسخ قيمة وأشار من قبل متغير "some_variable"?

هل فهمي صحيح ؟

إذا كان الجواب نعم ، أنا في حيرة لماذا نفس الجمعية التعليمات مختلفين meansings - في الحالة الأولى هناك مستوى من المراوغة ، ولكن في الثانية لا يوجد إضافية مستوى المراوغة.

أي تعليق ؟

تحرير:

ليس كل [] لا تأخذ أي تأثير ، على سبيل المثال ، تعليمات xchg سوف يستغرق مستوى في الاتجاه الذي يحمل قيمة وأشار خلال edx.

كامل شفرة المصدر يمكن العثور عليها ،

http://www.codeproject.com/KB/threads/spinlocks.aspx

#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* targetAddress, int nValue)
{
    __asm {
        mov edx, dword ptr [pTargetAddress]
        mov eax, nValue
        lock xchg eax, dword ptr [edx]
    }
}
#endif // WIN32
هل كانت مفيدة؟

المحلول

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

معالجات x86 لا تدعم dual مستوى المراوغة ، لذلك ليس من الممكن أن طلب تحميل قيمة من العنوان المحدد في مكان ما في الذاكرة لديك لتحميل العنوان على التسجيل.

في إطار عدد من المجمعات (MASM و بنيت في VC++ المجمع على سبيل المثال) يمكن أن تكتب فقط

mov eax, dword ptr some_variable

بدون أقواس يعني نفسه.

يمكن أن تكتب

move eax, dword ptr [variable][ebx]

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

في كل هذه الحالات المعالج سوف تفعل الشيء نفسه - تحميل قيمة من العنوان المحدد.انها واحدة مستوى المراوغة في كل مرة.

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